ObjectDispatcherTest.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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
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
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
00308 dispatcher->unregisterTypeHandler (
00309 Callable <void (const PacketA &)> (&staticHandlerPacketA));
00310 dispatcher->unregisterTypeHandler (
00311 Callable <void (const PacketB &)> (&staticHandlerPacketB));
00312
00313
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
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
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 }
00348 }