]> git.saurik.com Git - wxWidgets.git/commitdiff
add a unit test checking that events are really propagated as they're supposed to
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 16 Jan 2009 16:21:50 +0000 (16:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 16 Jan 2009 16:21:50 +0000 (16:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58146 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

13 files changed:
tests/Makefile.in
tests/events/propagation.cpp [new file with mode: 0644]
tests/makefile.bcc
tests/makefile.gcc
tests/makefile.vc
tests/makefile.wat
tests/test.bkl
tests/test.cpp
tests/test_test_gui.dsp
tests/test_vc7_test_gui.vcproj
tests/test_vc8_test_gui.vcproj
tests/test_vc9_test_gui.vcproj
tests/testprec.h

index 238d7ed381320cc690385291c0e98aeb35faa486..fa91752321aa7a5ddcb2c24f158fa2ce9cfc0a6e 100644 (file)
@@ -130,6 +130,7 @@ TEST_GUI_OBJECTS =  \
        test_gui_listctrltest.o \
        test_gui_textctrltest.o \
        test_gui_textentrytest.o \
+       test_gui_propagation.o \
        test_gui_rawbmp.o \
        test_gui_htmlwindow.o \
        test_gui_guifuncs.o \
@@ -565,6 +566,9 @@ test_gui_textctrltest.o: $(srcdir)/controls/textctrltest.cpp $(TEST_GUI_ODEP)
 test_gui_textentrytest.o: $(srcdir)/controls/textentrytest.cpp $(TEST_GUI_ODEP)
        $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/controls/textentrytest.cpp
 
+test_gui_propagation.o: $(srcdir)/events/propagation.cpp $(TEST_GUI_ODEP)
+       $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/events/propagation.cpp
+
 test_gui_rawbmp.o: $(srcdir)/image/rawbmp.cpp $(TEST_GUI_ODEP)
        $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/image/rawbmp.cpp
 
diff --git a/tests/events/propagation.cpp b/tests/events/propagation.cpp
new file mode 100644 (file)
index 0000000..27c395e
--- /dev/null
@@ -0,0 +1,207 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        tests/events/propagation.cpp
+// Purpose:     Test events propagation
+// Author:      Vadim Zeitlin
+// Created:     2009-01-16
+// RCS-ID:      $Id$
+// Copyright:   (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
+///////////////////////////////////////////////////////////////////////////////
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#include "testprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#endif // WX_PRECOMP
+
+#include "wx/event.h"
+#include "wx/scopeguard.h"
+
+namespace
+{
+
+// this string will record the execution of all handlers
+wxString g_str;
+
+// a custom event
+wxDEFINE_EVENT(TEST_EVT, wxCommandEvent);
+
+// a custom event handler
+class TestEvtHandler : public wxEvtHandler
+{
+public:
+    TestEvtHandler(char tag)
+        : m_tag(tag)
+    {
+        Connect(TEST_EVT, wxCommandEventHandler(TestEvtHandler::OnTest));
+    }
+
+    // override ProcessEvent() to confirm that it is called for all event
+    // handlers in the chain
+    virtual bool ProcessEvent(wxEvent& event)
+    {
+        if ( event.GetEventType() == TEST_EVT )
+            g_str += 'o'; // "o" == "overridden"
+
+        return wxEvtHandler::ProcessEvent(event);
+    }
+
+private:
+    void OnTest(wxCommandEvent& event)
+    {
+        g_str += m_tag;
+
+        event.Skip();
+    }
+
+    const char m_tag;
+
+    DECLARE_NO_COPY_CLASS(TestEvtHandler)
+};
+
+// a window handling the test event
+class TestWindow : public wxWindow
+{
+public:
+    TestWindow(wxWindow *parent, char tag)
+        : wxWindow(parent, wxID_ANY),
+          m_tag(tag)
+    {
+        Connect(TEST_EVT, wxCommandEventHandler(TestWindow::OnTest));
+    }
+
+private:
+    void OnTest(wxCommandEvent& event)
+    {
+        g_str += m_tag;
+
+        event.Skip();
+    }
+
+    const char m_tag;
+
+    DECLARE_NO_COPY_CLASS(TestWindow)
+};
+
+int DoFilterEvent(wxEvent& event)
+{
+    if ( event.GetEventType() == TEST_EVT )
+        g_str += 'a';
+
+    return -1;
+}
+
+bool DoProcessEvent(wxEvent& event)
+{
+    if ( event.GetEventType() == TEST_EVT )
+        g_str += 'A';
+
+    return false;
+}
+
+} // anonymous namespace
+
+// --------------------------------------------------------------------------
+// test class
+// --------------------------------------------------------------------------
+
+class EventPropagationTestCase : public CppUnit::TestCase
+{
+public:
+    EventPropagationTestCase() {}
+
+    virtual void setUp();
+    virtual void tearDown();
+
+private:
+    CPPUNIT_TEST_SUITE( EventPropagationTestCase );
+        CPPUNIT_TEST( OneHandler );
+        CPPUNIT_TEST( TwoHandlers );
+        CPPUNIT_TEST( WindowWithoutHandler );
+        CPPUNIT_TEST( WindowWithHandler );
+    CPPUNIT_TEST_SUITE_END();
+
+    void OneHandler();
+    void TwoHandlers();
+    void WindowWithoutHandler();
+    void WindowWithHandler();
+
+    DECLARE_NO_COPY_CLASS(EventPropagationTestCase)
+};
+
+// register in the unnamed registry so that these tests are run by default
+CPPUNIT_TEST_SUITE_REGISTRATION( EventPropagationTestCase );
+
+// also include in it's own registry so that these tests can be run alone
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( EventPropagationTestCase, "EventPropagationTestCase" );
+
+void EventPropagationTestCase::setUp()
+{
+    SetFilterEventFunc(DoFilterEvent);
+    SetProcessEventFunc(DoProcessEvent);
+
+    g_str.clear();
+}
+
+void EventPropagationTestCase::tearDown()
+{
+    SetFilterEventFunc(NULL);
+    SetProcessEventFunc(NULL);
+}
+
+void EventPropagationTestCase::OneHandler()
+{
+    wxCommandEvent event(TEST_EVT);
+    TestEvtHandler h1('1');
+    h1.ProcessEvent(event);
+    CPPUNIT_ASSERT_EQUAL( "oa1A", g_str );
+}
+
+void EventPropagationTestCase::TwoHandlers()
+{
+    wxCommandEvent event(TEST_EVT);
+    TestEvtHandler h1('1');
+    TestEvtHandler h2('2');
+    h1.SetNextHandler(&h2);
+    h2.SetPreviousHandler(&h1);
+    h1.ProcessEvent(event);
+    CPPUNIT_ASSERT_EQUAL( "oa1o2A", g_str );
+}
+
+void EventPropagationTestCase::WindowWithoutHandler()
+{
+    wxCommandEvent event(TEST_EVT);
+    TestWindow * const parent = new TestWindow(wxTheApp->GetTopWindow(), 'p');
+    wxON_BLOCK_EXIT_OBJ0( *parent, wxWindow::Destroy );
+
+    TestWindow * const child = new TestWindow(parent, 'c');
+
+    child->ProcessEvent(event);
+    CPPUNIT_ASSERT_EQUAL( "acpA", g_str );
+}
+
+void EventPropagationTestCase::WindowWithHandler()
+{
+    wxCommandEvent event(TEST_EVT);
+    TestWindow * const parent = new TestWindow(wxTheApp->GetTopWindow(), 'p');
+    wxON_BLOCK_EXIT_OBJ0( *parent, wxWindow::Destroy );
+
+    TestWindow * const child = new TestWindow(parent, 'c');
+
+    TestEvtHandler h1('1');
+    child->PushEventHandler(&h1);
+    wxON_BLOCK_EXIT_OBJ0( *child, wxWindow::PopEventHandler );
+    TestEvtHandler h2('2');
+    child->PushEventHandler(&h2);
+    wxON_BLOCK_EXIT_OBJ0( *child, wxWindow::PopEventHandler );
+
+    child->HandleWindowEvent(event);
+    CPPUNIT_ASSERT_EQUAL( "oa2o1cpA", g_str );
+}
+
index cf776115eb44d281a9c82c1234857c7c502104b2..57b50ecb1b6a78427ad1d92f9c806f312ff55c38 100644 (file)
@@ -115,6 +115,7 @@ TEST_GUI_OBJECTS =  \
        $(OBJS)\test_gui_listctrltest.obj \
        $(OBJS)\test_gui_textctrltest.obj \
        $(OBJS)\test_gui_textentrytest.obj \
+       $(OBJS)\test_gui_propagation.obj \
        $(OBJS)\test_gui_rawbmp.obj \
        $(OBJS)\test_gui_htmlwindow.obj \
        $(OBJS)\test_gui_guifuncs.obj \
@@ -605,6 +606,9 @@ $(OBJS)\test_gui_textctrltest.obj: .\controls\textctrltest.cpp
 $(OBJS)\test_gui_textentrytest.obj: .\controls\textentrytest.cpp
        $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\controls\textentrytest.cpp
 
+$(OBJS)\test_gui_propagation.obj: .\events\propagation.cpp
+       $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\events\propagation.cpp
+
 $(OBJS)\test_gui_rawbmp.obj: .\image\rawbmp.cpp
        $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\image\rawbmp.cpp
 
index b8d228d2dcaf8e4bce1a7e8d8212f073ba7a5cbd..5d5018057af583a60a380678b39c44bee3598af2 100644 (file)
@@ -108,6 +108,7 @@ TEST_GUI_OBJECTS =  \
        $(OBJS)\test_gui_listctrltest.o \
        $(OBJS)\test_gui_textctrltest.o \
        $(OBJS)\test_gui_textentrytest.o \
+       $(OBJS)\test_gui_propagation.o \
        $(OBJS)\test_gui_rawbmp.o \
        $(OBJS)\test_gui_htmlwindow.o \
        $(OBJS)\test_gui_guifuncs.o \
@@ -585,6 +586,9 @@ $(OBJS)\test_gui_textctrltest.o: ./controls/textctrltest.cpp
 $(OBJS)\test_gui_textentrytest.o: ./controls/textentrytest.cpp
        $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\test_gui_propagation.o: ./events/propagation.cpp
+       $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\test_gui_rawbmp.o: ./image/rawbmp.cpp
        $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
 
index 118fde08ef8fcfa8cfaf913f3d1ba25e0a441b6a..4370ab158cff42bb514516db20887da8d824ff03 100644 (file)
@@ -111,6 +111,7 @@ TEST_GUI_OBJECTS =  \
        $(OBJS)\test_gui_listctrltest.obj \
        $(OBJS)\test_gui_textctrltest.obj \
        $(OBJS)\test_gui_textentrytest.obj \
+       $(OBJS)\test_gui_propagation.obj \
        $(OBJS)\test_gui_rawbmp.obj \
        $(OBJS)\test_gui_htmlwindow.obj \
        $(OBJS)\test_gui_guifuncs.obj \
@@ -690,6 +691,9 @@ $(OBJS)\test_gui_textctrltest.obj: .\controls\textctrltest.cpp
 $(OBJS)\test_gui_textentrytest.obj: .\controls\textentrytest.cpp
        $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\controls\textentrytest.cpp
 
+$(OBJS)\test_gui_propagation.obj: .\events\propagation.cpp
+       $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\events\propagation.cpp
+
 $(OBJS)\test_gui_rawbmp.obj: .\image\rawbmp.cpp
        $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\image\rawbmp.cpp
 
index 0a2d4409028d24b510b350ff5e171c580aac9d6d..59c74ef3d1c4316ea6072a447c0b00c092d87d82 100644 (file)
@@ -342,6 +342,7 @@ TEST_GUI_OBJECTS =  &
        $(OBJS)\test_gui_listctrltest.obj &
        $(OBJS)\test_gui_textctrltest.obj &
        $(OBJS)\test_gui_textentrytest.obj &
+       $(OBJS)\test_gui_propagation.obj &
        $(OBJS)\test_gui_rawbmp.obj &
        $(OBJS)\test_gui_htmlwindow.obj &
        $(OBJS)\test_gui_guifuncs.obj &
@@ -642,6 +643,9 @@ $(OBJS)\test_gui_textctrltest.obj :  .AUTODEPEND .\controls\textctrltest.cpp
 $(OBJS)\test_gui_textentrytest.obj :  .AUTODEPEND .\controls\textentrytest.cpp
        $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
 
+$(OBJS)\test_gui_propagation.obj :  .AUTODEPEND .\events\propagation.cpp
+       $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
+
 $(OBJS)\test_gui_rawbmp.obj :  .AUTODEPEND .\image\rawbmp.cpp
        $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
 
index d7e0581953be1f2533a3f0c5fc07099c6ffe40ed..7122b54a83ad4b75a6670da2c39bd771ff06aa71 100644 (file)
             controls/listctrltest.cpp
             controls/textctrltest.cpp
             controls/textentrytest.cpp
+            events/propagation.cpp
             image/rawbmp.cpp
             html/htmlwindow.cpp
             misc/guifuncs.cpp
index 9b1f65d0650f92a83ac344e21b671b273542a6c6..00d746b2f8db510bdd5b72d47d87ae270ac8d598 100644 (file)
@@ -92,6 +92,13 @@ public:
     virtual int  OnRun();
     virtual int  OnExit();
 
+    // used by events propagation test
+    virtual int FilterEvent(wxEvent& event);
+    virtual bool ProcessEvent(wxEvent& event);
+
+    void SetFilterEventFunc(FilterEventFunc f) { m_filterEventFunc = f; }
+    void SetProcessEventFunc(ProcessEventFunc f) { m_processEventFunc = f; }
+
 #ifdef __WXDEBUG__
     virtual void OnAssertFailure(const wxChar *,
                                  int,
@@ -112,6 +119,10 @@ private:
     bool m_detail;
     bool m_timing;
     vector<string> m_registries;
+
+    // event handling hooks
+    FilterEventFunc m_filterEventFunc;
+    ProcessEventFunc m_processEventFunc;
 };
 
 IMPLEMENT_APP_CONSOLE(TestApp)
@@ -120,6 +131,8 @@ TestApp::TestApp()
   : m_list(false),
     m_longlist(false)
 {
+    m_filterEventFunc = NULL;
+    m_processEventFunc = NULL;
 }
 
 // Init
@@ -185,6 +198,33 @@ bool TestApp::OnCmdLineParsed(wxCmdLineParser& parser)
     return TestAppBase::OnCmdLineParsed(parser);
 }
 
+// Event handling
+int TestApp::FilterEvent(wxEvent& event)
+{
+    if ( m_filterEventFunc )
+        return (*m_filterEventFunc)(event);
+
+    return TestAppBase::FilterEvent(event);
+}
+
+bool TestApp::ProcessEvent(wxEvent& event)
+{
+    if ( m_processEventFunc )
+        return (*m_processEventFunc)(event);
+
+    return TestAppBase::ProcessEvent(event);
+}
+
+extern void SetFilterEventFunc(FilterEventFunc func)
+{
+    wxGetApp().SetFilterEventFunc(func);
+}
+
+extern void SetProcessEventFunc(ProcessEventFunc func)
+{
+    wxGetApp().SetProcessEventFunc(func);
+}
+
 // Run
 //
 int TestApp::OnRun()
index 5f38dcfc3164054a583aab36e80516ca91fbf017..56db639fbe514554e9a63e12641e02b9faf5ec80 100644 (file)
@@ -277,6 +277,10 @@ SOURCE=.\geometry\point.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\events\propagation.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\image\rawbmp.cpp\r
 # End Source File\r
 # Begin Source File\r
index 06bb91328752c7b9418634ac8b2f6c942a9a1f2a..66a78cc7cd934dfaa57e695cfbc0cc7dbdecd12f 100644 (file)
                        <File\r
                                RelativePath=".\geometry\point.cpp">\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\events\propagation.cpp">\r
+                       </File>\r
                        <File\r
                                RelativePath=".\image\rawbmp.cpp">\r
                        </File>\r
index 23c3f3f3db43251b2f079a3047f953eca5634771..b3a4c68524ecea79d1ecde83b6edd5a958c801fd 100644 (file)
                                RelativePath=".\geometry\point.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\events\propagation.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath=".\image\rawbmp.cpp"\r
                                >\r
index cb75cd6887522fdf7084e665a6825d9bf5beaf6c..0890d6efedfb7eb9f5953715e9e7c3ce751625ed 100644 (file)
                                RelativePath=".\geometry\point.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\events\propagation.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath=".\image\rawbmp.cpp"\r
                                >\r
index 84edfc45eb67a2306b9ce2bbe59dd9c8a7ca4fb2..ba2cf67c56b6ba726529c81617bc371e3c6cda20 100644 (file)
@@ -27,3 +27,10 @@ class TestAssertFailure { };
     #define WX_ASSERT_FAILS_WITH_ASSERT(cond) CPPUNIT_ASSERT(!(cond))
 #endif
 
+// these functions can be used to hook into wxApp event processing and are
+// currently used by the events propagation test
+typedef int (*FilterEventFunc)(wxEvent&);
+typedef bool (*ProcessEventFunc)(wxEvent&);
+
+extern void SetFilterEventFunc(FilterEventFunc func);
+extern void SetProcessEventFunc(ProcessEventFunc func);