wxwidgets/tests/weakref/evtconnection.cpp
Vadim Zeitlin 4f4c5fcfdf Use nullptr instead of NULL in the code and documentation
This is a combination of running clang-tidy with modernize-use-nullptr
check for some ports (GTK, X11, OSX) and manual changes to the ports for
which it couldn't be used easily (MSW, DFB) and also manually updating
the docs.

Also replace NULL with null or nullptr in the comments as this is more
consistent with the use of nullptr in the code and makes it simpler to
grep for the remaining occurrences of NULL itself.

And also use null in the assert messages.

Only a few occurrences of "NULL" are still left in non-C files, mostly
corresponding to unclear comments or string output which it might not be
safe to change.
2022-10-18 01:25:25 +02:00

243 lines
6.5 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// 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"
#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 override { 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();
wxDECLARE_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,
nullptr, &ts);
eh2.Connect(wxEVT_TEST, (wxObjectEventFunction) &wxTestSink::OnTestEvent,
nullptr, &ts);
}
void DoDisconnect( wxEvtHandler& eh1, wxEvtHandler& eh2, wxTestSink& ts ){
eh1.Disconnect(wxEVT_TEST, (wxObjectEventFunction) &wxTestSink::OnTestEvent,
nullptr, &ts);
eh2.Disconnect(wxEVT_TEST, (wxObjectEventFunction) &wxTestSink::OnTestEvent,
nullptr, &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 = nullptr;
gs_psrc2 = &eh1;
{
// ...and one sink
wxTestSink ts;
eh1.Connect(wxEVT_TEST, (wxObjectEventFunction)&wxTestSink::OnTestEvent,
nullptr, &ts);
eh1.Connect(wxEVT_TEST1, (wxObjectEventFunction)&wxTestSink::OnTestEvent1,
nullptr, &ts);
eh1.Connect(wxEVT_TEST2, (wxObjectEventFunction)&wxTestSink::OnTestEvent2,
nullptr, &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,
nullptr, &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 );
}