From fa5964c10041dd77a3f92ff4d30c18e7dae261e1 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 1 Oct 2023 21:47:44 +0200 Subject: [PATCH] Use WaitFor() and new YieldForAWhile() helpers in the tests Reuse the existing function (and another new one, which is even simpler) instead of duplicating its code in many places in the tests. No real changes. --- tests/controls/dataviewctrltest.cpp | 46 ++++++++--------------------- tests/controls/propgridtest.cpp | 15 +++------- tests/controls/textctrltest.cpp | 21 ++++--------- tests/controls/webtest.cpp | 5 ++-- tests/controls/windowtest.cpp | 13 ++------ tests/events/keyboard.cpp | 9 ++---- tests/events/propagation.cpp | 8 +++-- tests/graphics/clipper.cpp | 6 +--- tests/graphics/clippingbox.cpp | 6 +--- tests/persistence/dataview.cpp | 22 +++++--------- tests/persistence/tlw.cpp | 35 +++++++--------------- tests/waitfor.h | 15 ++++++++++ 12 files changed, 69 insertions(+), 132 deletions(-) diff --git a/tests/controls/dataviewctrltest.cpp b/tests/controls/dataviewctrltest.cpp index b460195a43..bfb849b14d 100644 --- a/tests/controls/dataviewctrltest.cpp +++ b/tests/controls/dataviewctrltest.cpp @@ -20,7 +20,7 @@ #include "wx/uiaction.h" #ifdef __WXGTK__ - #include "wx/stopwatch.h" + #include "waitfor.h" #endif // __WXGTK__ #include "testableframe.h" @@ -366,31 +366,23 @@ protected: #ifdef __WXGTK__ // Unfortunately it's not enough to call wxYield() once, so wait up to // 0.5 sec. - wxStopWatch sw; - while ( true ) - { - wxYield(); - + WaitFor("wxDataViewCtrl upder", [this, item, existence]() { const bool isItemRectEmpty = m_dvc->GetItemRect(item).IsEmpty(); switch ( existence ) { case wxITEM_APPEAR: if ( !isItemRectEmpty ) - return; + return true; break; case wxITEM_DISAPPEAR: if ( isItemRectEmpty ) - return; + return true; break; } - if ( sw.Time() > 500 ) - { - WARN("Timed out waiting for wxDataViewCtrl"); - break; - } - } + return false; + }); #else // !__WXGTK__ wxUnusedVar(item); wxUnusedVar(existence); @@ -810,16 +802,9 @@ TEST_CASE_METHOD(SingleSelectDataViewCtrlTestCase, #ifdef __WXGTK__ // Wait for the list control to be relaid out. - wxStopWatch sw; - while ( m_dvc->GetTopItem() == m_root ) - { - if ( sw.Time() > 500 ) - { - WARN("Timed out waiting for wxDataViewCtrl layout"); - break; - } - wxYield(); - } + WaitFor("wxDataViewCtrl layout", [this]() { + return m_dvc->GetTopItem() != m_root; + }); #endif // __WXGTK__ // Check that this was indeed the case. @@ -858,16 +843,9 @@ TEST_CASE_METHOD(MultiColumnsDataViewCtrlTestCase, { #ifdef __WXGTK__ // Wait for the list control to be realized. - wxStopWatch sw; - while ( m_firstColumn->GetWidth() == 0 ) - { - if ( sw.Time() > 500 ) - { - WARN("Timed out waiting for wxDataViewListCtrl to be realized"); - break; - } - wxYield(); - } + WaitFor("wxDataViewCtrl to be realized", [this]() { + return m_firstColumn->GetWidth() != 0; + }); #endif // Check the width of the first column. diff --git a/tests/controls/propgridtest.cpp b/tests/controls/propgridtest.cpp index 675a8524e7..0c21b04751 100644 --- a/tests/controls/propgridtest.cpp +++ b/tests/controls/propgridtest.cpp @@ -16,12 +16,13 @@ #if wxUSE_DATEPICKCTRL #include "wx/datectrl.h" #endif -#include "wx/stopwatch.h" #include "wx/propgrid/propgrid.h" #include "wx/propgrid/manager.h" #include "wx/propgrid/advprops.h" +#include "waitfor.h" + #include #include @@ -450,11 +451,7 @@ static wxPropertyGridManager* CreateGrid(int style, int extraStyle) pgManager->Refresh(); pgManager->Update(); // Wait for update to be done - wxStopWatch sw; - while ( sw.Time() < 100 ) - { - wxYield(); - } + YieldForAWhile(100); return pgManager; } @@ -722,11 +719,7 @@ TEST_CASE("PropertyGridTestCase", "[propgrid]") pgManager->Refresh(); pgManager->Update(); // Wait for update to be done - wxStopWatch sw; - while ( sw.Time() < 100 ) - { - wxYield(); - } + YieldForAWhile(100); } SECTION("Default_Values") diff --git a/tests/controls/textctrltest.cpp b/tests/controls/textctrltest.cpp index 4137487d48..a0c9991d0c 100644 --- a/tests/controls/textctrltest.cpp +++ b/tests/controls/textctrltest.cpp @@ -29,7 +29,7 @@ #endif // wxUSE_CLIPBOARD #ifdef __WXGTK__ - #include "wx/stopwatch.h" + #include "waitfor.h" #endif #include "wx/private/localeset.h" @@ -397,8 +397,7 @@ void TextCtrlTestCase::HitTestSingleLine() #ifdef __WXGTK__ // wxGTK must be given an opportunity to lay the text out. - for ( wxStopWatch sw; sw.Time() < 50; ) - wxYield(); + YieldForAWhile(); #endif REQUIRE( m_text->HitTest(wxPoint(2*sizeChar.x, yMid), &pos) == wxTE_HT_ON_TEXT ); @@ -757,18 +756,10 @@ void TextCtrlTestCase::DoPositionToCoordsTestWithStyle(long style) // wxGTK needs to yield here to update the text control. #ifdef __WXGTK__ - wxStopWatch sw; - while ( m_text->PositionToCoords(0).y == 0 || - m_text->PositionToCoords(pos).y > TEXT_HEIGHT ) - { - if ( sw.Time() > 1000 ) - { - FAIL("Timed out waiting for wxTextCtrl update."); - break; - } - - wxYield(); - } + WaitFor("wxTextCtrl update", [this, pos]() { + return m_text->PositionToCoords(0).y != 0 && + m_text->PositionToCoords(pos).y <= TEXT_HEIGHT; + }, 1000); #endif // __WXGTK__ wxPoint coords = m_text->PositionToCoords(0); diff --git a/tests/controls/webtest.cpp b/tests/controls/webtest.cpp index 98a817c997..c7055d895f 100644 --- a/tests/controls/webtest.cpp +++ b/tests/controls/webtest.cpp @@ -22,7 +22,7 @@ #include "wx/msw/webview_ie.h" #endif #if wxUSE_WEBVIEW_WEBKIT2 - #include "wx/stopwatch.h" + #include "waitfor.h" #endif //Convenience macro @@ -235,8 +235,7 @@ TEST_CASE_METHOD(WebViewTestCase, "WebView", "[wxWebView]") // bit before giving up. Avoid calling HasSelection() right away // without wxYielding a bit because this seems to cause the extension // to hang with webkit 2.40.0+. - for ( wxStopWatch sw; sw.Time() < 50; ) - wxYield(); + YieldForAWhile(); #endif // wxUSE_WEBVIEW_WEBKIT2 CHECK(m_browser->HasSelection()); diff --git a/tests/controls/windowtest.cpp b/tests/controls/windowtest.cpp index 6041bcb2fa..648fb6eacb 100644 --- a/tests/controls/windowtest.cpp +++ b/tests/controls/windowtest.cpp @@ -19,12 +19,12 @@ #include "asserthelper.h" #include "testableframe.h" #include "testwindow.h" +#include "waitfor.h" #include "wx/uiaction.h" #include "wx/caret.h" #include "wx/cshelp.h" #include "wx/dcclient.h" -#include "wx/stopwatch.h" #include "wx/tooltip.h" #include "wx/wupdlock.h" @@ -40,8 +40,7 @@ public: // Without this, when running this test suite solo it succeeds, // but not when running it together with the other tests !! // Not needed when run under Xvfb display. - for ( wxStopWatch sw; sw.Time() < 50; ) - wxYield(); + YieldForAWhile(); #endif } @@ -510,13 +509,7 @@ TEST_CASE_METHOD(WindowTestCase, "Window::Refresh", "[window]") parent->RefreshRect(wxRect(150, 10, 300, 80)); - for ( wxStopWatch sw; sw.Time() < 100; ) - { - if ( isParentPainted ) - break; - - wxYield(); - } + WaitFor("parent repaint", [&]() { return isParentPainted; }, 100); // child1 should be the only window not to receive the wxEVT_PAINT event // because it does not intersect with the refreshed rectangle. diff --git a/tests/events/keyboard.cpp b/tests/events/keyboard.cpp index 0b66a58bfb..9bf8f3a261 100644 --- a/tests/events/keyboard.cpp +++ b/tests/events/keyboard.cpp @@ -24,9 +24,7 @@ #include "wx/uiaction.h" #include "wx/vector.h" -#ifdef __WXGTK__ -#include "wx/stopwatch.h" -#endif +#include "waitfor.h" namespace { @@ -229,10 +227,7 @@ void KeyboardEventTestCase::setUp() wxYield(); m_win->SetFocus(); -#ifdef __WXGTK__ - for ( wxStopWatch sw; sw.Time() < 10; ) -#endif - wxYield(); // needed to show the new window + YieldForAWhile(10); // needed to show the new window // The window might get some key up events when it's being shown if the key // was pressed when the program was started and released after the window diff --git a/tests/events/propagation.cpp b/tests/events/propagation.cpp index 771e0e5bb2..37f2fc90aa 100644 --- a/tests/events/propagation.cpp +++ b/tests/events/propagation.cpp @@ -26,10 +26,13 @@ #include "wx/scopeguard.h" #include "wx/toolbar.h" #include "wx/uiaction.h" -#include "wx/stopwatch.h" #include +#ifdef __WXGTK__ + #include "waitfor.h" +#endif + // FIXME: Currently under OS X testing paint event doesn't work because neither // calling Refresh()+Update() nor even sending wxPaintEvent directly to // the window doesn't result in calls to its event handlers, so disable @@ -174,8 +177,7 @@ public: #ifdef __WXGTK__ // We need to map the window, otherwise we're not going to get any // paint events for it. - for ( wxStopWatch sw; sw.Time() < 50; ) - wxYield(); + YieldForAWhile(); // Ignore events generated during the initial mapping. g_str.clear(); diff --git a/tests/graphics/clipper.cpp b/tests/graphics/clipper.cpp index 697169c446..676a2e1270 100644 --- a/tests/graphics/clipper.cpp +++ b/tests/graphics/clipper.cpp @@ -751,11 +751,7 @@ TEST_CASE("ClipperTestCase::wxPaintDC", "[clipper][dc][paintdc]") testWin->Refresh(); testWin->Update(); // Wait for update to be done - wxStopWatch sw; - while( sw.Time() < 50 ) - { - wxYield(); - } + YieldForAWhile(); CHECK(paintExecuted == true); } diff --git a/tests/graphics/clippingbox.cpp b/tests/graphics/clippingbox.cpp index 249f4d85a2..cf0f409468 100644 --- a/tests/graphics/clippingbox.cpp +++ b/tests/graphics/clippingbox.cpp @@ -4322,11 +4322,7 @@ TEST_CASE("ClippingBoxTestCase::wxPaintDC", "[clip][dc][paintdc]") testWin->Refresh(); testWin->Update(); // Wait for update to be done - wxStopWatch sw; - while( sw.Time() < 50 ) - { - wxYield(); - } + YieldForAWhile(); CHECK(paintExecuted == true); } diff --git a/tests/persistence/dataview.cpp b/tests/persistence/dataview.cpp index 686cbec6a6..0cfa99c527 100644 --- a/tests/persistence/dataview.cpp +++ b/tests/persistence/dataview.cpp @@ -19,14 +19,14 @@ #ifndef WX_PRECOMP #include "wx/dataview.h" - - #ifdef __WXGTK__ - #include "wx/stopwatch.h" - #endif // __WXGTK__ #endif // WX_PRECOMP #include "wx/persist/dataview.h" +#ifdef __WXGTK__ + #include "waitfor.h" +#endif // __WXGTK__ + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -90,17 +90,9 @@ static wxDataViewCtrl* CreatePersistenceTestDVC() void GTKWaitRealized(wxDataViewCtrl* list) { #ifdef __WXGTK__ - wxStopWatch sw; - while ( list->GetColumn(0)->GetWidth() == 0 ) - { - if ( sw.Time() > 500 ) - { - WARN("Timed out waiting for wxDataViewCtrl to be realized"); - break; - } - - wxYield(); - } + WaitFor("wxDataViewCtrl to be realized", [list]() { + return list->GetColumn(0)->GetWidth() != 0; + }); #else // !__WXGTK__ wxUnusedVar(list); #endif // __WXGTK__/!__WXGTK__ diff --git a/tests/persistence/tlw.cpp b/tests/persistence/tlw.cpp index 1de89b5756..34b43cc1fd 100644 --- a/tests/persistence/tlw.cpp +++ b/tests/persistence/tlw.cpp @@ -17,14 +17,14 @@ #ifndef WX_PRECOMP #include "wx/frame.h" - - #ifdef __WXGTK__ - #include "wx/stopwatch.h" - #endif // __WXGTK__ #endif // WX_PRECOMP #include "wx/persist/toplevel.h" +#ifdef __WXGTK__ + #include "waitfor.h" +#endif // __WXGTK__ + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -117,17 +117,11 @@ TEST_CASE_METHOD(PersistenceTests, "wxPersistTLW", "[persist][tlw]") } else { - wxStopWatch sw; - while ( !frame->IsIconized() ) + if ( !WaitFor("frame to be iconized", [frame]() { + return frame->IsIconized(); + }) ) { - wxYield(); - if ( sw.Time() > 500 ) - { - // 500ms should be enough for the window to end up iconized. - WARN("Frame wasn't iconized as expected"); - checkIconized = false; - break; - } + checkIconized = false; } } #endif // __WXGTK__ @@ -148,16 +142,9 @@ TEST_CASE_METHOD(PersistenceTests, "wxPersistTLW", "[persist][tlw]") if ( checkIconized ) { #ifdef __WXGTK__ - wxStopWatch sw; - while ( !frame->IsIconized() ) - { - wxYield(); - if ( sw.Time() > 500 ) - { - INFO("Abandoning wait after " << sw.Time() << "ms"); - break; - } - } + WaitFor("frame to be iconized", [frame]() { + return frame->IsIconized(); + }); #endif // __WXGTK__ CHECK(frame->IsIconized()); diff --git a/tests/waitfor.h b/tests/waitfor.h index 37be4595cf..b3d0f6cc33 100644 --- a/tests/waitfor.h +++ b/tests/waitfor.h @@ -37,6 +37,21 @@ WaitFor(const char* what, const std::function& pred, int timeout = 500) return true; } +// An even simpler version which doesn't wait for anything but just calls +// wxYield() until the given timeout expires. +inline void +YieldForAWhile(int timeout = 50) +{ + wxStopWatch sw; + for ( ;; ) + { + wxYield(); + + if ( sw.Time() > timeout ) + break; + } +} + // Class used to check if we received the (first) paint event: this is // currently used under GTK only, as MSW doesn't seem to need to wait for the // things to work, while under Mac nothing works anyhow.