diff --git a/.github/workflows/ci_mac.yml b/.github/workflows/ci_mac.yml index de71691a18..c2bc63c4ab 100644 --- a/.github/workflows/ci_mac.yml +++ b/.github/workflows/ci_mac.yml @@ -232,7 +232,7 @@ jobs: # used by std::vector<>::insert(). export ASAN_OPTIONS='fast_unwind_on_malloc=0 detect_container_overflow=0' # Exclude tests that are currently known to fail - wx_tests_selection='~[.] ~[valnum] ~wxPersistTLW ~wxPersistDVC ~wxTopLevel::Show ~wxFont::Weight ~wxFont::NativeFontInfo ~WebView ~RadioButton::Single ~RadioButton::Focus ~wxHtmlPrintout::Pagination ~wxTextCtrl::GetBestSize ~TextCtrlTestCase ~wxExecute::RedirectUTF8 ~Ellipsization::NormalCase ~SpinCtrl::* ~SpinCtrlDouble::* ~NotebookTestCase ~SettingsTestCase ~Window::Show ~ModalDialogsTestCase ~Button::Click ~Button::Disabled ~wxDVC::GetItemRect ~wxDVC::AppendTextColumn ~Grid::KeyboardSelection ~Grid::CellClick ~Grid::ReorderedColumnsCellClick ~Grid::CellSelect ~wxStyledTextCtrl::AutoComp ~EvtLoopTestCase ~EventPropagationTestCase ~wxTreeCtrl::ItemClick ~wxTreeCtrl::LabelEdit ~wxTreeCtrl::KeyDown ~wxTreeCtrl::CollapseExpandEvents ~wxTreeCtrl::SelectionChange ~wxTreeCtrl::Menu ~wxTreeCtrl::KeyNavigation' + wx_tests_selection='~[.] ~[valnum] ~wxPersistTLW ~wxPersistDVC ~wxTopLevel::Show ~wxFont::Weight ~wxFont::NativeFontInfo ~WebView ~RadioButton::Single ~RadioButton::Focus ~wxHtmlPrintout::Pagination ~wxTextCtrl::GetBestSize ~TextCtrlTestCase ~wxExecute::RedirectUTF8 ~Ellipsization::NormalCase ~SpinCtrl::* ~SpinCtrlDouble::* ~NotebookTestCase ~SettingsTestCase ~Window::Show ~ModalDialogsTestCase ~Button::Click ~Button::Disabled ~wxDVC::GetItemRect ~wxDVC::AppendTextColumn ~Grid::KeyboardSelection ~Grid::CellClick ~Grid::ReorderedColumnsCellClick ~Grid::CellSelect ~wxStyledTextCtrl::AutoComp ~EvtLoopTestCase ~EventPropagationTestCase ~wxTreeCtrl::ItemClick ~wxTreeCtrl::LabelEdit ~wxTreeCtrl::KeyDown ~wxTreeCtrl::CollapseExpandEvents ~wxTreeCtrl::SelectionChange ~wxTreeCtrl::SelectItemMultiInteractive ~wxTreeCtrl::Menu ~wxTreeCtrl::KeyNavigation' ./test_gui.app/Contents/MacOS/test_gui $wx_tests_selection - name: Building samples diff --git a/tests/controls/treectrltest.cpp b/tests/controls/treectrltest.cpp index a7ac6ce608..65e71e9bda 100644 --- a/tests/controls/treectrltest.cpp +++ b/tests/controls/treectrltest.cpp @@ -25,6 +25,7 @@ #include "wx/treectrl.h" #include "wx/uiaction.h" #include "testableframe.h" +#include "waitfor.h" // ---------------------------------------------------------------------------- // test class @@ -58,6 +59,7 @@ public: } protected: + // the tree control itself wxTreeCtrl *m_tree = nullptr; @@ -400,6 +402,81 @@ TEST_CASE_METHOD(TreeCtrlTestCase, "wxTreeCtrl::SelectionChange", "[treectrl]") } } +TEST_CASE_METHOD(TreeCtrlTestCase, "wxTreeCtrl::SelectItemMultiInteractive", "[treectrl]") +{ +#if defined(__WXGTK__) && !defined(__WXGTK3__) + // FIXME: This test fails on GitHub CI under wxGTK2 although works fine on + // development machine, no idea why though! + if ( IsAutomaticTest() ) + return; +#endif // wxGTK2 + + // this test should be only ran in multi-selection control + m_tree->ToggleWindowStyle(wxTR_MULTIPLE); + + m_tree->ExpandAll(); + + // This is currently needed to work around a problem under wxMSW: clicking + // on an item in an unfocused control generates two selection change events + // because of the SetFocus() call in TVN_SELCHANGED handler in wxMSW code. + // This is, of course, wrong on its own, but fixing it without breaking + // anything else is non-obvious, so for now at least work around this + // problem in the test. + m_tree->SetFocus(); + + EventCounter beginedit(m_tree, wxEVT_TREE_BEGIN_LABEL_EDIT); + + wxUIActionSimulator sim; + + wxRect poschild1, poschild2; + m_tree->GetBoundingRect(m_child1, poschild1, true); + m_tree->GetBoundingRect(m_child2, poschild2, true); + + // We move in slightly so we are not on the edge + wxPoint point1 = m_tree->ClientToScreen(poschild1.GetPosition()) + wxPoint(4, 4); + wxPoint point2 = m_tree->ClientToScreen(poschild2.GetPosition()) + wxPoint(4, 4); + + sim.MouseMove(point1); + wxYield(); + + sim.MouseClick(); + wxYield(); + + sim.MouseMove(point2); + wxYield(); + + sim.KeyDown(WXK_CONTROL); + sim.MouseClick(); + sim.KeyUp(WXK_CONTROL); + wxYield(); + + // m_child1 and m_child2 should be selected. + CHECK( m_tree->IsSelected(m_child1) ); + CHECK( m_tree->IsSelected(m_child2) ); + CHECK( beginedit.GetCount() == 0 ); + + // Time needed (in ms) for the editor to display. The test will not pass + // if the value is less than 400, 510, 800 under wxQt, wxGTK, wxMSW resp. + const int BEGIN_EDIT_TIMEOUT = 800; + + YieldForAWhile(BEGIN_EDIT_TIMEOUT); + sim.MouseClick(); + YieldForAWhile(BEGIN_EDIT_TIMEOUT); + + // Only m_child2 should be selected now. + CHECK_FALSE( m_tree->IsSelected(m_child1) ); + CHECK( m_tree->IsSelected(m_child2) ); + CHECK( beginedit.GetCount() == 0 ); // No editing should take place in the event of deselection. + + sim.MouseClick(); + YieldForAWhile(BEGIN_EDIT_TIMEOUT); + + CHECK( beginedit.GetCount() == 1 ); // Start editing as usual. + + sim.Char(WXK_RETURN); // End editing and close the editor. + wxYield(); +} + TEST_CASE_METHOD(TreeCtrlTestCase, "wxTreeCtrl::Menu", "[treectrl]") { EventCounter menu(m_tree, wxEVT_TREE_ITEM_MENU);