wxWidgets/tests/persistence/dataview.cpp
Vadim Zeitlin e27eebdd2a Work around GTK problems in wxPersistentDVC unit test
We need to wait until wxDataViewCtrl is realized for its columns widths
to be actually set, as calling gtk_tree_view_column_set_fixed_width()
just queues a resize that will take effect later, as documented in the
previous commit.
2019-07-16 18:25:40 +02:00

173 lines
5.5 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/persistence/dataview.cpp
// Purpose: wxDataViewCtrl persistence support unit tests
// Author: wxWidgets Team
// Created: 2017-08-23
// Copyright: (c) 2017 wxWidgets Team
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "testpersistence.h"
#ifndef WX_PRECOMP
#include "wx/dataview.h"
#ifdef __WXGTK__
#include "wx/stopwatch.h"
#endif // __WXGTK__
#endif // WX_PRECOMP
#include "wx/persist/dataview.h"
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
#define DVC_PREFIX PO_PREFIX "/DataView/dvc"
#define DVC_COL "Column #"
#define DVC_COL_PREFIX DVC_PREFIX "/Columns/" DVC_COL
#define DVC_SORT_PREFIX DVC_PREFIX "/Sorting"
// ----------------------------------------------------------------------------
// local helpers
// ----------------------------------------------------------------------------
// Create the control used for testing.
static wxDataViewCtrl* CreatePersistenceTestDVC()
{
// We can't just destroy the control itself directly, we need to destroy
// its parent as only this will ensure that it gets wxWindowDestroyEvent
// from which its state will be saved.
wxWindow* const parent = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY);
wxDataViewListCtrl* const list = new wxDataViewListCtrl(parent, wxID_ANY);
list->SetName("dvc");
// Ensure the control is big enough to allow making its columns as wide as
// we need them to be.
parent->SetSize(parent->GetParent()->GetClientSize());
list->SetSize(parent->GetClientSize());
// Add some columns to the DVC.
list->AppendTextColumn(DVC_COL "1",
wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
wxDATAVIEW_COL_RESIZABLE |
wxDATAVIEW_COL_REORDERABLE |
wxDATAVIEW_COL_SORTABLE);
list->AppendTextColumn(DVC_COL "2",
wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
wxDATAVIEW_COL_RESIZABLE |
wxDATAVIEW_COL_REORDERABLE |
wxDATAVIEW_COL_SORTABLE);
// Populate with DVC data.
wxVector<wxVariant> data;
data.push_back("AAAA");
data.push_back("BBBB");
list->AppendItem(data);
data.clear();
data.push_back("CCCC");
data.push_back("DDDD");
list->AppendItem(data);
data.clear();
data.push_back("EEEE");
data.push_back("FFFF");
list->AppendItem(data);
return list;
}
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();
}
#else // !__WXGTK__
wxUnusedVar(list);
#endif // __WXGTK__/!__WXGTK__
}
// --------------------------------------------------------------------------
// tests themselves
// --------------------------------------------------------------------------
// Note: The wxDataViewCtrl test currently uses the derivative class
// wxDataViewListCtrl for convenience.
TEST_CASE_METHOD(PersistenceTests, "wxPersistDVC", "[persist][wxDataViewCtrl]")
{
{
wxDataViewCtrl* const list = CreatePersistenceTestDVC();
// Adjust the initial settings.
list->GetColumn(0)->SetWidth(150);
list->GetColumn(1)->SetWidth(250);
list->GetColumn(1)->SetSortOrder(false);
CHECK(wxPersistenceManager::Get().Register(list));
// We need to wait until the window is fully realized and the column
// widths are actually set.
GTKWaitRealized(list);
// Deleting the control itself doesn't allow it to save its state as
// the wxEVT_DESTROY handler is called too late, so delete its parent
// (as would usually be the case) instead.
delete list->GetParent();
// Test that the relevant keys have been stored correctly.
int val = -1;
wxString text;
CHECK(GetConfig().Read(DVC_COL_PREFIX "1/Width", &val));
CHECK(150 == val);
CHECK(GetConfig().Read(DVC_COL_PREFIX "2/Width", &val));
CHECK(250 == val);
CHECK(GetConfig().Read(DVC_SORT_PREFIX "/Column", &text));
CHECK(text == "Column #2");
CHECK(GetConfig().Read(DVC_SORT_PREFIX "/Asc", &val));
CHECK(0 == val);
}
{
wxDataViewCtrl* const list = CreatePersistenceTestDVC();
// Test that the object was registered and restored.
CHECK(wxPersistenceManager::Get().RegisterAndRestore(list));
// Similar to above, we need to wait until it's realized after
// restoring the widths.
GTKWaitRealized(list);
// Test that the correct values were restored.
CHECK(150 == list->GetColumn(0)->GetWidth());
CHECK(250 == list->GetColumn(1)->GetWidth());
CHECK(list->GetColumn(1)->IsSortKey());
CHECK(!list->GetColumn(1)->IsSortOrderAscending());
delete list->GetParent();
}
}