Both iconization and activation of TLWs is dependent on the presence of a WM, but there is no WM running under Xvfb, so skip these tests in this case.
		
			
				
	
	
		
			208 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        tests/persistence/persistence.cpp
 | |
| // Purpose:     wxTLW persistence support unit test
 | |
| // 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/frame.h"
 | |
| 
 | |
|     #ifdef __WXGTK__
 | |
|         #include "wx/stopwatch.h"
 | |
|     #endif // __WXGTK__
 | |
| #endif // WX_PRECOMP
 | |
| 
 | |
| #include "wx/persist/toplevel.h"
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // constants
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #define FRAME_OPTIONS_PREFIX   PO_PREFIX "/Window/frame"
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // local helpers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // Create the frame used for testing.
 | |
| static wxFrame* CreatePersistenceTestFrame()
 | |
| {
 | |
|     wxFrame* const frame = new wxFrame(wxTheApp->GetTopWindow(), wxID_ANY, "wxTest");
 | |
|     frame->SetName("frame");
 | |
| 
 | |
|     return frame;
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // tests themselves
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| TEST_CASE_METHOD(PersistenceTests, "wxPersistTLW", "[persist][tlw]")
 | |
| {
 | |
|     const wxPoint pos(100, 150);
 | |
|     const wxSize size(450, 350);
 | |
| 
 | |
|     // Save the frame geometry.
 | |
|     {
 | |
|         wxFrame* const frame = CreatePersistenceTestFrame();
 | |
| 
 | |
|         // Set the geometry before saving.
 | |
|         frame->SetPosition(pos);
 | |
|         frame->SetSize(size);
 | |
| 
 | |
|         CHECK(wxPersistenceManager::Get().Register(frame));
 | |
| 
 | |
|         // Destroy the frame immediately, i.e. don't use Destroy() here.
 | |
|         delete frame;
 | |
| 
 | |
|         // Test that the relevant keys have been stored correctly.
 | |
|         int val = -1;
 | |
| 
 | |
|         CHECK(GetConfig().Read(FRAME_OPTIONS_PREFIX "/x", &val));
 | |
|         CHECK(pos.x == val);
 | |
| 
 | |
|         CHECK(GetConfig().Read(FRAME_OPTIONS_PREFIX "/y", &val));
 | |
|         CHECK(pos.y == val);
 | |
| 
 | |
|         CHECK(GetConfig().Read(FRAME_OPTIONS_PREFIX "/w", &val));
 | |
|         CHECK(size.x == val);
 | |
| 
 | |
|         CHECK(GetConfig().Read(FRAME_OPTIONS_PREFIX "/h", &val));
 | |
|         CHECK(size.y == val);
 | |
| 
 | |
|         CHECK(GetConfig().Read(FRAME_OPTIONS_PREFIX "/Iconized", &val));
 | |
|         CHECK(0 == val);
 | |
| 
 | |
|         CHECK(GetConfig().Read(FRAME_OPTIONS_PREFIX "/Maximized", &val));
 | |
|         CHECK(0 == val);
 | |
|     }
 | |
| 
 | |
|     // Now try recreating the frame using the restored values.
 | |
|     bool checkIconized = true;
 | |
|     {
 | |
|         wxFrame* const frame = CreatePersistenceTestFrame();
 | |
| 
 | |
|         // Test that the object was registered and restored.
 | |
|         CHECK(wxPersistenceManager::Get().RegisterAndRestore(frame));
 | |
| 
 | |
|         CHECK(pos.x == frame->GetPosition().x);
 | |
|         CHECK(pos.y == frame->GetPosition().y);
 | |
|         CHECK(size.x == frame->GetSize().GetWidth());
 | |
|         CHECK(size.y == frame->GetSize().GetHeight());
 | |
|         CHECK(!frame->IsMaximized());
 | |
|         CHECK(!frame->IsIconized());
 | |
| 
 | |
|         // Next try that restoring a minimized frame works correctly: for
 | |
|         // Iconize() to have effect, we must show the frame first.
 | |
|         frame->Iconize();
 | |
|         frame->Show();
 | |
| 
 | |
| #ifdef __WXGTK__
 | |
|         // When using Xvfb, the frame will never get iconized, presumably
 | |
|         // because there is no WM, so don't even bother waiting or warning.
 | |
|         if ( IsRunningUnderXVFB() )
 | |
|         {
 | |
|             checkIconized = false;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             wxStopWatch sw;
 | |
|             while ( !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;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| #endif // __WXGTK__
 | |
| 
 | |
|         delete frame;
 | |
|     }
 | |
| 
 | |
|     // Check geometry after restoring the minimized frame.
 | |
|     {
 | |
|         wxFrame* const frame = CreatePersistenceTestFrame();
 | |
| 
 | |
|         CHECK(wxPersistenceManager::Get().RegisterAndRestore(frame));
 | |
| 
 | |
|         // As above, we need to show the frame for it to be actually iconized.
 | |
|         frame->Show();
 | |
| 
 | |
|         CHECK(!frame->IsMaximized());
 | |
|         if ( checkIconized )
 | |
|         {
 | |
| #ifdef __WXGTK__
 | |
|             wxStopWatch sw;
 | |
|             while ( !frame->IsIconized() )
 | |
|             {
 | |
|                 wxYield();
 | |
|                 if ( sw.Time() > 500 )
 | |
|                 {
 | |
|                     INFO("Abandoning wait after " << sw.Time() << "ms");
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
| #endif // __WXGTK__
 | |
| 
 | |
|             CHECK(frame->IsIconized());
 | |
|         }
 | |
| 
 | |
|         frame->Restore();
 | |
| 
 | |
|         CHECK(pos.x == frame->GetPosition().x);
 | |
|         CHECK(pos.y == frame->GetPosition().y);
 | |
|         CHECK(size.x == frame->GetSize().GetWidth());
 | |
|         CHECK(size.y == frame->GetSize().GetHeight());
 | |
| 
 | |
|         // Next try that restoring a maximized frame works correctly: again,
 | |
|         // for it to be really maximized, it must be shown.
 | |
|         frame->Maximize();
 | |
|         frame->Show();
 | |
| 
 | |
|         delete frame;
 | |
|     }
 | |
| 
 | |
|     // Check geometry after restoring the maximized frame.
 | |
|     //
 | |
|     // This test currently fails under non-MSW platforms as they only save the
 | |
|     // maximized frame size, and its normal size is lost and can't be restored.
 | |
| #ifdef __WXMSW__
 | |
|     {
 | |
|         wxFrame* const frame = CreatePersistenceTestFrame();
 | |
| 
 | |
|         CHECK(wxPersistenceManager::Get().RegisterAndRestore(frame));
 | |
| 
 | |
|         CHECK(frame->IsMaximized());
 | |
|         CHECK(!frame->IsIconized());
 | |
| 
 | |
|         frame->Restore();
 | |
| 
 | |
|         CHECK(pos.x == frame->GetPosition().x);
 | |
|         CHECK(pos.y == frame->GetPosition().y);
 | |
|         CHECK(size.x == frame->GetSize().GetWidth());
 | |
|         CHECK(size.y == frame->GetSize().GetHeight());
 | |
| 
 | |
|         delete frame;
 | |
|     }
 | |
| #endif // __WXMSW__
 | |
| }
 |