Merge branch 'qt-fixes'

Fix bugs preventing GUI tests from working with wxQt and provide native
implementations of wx{Date,Time}Ctrl in this port.

See #23925.
This commit is contained in:
Vadim Zeitlin 2023-10-22 01:18:50 +02:00
commit c601bf4279
41 changed files with 663 additions and 286 deletions

View file

@ -1931,6 +1931,20 @@ public:
virtual void SetValue( int /*row*/, int /*col*/, const wxString& /*value*/ ) override { }
};
// Under wxQt, we get spurious paint events if we call Refresh+Update.
// So just call Refresh+wxYield which seems to fix the failures in the
// test below.
inline void UpdateGrid(wxGrid* grid)
{
#ifndef __WXQT__
grid->Refresh();
grid->Update();
#else
grid->Refresh();
wxYield();
#endif
}
} // namespace SetTable_ClearAttrCache
TEST_CASE_METHOD(GridTestCase, "Grid::SetTable_ClearAttrCache", "[grid]")
@ -1949,15 +1963,13 @@ TEST_CASE_METHOD(GridTestCase, "Grid::SetTable_ClearAttrCache", "[grid]")
drawCount1 = drawCount2 = 0;
m_grid->SetTable(&table2);
m_grid->Refresh();
m_grid->Update();
UpdateGrid(m_grid);
CHECK(drawCount1 == 0);
CHECK(drawCount2 == 2*2);
drawCount1 = drawCount2 = 0;
m_grid->SetTable(&table1);
m_grid->Refresh();
m_grid->Update();
UpdateGrid(m_grid);
CHECK(drawCount1 == 1*1);
CHECK(drawCount2 == 0);

View file

@ -109,12 +109,21 @@ void ListBoxTestCase::Sort()
m_list->Append(testitems);
#ifndef __WXQT__
CPPUNIT_ASSERT_EQUAL("AAA", m_list->GetString(0));
CPPUNIT_ASSERT_EQUAL("Aaa", m_list->GetString(1));
CPPUNIT_ASSERT_EQUAL("aaa", m_list->GetString(2));
CPPUNIT_ASSERT_EQUAL("aaab", m_list->GetString(3));
CPPUNIT_ASSERT_EQUAL("aab", m_list->GetString(4));
CPPUNIT_ASSERT_EQUAL("aba", m_list->GetString(5));
#else
CPPUNIT_ASSERT_EQUAL("aaa", m_list->GetString(0));
CPPUNIT_ASSERT_EQUAL("Aaa", m_list->GetString(1));
CPPUNIT_ASSERT_EQUAL("AAA", m_list->GetString(2));
CPPUNIT_ASSERT_EQUAL("aaab", m_list->GetString(3));
CPPUNIT_ASSERT_EQUAL("aab", m_list->GetString(4));
CPPUNIT_ASSERT_EQUAL("aba", m_list->GetString(5));
#endif
m_list->Append("a", wxUIntToPtr(1));

View file

@ -143,11 +143,13 @@ TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
CHECK( m_spin->GetMin() == -10.0 );
CHECK( m_spin->GetMax() == 10.0 );
#ifndef __WXQT__
//Test backwards ranges
m_spin->SetRange(75.0, 50.0);
CHECK( m_spin->GetMin() == 75.0 );
CHECK( m_spin->GetMax() == 50.0 );
#endif
}
TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
@ -182,7 +184,11 @@ TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
CHECK( updatedText.GetCount() == 0 );
m_spin->SetValue("");
#ifndef __WXQT__
CHECK( m_spin->GetTextValue() == "" );
#else
CHECK( m_spin->GetTextValue() == "0.00" ); // the control automatically displays minVal
#endif
CHECK( m_spin->GetValue() == 0 );
CHECK( updatedSpin.GetCount() == 0 );

View file

@ -253,11 +253,13 @@ TEST_CASE_METHOD(SpinCtrlTestCase2, "SpinCtrl::Range", "[spinctrl]")
CHECK(m_spin->GetBase() == 10);
#ifndef __WXQT__
//Test backwards ranges
m_spin->SetRange(75, 50);
CHECK(m_spin->GetMin() == 75);
CHECK(m_spin->GetMax() == 50);
#endif
}
TEST_CASE_METHOD(SpinCtrlTestCase2, "SpinCtrl::Value", "[spinctrl]")
@ -291,7 +293,11 @@ TEST_CASE_METHOD(SpinCtrlTestCase2, "SpinCtrl::Value", "[spinctrl]")
CHECK(updatedText.GetCount() == 0);
m_spin->SetValue("");
#ifndef __WXQT__
CHECK( m_spin->GetTextValue() == "" );
#else
CHECK( m_spin->GetTextValue() == "0" ); // the control automatically displays minVal
#endif
CHECK( m_spin->GetValue() == 0 );
CHECK(updatedSpin.GetCount() == 0);

View file

@ -1328,20 +1328,27 @@ TEST_CASE("wxTextCtrl::GetBestSize", "[wxTextCtrl][best-size]")
s += "1\n2\n3\n4\n5\n";
const wxSize sizeMedium = getBestSizeFor(s);
// Control with a few lines of text in it should be taller.
CHECK( sizeMedium.y > sizeEmpty.y );
s += "6\n7\n8\n9\n10\n";
const wxSize sizeLong = getBestSizeFor(s);
// And a control with many lines in it should be even more so.
CHECK( sizeLong.y > sizeMedium.y );
s += s;
s += s;
s += s;
const wxSize sizeVeryLong = getBestSizeFor(s);
#ifndef __WXQT__
// Control with a few lines of text in it should be taller.
CHECK( sizeMedium.y > sizeEmpty.y );
// And a control with many lines in it should be even more so.
CHECK( sizeLong.y > sizeMedium.y );
#else
// Under wxQt, the multiline textctrl has a fixed calculated best size
// regardless of its content.
CHECK( sizeMedium.y == sizeEmpty.y );
CHECK( sizeLong.y == sizeMedium.y );
#endif
// However there is a cutoff at 10 lines currently, so anything longer than
// that should still have the same best size.
CHECK( sizeVeryLong.y == sizeLong.y );

View file

@ -52,25 +52,17 @@ void TextEntryTestCase::TextChangeEvents()
wxTextEntry * const entry = GetTestEntry();
// notice that SetValue() generates an event even if the text didn't change
#ifndef __WXQT__
entry->SetValue("");
CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
updated.Clear();
#else
WARN("Events are only sent when text changes in WxQt");
#endif
entry->SetValue("foo");
CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
updated.Clear();
#ifndef __WXQT__
entry->SetValue("foo");
CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
updated.Clear();
#else
WARN("Events are only sent when text changes in WxQt");
#endif
entry->SetValue("");
CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );

View file

@ -81,6 +81,7 @@ void VirtListCtrlTestCase::setUp()
};
m_list = new VirtListCtrl;
m_list->AppendColumn("Col0");
}
void VirtListCtrlTestCase::tearDown()
@ -101,15 +102,19 @@ void VirtListCtrlTestCase::UpdateSelection()
CPPUNIT_ASSERT_EQUAL( 2, m_list->GetSelectedItemCount() );
// The item 7 is now invalid and so shouldn't be counted as selected any
// more.
// more. Notice that under wxQt, the selection is lost/cleared when the
// model is reset
m_list->SetItemCount(5);
#ifndef __WXQT__
CPPUNIT_ASSERT_EQUAL( 1, m_list->GetSelectedItemCount() );
#else
CPPUNIT_ASSERT_EQUAL( 0, m_list->GetSelectedItemCount() );
#endif
}
void VirtListCtrlTestCase::DeselectedEvent()
{
#if wxUSE_UIACTIONSIMULATOR
m_list->AppendColumn("Col0");
m_list->SetItemCount(1);
wxListCtrl* const list = m_list;

View file

@ -133,8 +133,8 @@ TEST_CASE_METHOD(WindowTestCase, "Window::FocusEvent", "[window]")
wxButton* button = new wxButton(wxTheApp->GetTopWindow(), wxID_ANY);
wxYield();
button->SetFocus();
wxYield();
CHECK( killfocus.GetCount() == 1 );
CHECK(!m_window->HasFocus());
@ -143,7 +143,7 @@ TEST_CASE_METHOD(WindowTestCase, "Window::FocusEvent", "[window]")
TEST_CASE_METHOD(WindowTestCase, "Window::Mouse", "[window]")
{
wxCursor cursor(wxCURSOR_CHAR);
wxCursor cursor(wxCURSOR_HAND);
m_window->SetCursor(cursor);
CHECK(m_window->GetCursor().IsOk());

View file

@ -29,7 +29,7 @@
#include <memory>
#ifdef __WXGTK__
#if defined(__WXGTK__) || defined(__WXQT__)
#include "waitfor.h"
#endif
@ -174,14 +174,14 @@ public:
void GeneratePaintEvent()
{
#ifdef __WXGTK__
#if defined(__WXGTK__) || defined(__WXQT__)
// We need to map the window, otherwise we're not going to get any
// paint events for it.
YieldForAWhile();
// Ignore events generated during the initial mapping.
g_str.clear();
#endif // __WXGTK__
#endif // __WXGTK__ || __WXQT__
Refresh();
Update();
@ -605,8 +605,12 @@ void EventPropagationTestCase::DocView()
// Check that wxDocument, wxView, wxDocManager, child frame and the parent
// get the event in order.
#ifndef __WXQT__
ASSERT_MENU_EVENT_RESULT( menuChild, "advmcpA" );
#else
wxUnusedVar(menuChild);
WARN("We don't get paint event under wxQt for some reason... test skipped.");
#endif
#if wxUSE_TOOLBAR
// Also check that toolbar events get forwarded to the active child.
@ -620,7 +624,11 @@ void EventPropagationTestCase::DocView()
g_str.clear();
tb->OnLeftClick(wxID_APPLY, true /* doesn't matter */);
#ifndef __WXQT__
CPPUNIT_ASSERT_EQUAL( "advmcpA", g_str );
#else
WARN("Skipping test not working under wxQt");
#endif
#endif // wxUSE_TOOLBAR
}

View file

@ -159,6 +159,11 @@ TEST_CASE("wxDC::GetPartialTextExtent", "[dc][text-extent][partial]")
REQUIRE( dc.GetPartialTextExtents("Hello", widths) );
REQUIRE( widths.size() == 5 );
CHECK( widths[0] == dc.GetTextExtent("H").x );
#ifdef __WXQT__
// Skip test which work locally, but not when run on GitHub CI
if ( IsAutomaticTest() )
return;
#endif
CHECK( widths[4] == dc.GetTextExtent("Hello").x );
}