| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/weakref/evtconnection.cpp
- // Purpose: wxWeakRef<T> unit test
- // Author: Arne Steinarson
- // Created: 2008-01-10
- // Copyright: (c) 2007 Arne Steinarson
- ///////////////////////////////////////////////////////////////////////////////
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- #include "testprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif // WX_PRECOMP
- #include "wx/event.h"
- #include "wx/weakref.h"
- static int gs_value = 0; // Increased by 1 by first object and 0x10000 by 2nd object
- static wxObject *gs_psrc1;
- static wxObject *gs_psrc2;
- // We need some event types
- const wxEventType wxEVT_TEST = wxNewEventType(),
- wxEVT_TEST1 = wxNewEventType(),
- wxEVT_TEST2 = wxNewEventType();
- class wxTestEvent : public wxEvent
- {
- public:
- wxTestEvent(wxEventType type = wxEVT_TEST) : wxEvent(0, type) { }
- virtual wxEvent *Clone() const { return new wxTestEvent(GetEventType()); }
- };
- class wxTestSink : public wxEvtHandler
- {
- public:
- void OnTestEvent(wxEvent& evt)
- {
- if ( evt.GetEventObject() == gs_psrc1 )
- gs_value += 1;
- else if ( evt.GetEventObject() == gs_psrc2 )
- gs_value += 0x10000;
- }
- void OnTestEvent1(wxEvent& )
- {
- gs_value += 0x00100;
- }
- void OnTestEvent2(wxEvent&)
- {
- gs_value += 0x01000000;
- }
- };
- // --------------------------------------------------------------------------
- // test class
- // --------------------------------------------------------------------------
- class EvtConnectionTestCase : public CppUnit::TestCase
- {
- public:
- EvtConnectionTestCase() {}
- private:
- CPPUNIT_TEST_SUITE( EvtConnectionTestCase );
- CPPUNIT_TEST( SinkTest );
- CPPUNIT_TEST( SourceDestroyTest );
- CPPUNIT_TEST( MultiConnectionTest );
- CPPUNIT_TEST_SUITE_END();
- void SinkTest();
- void SourceDestroyTest();
- void MultiConnectionTest();
- DECLARE_NO_COPY_CLASS(EvtConnectionTestCase)
- };
- // register in the unnamed registry so that these tests are run by default
- CPPUNIT_TEST_SUITE_REGISTRATION( EvtConnectionTestCase );
- // also include in its own registry so that these tests can be run alone
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( EvtConnectionTestCase, "EvtConnectionTestCase" );
- // Helpers
- void DoConnect( wxEvtHandler& eh1, wxEvtHandler& eh2, wxTestSink& ts ){
- eh1.Connect(wxEVT_TEST, (wxObjectEventFunction)&wxTestSink::OnTestEvent,
- NULL, &ts);
- eh2.Connect(wxEVT_TEST, (wxObjectEventFunction) &wxTestSink::OnTestEvent,
- NULL, &ts);
- }
- void DoDisconnect( wxEvtHandler& eh1, wxEvtHandler& eh2, wxTestSink& ts ){
- eh1.Disconnect(wxEVT_TEST, (wxObjectEventFunction) &wxTestSink::OnTestEvent,
- NULL, &ts);
- eh2.Disconnect(wxEVT_TEST, (wxObjectEventFunction) &wxTestSink::OnTestEvent,
- NULL, &ts);
- }
- void EvtConnectionTestCase::SinkTest()
- {
- // Let the sink be destroyed before the sources
- // An event used below
- wxTestEvent evt;
- // Connect two event handlers to one sink
- wxEvtHandler eh1, eh2;
- gs_psrc1 = &eh1;
- gs_psrc2 = &eh2;
- {
- wxTestSink ts;
- CPPUNIT_ASSERT( !ts.GetFirst() );
- DoConnect(eh1, eh2, ts);
- DoDisconnect(eh1, eh2, ts);
- DoConnect(eh1, eh2, ts);
- // Fire events
- evt.SetEventObject(&eh1);
- eh1.ProcessEvent(evt);
- evt.SetEventObject(&eh2);
- eh2.ProcessEvent(evt);
- // Make sure they were processed correctly
- CPPUNIT_ASSERT_EQUAL( 0x00010001, gs_value );
- }
- // Fire events again, should be no sink connected now
- gs_value = 0;
- evt.SetEventObject(&eh1);
- eh1.ProcessEvent( evt );
- evt.SetEventObject(&eh2);
- eh2.ProcessEvent( evt );
- // Make sure no processing happened
- CPPUNIT_ASSERT_EQUAL( 0, gs_value );
- }
- void EvtConnectionTestCase::SourceDestroyTest()
- {
- // Let the sources be destroyed before the sink
- wxTestSink ts;
- wxTestEvent evt;
- {
- wxEvtHandler eh1;
- {
- CPPUNIT_ASSERT( !ts.GetFirst() );
- // Connect two event handlers to one sink
- wxEvtHandler eh2;
- gs_psrc1 = &eh1;
- gs_psrc2 = &eh2;
- DoConnect( eh1, eh2, ts );
- // Fire events
- gs_value = 0;
- evt.SetEventObject(&eh1);
- eh1.ProcessEvent( evt );
- evt.SetEventObject(&eh2);
- eh2.ProcessEvent( evt );
- // Make sure they were processed correctly
- CPPUNIT_ASSERT_EQUAL( 0x00010001, gs_value );
- }
- gs_value = 0;
- evt.SetEventObject(&eh1);
- eh1.ProcessEvent( evt );
- // Make sure still connected
- CPPUNIT_ASSERT_EQUAL( 0x00000001, gs_value );
- }
- CPPUNIT_ASSERT( !ts.GetFirst() );
- }
- void EvtConnectionTestCase::MultiConnectionTest()
- {
- // events used below
- wxTestEvent evt;
- wxTestEvent evt1(wxEVT_TEST1);
- wxTestEvent evt2(wxEVT_TEST2);
- // One source
- wxEvtHandler eh1;
- evt.SetEventObject(&eh1);
- gs_psrc1 = NULL;
- gs_psrc2 = &eh1;
- {
- // ...and one sink
- wxTestSink ts;
- eh1.Connect(wxEVT_TEST, (wxObjectEventFunction)&wxTestSink::OnTestEvent,
- NULL, &ts);
- eh1.Connect(wxEVT_TEST1, (wxObjectEventFunction)&wxTestSink::OnTestEvent1,
- NULL, &ts);
- eh1.Connect(wxEVT_TEST2, (wxObjectEventFunction)&wxTestSink::OnTestEvent2,
- NULL, &ts);
- // Generate events
- gs_value = 0;
- eh1.ProcessEvent(evt);
- eh1.ProcessEvent(evt1);
- eh1.ProcessEvent(evt2);
- CPPUNIT_ASSERT( gs_value==0x01010100 );
- {
- // Declare weak references to the objects (using same list)
- wxEvtHandlerRef re(&eh1), rs(&ts);
- }
- // And now destroyed
- eh1.Disconnect(wxEVT_TEST, (wxObjectEventFunction)&wxTestSink::OnTestEvent,
- NULL, &ts);
- eh1.ProcessEvent(evt);
- eh1.ProcessEvent(evt1);
- eh1.ProcessEvent(evt2);
- CPPUNIT_ASSERT_EQUAL( 0x02010200, gs_value );
- }
- // No connection should be left now
- gs_value = 0;
- eh1.ProcessEvent(evt);
- eh1.ProcessEvent(evt1);
- eh1.ProcessEvent(evt2);
- // Nothing should have been done
- CPPUNIT_ASSERT_EQUAL( 0, gs_value );
- }
|