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
 |