Fix the test added in dfec7aa0c0 which
deleted the button pointer used by EventCounter by simply moving
EventCounter initialization after the button re-creation.
See #16385.
		
	
		
			
				
	
	
		
			188 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			5.0 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());
 | 
						|
 | 
						|
 | 
						|
    m_button->SetBitmap(wxArtProvider::GetIcon(wxART_INFORMATION,
 | 
						|
                                               wxART_OTHER,
 | 
						|
                                               wxSize(32, 32)));
 | 
						|
 | 
						|
    CPPUNIT_ASSERT(m_button->GetBitmap().IsOk());
 | 
						|
}
 | 
						|
 | 
						|
#endif //wxUSE_BUTTON
 |