ObjectDispatcherTest.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2006-2007 by Peter Dimov.
00004 
00005 This file is part of Calitko (http://www.calitko.org).
00006 
00007 Calitko is free software; you can redistribute it and/or modify
00008 it under the terms of the GNU General Public License as published by
00009 the Free Software Foundation; either version 2 of the License, or
00010 (at your option) any later version.
00011 
00012 Calitko is distributed in the hope that it will be useful,
00013 but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Calitko; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021 */
00022 
00023 #include "Qt.h"
00024 #include "../ObjectDispatcher.h"
00025 #include "Imports.cpp"
00026 
00027 namespace Utils {
00028 namespace Testing {
00029 
00030 class Packet
00031 {
00032 public:
00033     virtual ~Packet() {}
00034             Packet() {}
00035 };
00036 
00037 class PacketA : public Packet
00038 {
00039 public:
00040     PacketA() {}
00041 };
00042 
00043 class PacketB : public Packet
00044 {
00045 public:
00046     PacketB() {}
00047 };
00048 
00050 
00058 class ObjectDispatcherTest : public CppUnit::TestFixture
00059 {
00060     // \ŧodo Derive from a common base  that is a reference object!
00061     REFERENCE_OBJECT (ObjectDispatcherTest)
00062 
00063     CPPUNIT_TEST_SUITE (ObjectDispatcherTest);
00064     CPPUNIT_TEST (testNoHandlersSetNothingHappens);
00065     CPPUNIT_TEST (testSetStaticHandlersAndDispatchToThem);
00066     CPPUNIT_TEST (testSetMemberHandlersAndDispatchToThem);
00067     CPPUNIT_TEST (testSetCatchAllHandlerAndDispatchToIt);
00068     CPPUNIT_TEST (testHandlersCalledInTheirRegistrationOrder);
00069     CPPUNIT_TEST (testNotHandledHandlersOnlyCalledIfNoTypeHandlerRegistered);
00070     CPPUNIT_TEST (testStaticCatchAllHandlerWithSender);
00071     CPPUNIT_TEST (testUnregisterTypeHandlers);
00072     CPPUNIT_TEST_SUITE_END();
00073 
00074     typedef ObjectDispatcher <Packet, ObjectDispatcherTest> PacketDispatcher;
00075     auto_ptr <PacketDispatcher>         dispatcher;
00076 
00077     static const PacketA                packetA;
00078     static const PacketB                packetB;
00079 
00080     static bool hasCalledStaticHandlerPacketA;
00081     static void staticHandlerPacketA (const PacketA &packet)
00082     {
00083         CPPUNIT_ASSERT (&packet == &packetA);
00084         hasCalledStaticHandlerPacketA = true;
00085     }
00086 
00087     static bool hasCalledStaticHandlerPacketB;
00088     static void staticHandlerPacketB (const PacketB &packet)
00089     {
00090         CPPUNIT_ASSERT (&packet == &packetB);
00091         hasCalledStaticHandlerPacketB = true;
00092     }
00093 
00094     static bool hasCalledStaticCatchAllHandler;
00095     static void staticCatchAllHandler (const Packet &)
00096     {
00097         hasCalledStaticCatchAllHandler = true;
00098     }
00099 
00100     bool hasCalledMemberHandlerPacketA;
00101     void memberHandlerPacketA (const PacketA &packet)
00102     {
00103         CPPUNIT_ASSERT (&packet == &packetA);
00104         hasCalledMemberHandlerPacketA = true;
00105     }
00106 
00107     bool hasCalledMemberHandlerPacketA2;
00109     void memberHandlerPacketA2 (const PacketA &packet)
00110     {
00111         CPPUNIT_ASSERT (&packet == &packetA);
00112         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketA == true);
00113         hasCalledMemberHandlerPacketA2 = true;
00114     }
00115 
00116     bool hasCalledMemberHandlerPacketB;
00117     void memberHandlerPacketB (const PacketB &packet)
00118     {
00119         CPPUNIT_ASSERT (&packet == &packetB);
00120         hasCalledMemberHandlerPacketB = true;
00121     }
00122 
00123     bool hasCalledMemberCatchAllHandler;
00124     void memberCatchAllHandler (const Packet &)
00125     {
00126         hasCalledMemberCatchAllHandler = true;
00127     }
00128 
00129     bool hasCalledMemberCatchAllHandlerWithSender;
00130     void memberCatchAllHandlerWithSender (const Packet &,
00131                                           ObjectDispatcherTest *sender)
00132     {
00133         hasCalledMemberCatchAllHandlerWithSender = true;
00134         CPPUNIT_ASSERT (sender == this);
00135     }
00136 
00137 public:
00138     ObjectDispatcherTest()
00139      :  dispatcher(),
00140         hasCalledMemberHandlerPacketA (false),
00141         hasCalledMemberHandlerPacketA2 (false),
00142         hasCalledMemberHandlerPacketB (false),
00143         hasCalledMemberCatchAllHandler (false),
00144         hasCalledMemberCatchAllHandlerWithSender (false)
00145     {
00146     }
00147 
00148     void setUp()
00149     {
00150         dispatcher.reset (new PacketDispatcher);
00151     }
00152 
00153     void tearDown()
00154     {
00155         dispatcher.reset();
00156     }
00157 
00158     void testNoHandlersSetNothingHappens()
00159     {
00160         bool isDispatched = dispatcher->dispatch (packetA);
00161         CPPUNIT_ASSERT (isDispatched == false);
00162     }
00163 
00164     void testSetStaticHandlersAndDispatchToThem()
00165     {
00166         dispatcher->registerTypeHandler (
00167             Callable <void (const PacketA &)> (&staticHandlerPacketA));
00168         dispatcher->registerTypeHandler (
00169             Callable <void (const PacketB &)> (&staticHandlerPacketB));
00170 
00171         hasCalledStaticHandlerPacketA = false;
00172         hasCalledStaticHandlerPacketB = false;
00173 
00174         bool isDispatched = dispatcher->dispatch (packetA);
00175         CPPUNIT_ASSERT (isDispatched == true);
00176         CPPUNIT_ASSERT (hasCalledStaticHandlerPacketA == true);
00177         CPPUNIT_ASSERT (hasCalledStaticHandlerPacketB == false);
00178 
00179         isDispatched = dispatcher->dispatch (packetB);
00180         CPPUNIT_ASSERT (isDispatched == true);
00181         CPPUNIT_ASSERT (hasCalledStaticHandlerPacketB == true);
00182     }
00183 
00184     void testSetMemberHandlersAndDispatchToThem()
00185     {
00186         dispatcher->registerTypeHandler (
00187             Callable <void (const PacketA &)> (
00188                 this, &ObjectDispatcherTest::memberHandlerPacketA));
00189         dispatcher->registerTypeHandler (
00190             Callable <void (const PacketB &)> (
00191                 this, &ObjectDispatcherTest::memberHandlerPacketB));
00192 
00193         hasCalledMemberHandlerPacketA = false;
00194         hasCalledMemberHandlerPacketB = false;
00195 
00196         bool isDispatched = dispatcher->dispatch (packetA);
00197         CPPUNIT_ASSERT (isDispatched == true);
00198         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketA == true);
00199         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketB == false);
00200 
00201         isDispatched = dispatcher->dispatch (packetB);
00202         CPPUNIT_ASSERT (isDispatched == true);
00203         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketB == true);
00204     }
00205 
00206     void testSetCatchAllHandlerAndDispatchToIt()
00207     {
00208         dispatcher->registerCatchAllHandler (
00209             Callable <void (const Packet &)> (&staticCatchAllHandler));
00210         dispatcher->registerCatchAllHandler (
00211             Callable <void (const Packet &)> (
00212                 this, &ObjectDispatcherTest::memberCatchAllHandler));
00213 
00214         hasCalledStaticCatchAllHandler = false;
00215         hasCalledMemberCatchAllHandler = false;
00216         dispatcher->dispatch (packetA);
00217         CPPUNIT_ASSERT (hasCalledStaticCatchAllHandler == true);
00218         CPPUNIT_ASSERT (hasCalledMemberCatchAllHandler == true);
00219 
00220         hasCalledStaticCatchAllHandler = false;
00221         hasCalledMemberCatchAllHandler = false;
00222         dispatcher->dispatch (packetB);
00223         CPPUNIT_ASSERT (hasCalledStaticCatchAllHandler == true);
00224         CPPUNIT_ASSERT (hasCalledMemberCatchAllHandler == true);
00225     }
00226 
00227     void testHandlersCalledInTheirRegistrationOrder()
00228     {
00229         dispatcher->registerTypeHandler (
00230             Callable <void (const PacketA &)> (
00231                 this, &ObjectDispatcherTest::memberHandlerPacketA));
00232         dispatcher->registerTypeHandler (
00233             Callable <void (const PacketA &)> (
00234                 this, &ObjectDispatcherTest::memberHandlerPacketA2));
00235 
00236         hasCalledMemberHandlerPacketA = false;
00237         hasCalledMemberHandlerPacketA2 = false;
00238 
00239         bool isDispatched = dispatcher->dispatch (packetA);
00240         CPPUNIT_ASSERT (isDispatched == true);
00241         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketA == true);
00242         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketA2 == true);
00243         // The call order is checked in memberHandlerPacketA2().
00244     }
00245 
00251     void testNotHandledHandlersOnlyCalledIfNoTypeHandlerRegistered()
00252     {
00253         dispatcher->registerTypeHandler (
00254             Callable <void (const PacketA &)> (
00255                 this, &ObjectDispatcherTest::memberHandlerPacketA));
00256         dispatcher->registerNotHandledHandler (
00257             Callable <void (const Packet &)> (
00258                 this, &ObjectDispatcherTest::memberCatchAllHandler));
00259         dispatcher->registerNotHandledHandler (
00260             Callable <void (const Packet &)> (&staticCatchAllHandler));
00261 
00262         hasCalledMemberHandlerPacketA = false;
00263         hasCalledMemberCatchAllHandler = false;
00264         hasCalledStaticCatchAllHandler = false;
00265         // Not-handled handlers not invoked as a type handler is found:
00266         bool isDispatched = dispatcher->dispatch (packetA);
00267         CPPUNIT_ASSERT (isDispatched == true);
00268         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketA == true);
00269         CPPUNIT_ASSERT (hasCalledMemberCatchAllHandler == false);
00270         CPPUNIT_ASSERT (hasCalledStaticCatchAllHandler == false);
00271         // No type handler found, the not-handled handlers get invoked:
00272         isDispatched = dispatcher->dispatch (packetB);
00273         CPPUNIT_ASSERT (isDispatched == false);
00274         CPPUNIT_ASSERT (hasCalledMemberCatchAllHandler == true);
00275         CPPUNIT_ASSERT (hasCalledStaticCatchAllHandler == true);
00276     }
00277 
00282     void testStaticCatchAllHandlerWithSender()
00283     {
00284         dispatcher->registerCatchAllHandler (
00285             Callable <void (const Packet &, ObjectDispatcherTest *)> (
00286                 this, &ObjectDispatcherTest::memberCatchAllHandlerWithSender));
00287 
00288         hasCalledMemberCatchAllHandlerWithSender = false;
00289         bool isDispatched = dispatcher->dispatch (packetA, this);
00290         CPPUNIT_ASSERT (isDispatched == false);
00291         CPPUNIT_ASSERT (hasCalledMemberCatchAllHandlerWithSender == true);
00292     }
00293 
00294     void testUnregisterTypeHandlers()
00295     {
00296         // Register numerous type handlers first:
00297         dispatcher->registerTypeHandler (
00298             Callable <void (const PacketA &)> (&staticHandlerPacketA));
00299         dispatcher->registerTypeHandler (
00300             Callable <void (const PacketB &)> (&staticHandlerPacketB));
00301         dispatcher->registerTypeHandler (
00302             Callable <void (const PacketA &)> (
00303                 this, &ObjectDispatcherTest::memberHandlerPacketA));
00304         dispatcher->registerTypeHandler (
00305             Callable <void (const PacketB &)> (
00306                 this, &ObjectDispatcherTest::memberHandlerPacketB));
00307         // Unregister some of the registered type handlers next:
00308         dispatcher->unregisterTypeHandler (
00309             Callable <void (const PacketA &)> (&staticHandlerPacketA));
00310         dispatcher->unregisterTypeHandler (
00311             Callable <void (const PacketB &)> (&staticHandlerPacketB));
00312 
00313         // Verify that only the ones still registered were invoked:
00314         hasCalledStaticHandlerPacketA = false;
00315         hasCalledStaticHandlerPacketB = false;
00316         hasCalledMemberHandlerPacketA = false;
00317         hasCalledMemberHandlerPacketB = false;
00318 
00319         bool isDispatched = dispatcher->dispatch (packetA);
00320         CPPUNIT_ASSERT (isDispatched == true);
00321         CPPUNIT_ASSERT (hasCalledStaticHandlerPacketA == false);
00322         CPPUNIT_ASSERT (hasCalledStaticHandlerPacketB == false);
00323         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketA == true);
00324         CPPUNIT_ASSERT (hasCalledMemberHandlerPacketB == false);
00325 
00326         // Unregister the rest too:
00327         dispatcher->unregisterTypeHandler (
00328             Callable <void (const PacketA &)> (
00329                 this, &ObjectDispatcherTest::memberHandlerPacketA));
00330         dispatcher->unregisterTypeHandler (
00331             Callable <void (const PacketB &)> (
00332                 this, &ObjectDispatcherTest::memberHandlerPacketB));
00333         // Finally check that the object could not be dispatched (no handlers):
00334         isDispatched = dispatcher->dispatch (packetA);
00335         CPPUNIT_ASSERT (isDispatched == false);
00336     }
00337 };
00338 
00339 CPPUNIT_TEST_SUITE_REGISTRATION(ObjectDispatcherTest);
00340 
00341 bool ObjectDispatcherTest::hasCalledStaticHandlerPacketA = false;
00342 bool ObjectDispatcherTest::hasCalledStaticHandlerPacketB = false;
00343 bool ObjectDispatcherTest::hasCalledStaticCatchAllHandler = false;
00344 const PacketA ObjectDispatcherTest::packetA;
00345 const PacketB ObjectDispatcherTest::packetB;
00346 
00347 } // namespace Testing
00348 } // namespace Utils