This used to be broken, see #18898, and now that it is fixed by
5a70051c7e (Avoid assertion failure in wxButton with bitmap and empty
label, see #18898, 2020-08-21) add a unit test so that it stays fixed.
		
	
		
			
				
	
	
		
			193 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        tests/controls/buttontest.cpp
 | |
| // Purpose:     wxButton unit test
 | |
| // Author:      Steven Lamerton
 | |
| // Created:     2010-06-21
 | |
| // Copyright:   (c) 2010 Steven Lamerton
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #include "testprec.h"
 | |
| 
 | |
| #if wxUSE_BUTTON
 | |
| 
 | |
| #ifdef __BORLANDC__
 | |
|     #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #ifndef WX_PRECOMP
 | |
|     #include "wx/app.h"
 | |
|     #include "wx/button.h"
 | |
| #endif // WX_PRECOMP
 | |
| 
 | |
| #include "testableframe.h"
 | |
| #include "wx/uiaction.h"
 | |
| #include "wx/artprov.h"
 | |
| //For CPPUNIT_ASSERT_EQUAL to work a class must have a stream output function
 | |
| //for those classes which do not have them by default we define them in
 | |
| //asserthelper.h so they can be reused
 | |
| #include "asserthelper.h"
 | |
| 
 | |
| class ButtonTestCase : public CppUnit::TestCase
 | |
| {
 | |
| public:
 | |
|     ButtonTestCase() { }
 | |
| 
 | |
|     void setUp() wxOVERRIDE;
 | |
|     void tearDown() wxOVERRIDE;
 | |
| 
 | |
| private:
 | |
|     CPPUNIT_TEST_SUITE( ButtonTestCase );
 | |
|         //We add tests that use wxUIActionSimulator with WXUISIM_TEST so they
 | |
|         //are not run on platofrms were wxUIActionSimulator isn't supported
 | |
|         WXUISIM_TEST( Click );
 | |
|         WXUISIM_TEST( Disabled );
 | |
|         CPPUNIT_TEST( Auth );
 | |
|         CPPUNIT_TEST( BitmapMargins );
 | |
|         CPPUNIT_TEST( Bitmap );
 | |
|     CPPUNIT_TEST_SUITE_END();
 | |
| 
 | |
|     void Click();
 | |
|     void Disabled();
 | |
|     void Auth();
 | |
|     void BitmapMargins();
 | |
|     void Bitmap();
 | |
| 
 | |
|     wxButton* m_button;
 | |
| 
 | |
|     wxDECLARE_NO_COPY_CLASS(ButtonTestCase);
 | |
| };
 | |
| 
 | |
| // register in the unnamed registry so that these tests are run by default
 | |
| CPPUNIT_TEST_SUITE_REGISTRATION( ButtonTestCase );
 | |
| 
 | |
| // also include in its own registry so that these tests can be run alone
 | |
| CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ButtonTestCase, "ButtonTestCase" );
 | |
| 
 | |
| void ButtonTestCase::setUp()
 | |
| {
 | |
|     //We use wxTheApp->GetTopWindow() as there is only a single testable frame
 | |
|     //so it will always be returned
 | |
|     m_button = new wxButton(wxTheApp->GetTopWindow(), wxID_ANY, "wxButton");
 | |
| }
 | |
| 
 | |
| void ButtonTestCase::tearDown()
 | |
| {
 | |
|     wxDELETE(m_button);
 | |
| }
 | |
| 
 | |
| #if wxUSE_UIACTIONSIMULATOR
 | |
| 
 | |
| void ButtonTestCase::Click()
 | |
| {
 | |
|     //We use the internal class EventCounter which handles connecting and
 | |
|     //disconnecting the control to the wxTestableFrame
 | |
|     EventCounter clicked(m_button, wxEVT_BUTTON);
 | |
| 
 | |
|     wxUIActionSimulator sim;
 | |
| 
 | |
|     //We move in slightly to account for window decorations, we need to yield
 | |
|     //after every wxUIActionSimulator action to keep everything working in GTK
 | |
|     sim.MouseMove(m_button->GetScreenPosition() + wxPoint(10, 10));
 | |
|     wxYield();
 | |
| 
 | |
|     sim.MouseClick();
 | |
|     wxYield();
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL( 1, clicked.GetCount() );
 | |
| }
 | |
| 
 | |
| void ButtonTestCase::Disabled()
 | |
| {
 | |
|     wxUIActionSimulator sim;
 | |
| 
 | |
|     // In this test we disable the button and check events are not sent and we
 | |
|     // do it once by disabling the previously enabled button and once by
 | |
|     // creating the button in the disabled state.
 | |
|     SECTION("Disable after creation")
 | |
|     {
 | |
|         m_button->Disable();
 | |
|     }
 | |
| 
 | |
|     SECTION("Create disabled")
 | |
|     {
 | |
|         delete m_button;
 | |
|         m_button = new wxButton();
 | |
|         m_button->Disable();
 | |
|         m_button->Create(wxTheApp->GetTopWindow(), wxID_ANY, "wxButton");
 | |
|     }
 | |
| 
 | |
|     EventCounter clicked(m_button, wxEVT_BUTTON);
 | |
| 
 | |
|     sim.MouseMove(m_button->GetScreenPosition() + wxPoint(10, 10));
 | |
|     wxYield();
 | |
| 
 | |
|     sim.MouseClick();
 | |
|     wxYield();
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL( 0, clicked.GetCount() );
 | |
| }
 | |
| 
 | |
| #endif // wxUSE_UIACTIONSIMULATOR
 | |
| 
 | |
| void ButtonTestCase::Auth()
 | |
| {
 | |
|     //Some functions only work on specific operating system versions, for
 | |
|     //this we need a runtime check
 | |
|     int major = 0;
 | |
| 
 | |
|     if(wxGetOsVersion(&major) != wxOS_WINDOWS_NT || major < 6)
 | |
|         return;
 | |
| 
 | |
|     //We are running Windows Vista or newer
 | |
|     CPPUNIT_ASSERT(!m_button->GetAuthNeeded());
 | |
| 
 | |
|     m_button->SetAuthNeeded();
 | |
| 
 | |
|     CPPUNIT_ASSERT(m_button->GetAuthNeeded());
 | |
| 
 | |
|     //We test both states
 | |
|     m_button->SetAuthNeeded(false);
 | |
| 
 | |
|     CPPUNIT_ASSERT(!m_button->GetAuthNeeded());
 | |
| }
 | |
| 
 | |
| void ButtonTestCase::BitmapMargins()
 | |
| {
 | |
|     //Some functions only work on specific platforms in which case we can use
 | |
|     //a preprocessor check
 | |
| #ifdef __WXMSW__
 | |
|     //We must set a bitmap before we can set its margins, when writing unit
 | |
|     //tests it is easiest to use an image from wxArtProvider
 | |
|     m_button->SetBitmap(wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER,
 | |
|                                                wxSize(32, 32)));
 | |
| 
 | |
|     m_button->SetBitmapMargins(15, 15);
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(wxSize(15, 15), m_button->GetBitmapMargins());
 | |
| 
 | |
|     m_button->SetBitmapMargins(wxSize(20, 20));
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(wxSize(20, 20), m_button->GetBitmapMargins());
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void ButtonTestCase::Bitmap()
 | |
| {
 | |
|     //We start with no bitmaps
 | |
|     CPPUNIT_ASSERT(!m_button->GetBitmap().IsOk());
 | |
| 
 | |
|     // Some bitmap, doesn't really matter which.
 | |
|     const wxBitmap bmp = wxArtProvider::GetBitmap(wxART_INFORMATION);
 | |
| 
 | |
|     m_button->SetBitmap(bmp);
 | |
| 
 | |
|     CPPUNIT_ASSERT(m_button->GetBitmap().IsOk());
 | |
| 
 | |
|     // Check that resetting the button label doesn't result in problems when
 | |
|     // updating the bitmap later, as it used to be the case in wxGTK (#18898).
 | |
|     m_button->SetLabel(wxString());
 | |
|     CHECK_NOTHROW( m_button->Disable() );
 | |
| }
 | |
| 
 | |
| #endif //wxUSE_BUTTON
 |