From 193c6ca05d94b1e226451e39629f6f90797370f7 Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Mon, 10 Feb 2025 22:48:39 +0100 Subject: [PATCH] Update expectations + fix bugs founds by fuzzers. I would like fuzzers to find bug: https://github.com/ArthurSonzogni/FTXUI/issues/998 Unfortunately the fuzzer is already finding bugs in Dropdown. Fix them before proceeding with the first idea. Bug:https://github.com/ArthurSonzogni/FTXUI/issues/998 --- CHANGELOG.md | 1 + cmake/ftxui_set_options.cmake | 4 --- cmake/ftxui_test.cmake | 1 + src/ftxui/component/dropdown.cpp | 6 +++- src/ftxui/component/dropdown_test.cpp | 34 ++++++++++++++++++++++ src/ftxui/component/slider_test.cpp | 42 +++++++++++++-------------- 6 files changed, 62 insertions(+), 26 deletions(-) create mode 100644 src/ftxui/component/dropdown_test.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index fbe57ae2..603d5a56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ current (development) See #932 - Feature: Add `SliderOption::on_change`. This allows to set a callback when the slider value changes. See #938. +- Bugfix: Handle `Dropdown` with no entries. ### Dom - Feature: Add `hscroll_indicator`. It display an horizontal indicator diff --git a/cmake/ftxui_set_options.cmake b/cmake/ftxui_set_options.cmake index 6e5a8e00..185739e4 100644 --- a/cmake/ftxui_set_options.cmake +++ b/cmake/ftxui_set_options.cmake @@ -83,10 +83,6 @@ function(ftxui_set_options library) target_compile_options(${library} PRIVATE "-Wpedantic") target_compile_options(${library} PRIVATE "-Wshadow") target_compile_options(${library} PRIVATE "-Wunused") - - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - target_compile_options(${library} PRIVATE "-Wuseless-cast") - endif() endif() endif() diff --git a/cmake/ftxui_test.cmake b/cmake/ftxui_test.cmake index 56b21bd9..7ff1b2d7 100644 --- a/cmake/ftxui_test.cmake +++ b/cmake/ftxui_test.cmake @@ -13,6 +13,7 @@ add_executable(ftxui-tests src/ftxui/component/component_test.cpp src/ftxui/component/component_test.cpp src/ftxui/component/container_test.cpp + src/ftxui/component/dropdown_test.cpp src/ftxui/component/hoverable_test.cpp src/ftxui/component/input_test.cpp src/ftxui/component/menu_test.cpp diff --git a/src/ftxui/component/dropdown.cpp b/src/ftxui/component/dropdown.cpp index b268dd9f..690a6e2d 100644 --- a/src/ftxui/component/dropdown.cpp +++ b/src/ftxui/component/dropdown.cpp @@ -47,7 +47,11 @@ Component Dropdown(DropdownOption option) { Element Render() override { radiobox.selected = util::clamp(radiobox.selected(), 0, int(radiobox.entries.size()) - 1); - title_ = radiobox.entries[selected_()]; + selected_ = util::clamp(selected_(), 0, int(radiobox.entries.size()) - 1); + + if (selected_() >= 0) { + title_ = radiobox.entries[selected_()]; + } return transform(*open_, checkbox_->Render(), radiobox_->Render()); } diff --git a/src/ftxui/component/dropdown_test.cpp b/src/ftxui/component/dropdown_test.cpp new file mode 100644 index 00000000..44434d12 --- /dev/null +++ b/src/ftxui/component/dropdown_test.cpp @@ -0,0 +1,34 @@ +// Copyright 2025 Arthur Sonzogni. All rights reserved. +// Use of this source code is governed by the MIT license that can be found in +// the LICENSE file. + +#include "ftxui/component/component.hpp" // for Horizontal, Vertical, Button, Tab +#include "ftxui/component/component_base.hpp" // for ComponentBase, Component +#include "ftxui/component/event.hpp" // for Event, Event::Tab, Event::TabReverse, Event::ArrowDown, Event::ArrowLeft, Event::ArrowRight, Event::ArrowUp +#include "gtest/gtest.h" // for AssertionResult, Message, TestPartResult, EXPECT_EQ, EXPECT_FALSE, Test, EXPECT_TRUE, TEST + +namespace ftxui { + +TEST(DropdownTest, Empty) { + std::vector list = {}; + int index = 0; + auto dropdown = Dropdown(list, &index); + + dropdown->OnEvent(Event::Return); + + auto screen = Screen(8, 8); + auto document = dropdown->Render(); + Render(screen, document); + + EXPECT_EQ(screen.ToString(), + "╭──────╮\r\n" + "│↓ │\r\n" + "├──────┤\r\n" + "│ │\r\n" + "│ │\r\n" + "│ │\r\n" + "│ │\r\n" + "╰──────╯"); +} + +} // namespace ftxui diff --git a/src/ftxui/component/slider_test.cpp b/src/ftxui/component/slider_test.cpp index 21b96569..c8cd0652 100644 --- a/src/ftxui/component/slider_test.cpp +++ b/src/ftxui/component/slider_test.cpp @@ -60,17 +60,17 @@ TEST(SliderTest, Right) { EXPECT_EQ(value, 50); EXPECT_EQ(updated, 0); EXPECT_TRUE(slider->OnEvent(MousePressed(3, 0))); - EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 0); + EXPECT_EQ(value, 30); + EXPECT_EQ(updated, 1); EXPECT_TRUE(slider->OnEvent(MousePressed(9, 0))); EXPECT_EQ(value, 90); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(9, 2))); EXPECT_EQ(value, 90); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(5, 2))); EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 2); + EXPECT_EQ(updated, 3); EXPECT_TRUE(slider->OnEvent(MouseReleased(5, 2))); EXPECT_FALSE(slider->OnEvent(MousePressed(5, 2))); EXPECT_EQ(value, 50); @@ -92,17 +92,17 @@ TEST(SliderTest, Left) { EXPECT_EQ(value, 50); EXPECT_EQ(updated, 0); EXPECT_TRUE(slider->OnEvent(MousePressed(3, 0))); - EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 0); + EXPECT_EQ(value, 70); + EXPECT_EQ(updated, 1); EXPECT_TRUE(slider->OnEvent(MousePressed(9, 0))); EXPECT_EQ(value, 10); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(9, 2))); EXPECT_EQ(value, 10); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(5, 2))); EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 2); + EXPECT_EQ(updated, 3); EXPECT_TRUE(slider->OnEvent(MouseReleased(5, 2))); EXPECT_FALSE(slider->OnEvent(MousePressed(5, 2))); EXPECT_EQ(value, 50); @@ -124,21 +124,21 @@ TEST(SliderTest, Down) { EXPECT_EQ(value, 50); EXPECT_EQ(updated, 0); EXPECT_TRUE(slider->OnEvent(MousePressed(0, 3))); - EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 0); + EXPECT_EQ(value, 30); + EXPECT_EQ(updated, 1); EXPECT_TRUE(slider->OnEvent(MousePressed(0, 9))); EXPECT_EQ(value, 90); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(2, 9))); EXPECT_EQ(value, 90); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(2, 5))); EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 2); + EXPECT_EQ(updated, 3); EXPECT_TRUE(slider->OnEvent(MouseReleased(2, 5))); EXPECT_FALSE(slider->OnEvent(MousePressed(2, 5))); EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 2); + EXPECT_EQ(updated, 3); } TEST(SliderTest, Up) { @@ -157,17 +157,17 @@ TEST(SliderTest, Up) { EXPECT_EQ(value, 50); EXPECT_EQ(updated, 0); EXPECT_TRUE(slider->OnEvent(MousePressed(0, 3))); - EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 0); + EXPECT_EQ(value, 70); + EXPECT_EQ(updated, 1); EXPECT_TRUE(slider->OnEvent(MousePressed(0, 9))); EXPECT_EQ(value, 10); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(2, 9))); EXPECT_EQ(value, 10); - EXPECT_EQ(updated, 1); + EXPECT_EQ(updated, 2); EXPECT_TRUE(slider->OnEvent(MousePressed(2, 5))); EXPECT_EQ(value, 50); - EXPECT_EQ(updated, 2); + EXPECT_EQ(updated, 3); EXPECT_TRUE(slider->OnEvent(MouseReleased(2, 5))); EXPECT_FALSE(slider->OnEvent(MousePressed(2, 5))); EXPECT_EQ(value, 50);