174 lines
5.5 KiB
C++
174 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"
|
|
|
|
#if wxUSE_DATAVIEWCTRL
|
|
|
|
|
|
#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();
|
|
}
|
|
}
|
|
|
|
#endif
|