00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkMessage.h"
00019
00020 #include "mitkTestingMacros.h"
00021
00022 #include <iostream>
00023
00024 namespace mitk
00025 {
00026
00027 class mitkMessageTestTestClass
00028 {
00029
00030 public:
00031
00032
00033 class Package
00034 {
00035 public:
00036
00037 Package(int content = 43)
00038 :m_Content(content)
00039 {
00040 }
00041
00042 void Clear()
00043 {
00044 m_Content = 0;
00045 }
00046
00047 bool operator==(const Package& other)
00048 {
00049 return m_Content == other.m_Content;
00050 }
00051
00052 private:
00053
00054 int m_Content;
00055 };
00056
00057 class MessageSenderClass
00058 {
00059 public:
00060
00061
00062 Message<> WaveHand;
00063
00064
00065 Message<> ShowFinger;
00066
00067
00068 Message1<const std::string&> Say;
00069
00070
00071 Message1<double> WalkMeters;
00072
00073
00074 Message1<const Package&> GivePackage;
00075
00076
00077 Message2<int, float> ShoutAgeAndFootSize;
00078
00079 void DoShowFinger()
00080 {
00081 ShowFinger.Send();
00082
00083 }
00084
00085 void DoWaveHand()
00086 {
00087 WaveHand();
00088
00089 }
00090
00091 void DoSay(const std::string& words)
00092 {
00093 Say(words);
00094 }
00095
00096 void DoWalk(double meters)
00097 {
00098 WalkMeters(meters);
00099 }
00100
00101 void DoGivePackage(const Package& package)
00102 {
00103 GivePackage.Send(package);
00104 }
00105
00106 void DoShoutAgeAndFootSize(int age, float size)
00107 {
00108 ShoutAgeAndFootSize(age, size);
00109 }
00110 };
00111
00112
00113
00114
00115 class MessageReceiverClass
00116 {
00117 public:
00118
00119 MessageReceiverClass()
00120 {
00121 Amnesia();
00122 }
00123
00124 void OnWaveHand()
00125 {
00126 m_HandWaved = true;
00127 }
00128
00129 bool HandWaved()
00130 {
00131 return m_HandWaved;
00132 }
00133
00134 void OnSay(const std::string& words)
00135 {
00136 m_WordsSaid = words;
00137 }
00138
00139 const std::string WordsSaid()
00140 {
00141 return m_WordsSaid;
00142 }
00143
00144 void OnWalk(double meters)
00145 {
00146 m_MetersWalked = meters;
00147 }
00148
00149 double MetersWalked()
00150 {
00151 return m_MetersWalked;
00152 }
00153
00154 void OnGivePackage(const Package& p)
00155 {
00156 m_PackageReceived = p;
00157 }
00158
00159 Package PackageReceived()
00160 {
00161 return m_PackageReceived;
00162 }
00163
00164 void OnShoutAgeAndFootSize(int age, float footSize)
00165 {
00166 m_Age = age;
00167 m_FootSize = footSize;
00168 }
00169
00170 int Age()
00171 {
00172 return m_Age;
00173 }
00174
00175 float FootSize()
00176 {
00177 return m_FootSize;
00178 }
00179
00180 void Amnesia()
00181 {
00182 m_HandWaved = false;
00183 m_WordsSaid.clear();
00184 m_MetersWalked = 0.0;
00185 m_PackageReceived.Clear();
00186 m_Age = 0;
00187 m_FootSize = 0.0;
00188 }
00189
00190 void RegisterObservers(MessageSenderClass& sender)
00191 {
00192 sender.WaveHand += MessageDelegate<MessageReceiverClass>( this, &MessageReceiverClass::OnWaveHand );
00193 sender.ShowFinger += MessageDelegate<MessageReceiverClass>( this, &MessageReceiverClass::OnWaveHand );
00194
00195 sender.Say += MessageDelegate1<MessageReceiverClass, const std::string&>( this, &MessageReceiverClass::OnSay );
00196 sender.WalkMeters += MessageDelegate1<MessageReceiverClass, double>( this, &MessageReceiverClass::OnWalk );
00197 sender.GivePackage += MessageDelegate1<MessageReceiverClass, const Package&>( this, &MessageReceiverClass::OnGivePackage );
00198 sender.ShoutAgeAndFootSize += MessageDelegate2<MessageReceiverClass, int, float>( this, &MessageReceiverClass::OnShoutAgeAndFootSize );
00199 }
00200
00201
00202 private:
00203
00204 bool m_HandWaved;
00205 std::string m_WordsSaid;
00206 double m_MetersWalked;
00207 Package m_PackageReceived;
00208 int m_Age;
00209 float m_FootSize;
00210 };
00211
00212
00213 class Law
00214 {
00215 private:
00216 std::string m_Description;
00217
00218 public:
00219
00220 Law(const std::string law) : m_Description(law)
00221 { }
00222
00223 std::string GetDescription() const
00224 {
00225 return m_Description;
00226 }
00227 };
00228
00229
00230 class NewtonMachine
00231 {
00232 mitkNewMessageMacro(AnalysisStarted);
00233 mitkNewMessage1Macro(AnalysisStopped, bool);
00234 mitkNewMessage1Macro(LawDiscovered, const Law&);
00235
00236
00237 public:
00238
00239 void StartAnalysis()
00240 {
00241
00242 m_AnalysisStartedMessage();
00243
00244
00245 Law massLaw("Unit tests are mandatory!");
00246 m_LawDiscoveredMessage(massLaw);
00247 }
00248
00249 void StopAnalysis()
00250 {
00251
00252
00253 m_AnalysisStoppedMessage(true);
00254 }
00255 bool PatentLaw()
00256 {
00257
00258
00259
00260 return false;
00261 }
00262 };
00263
00264 class Observer
00265 {
00266 private:
00267
00268 NewtonMachine* m_Machine;
00269
00270 public:
00271
00272 Observer(NewtonMachine* machine) :
00273 m_Machine(machine), m_MachineStarted(false), m_MachineStopped(false),
00274 m_Error(false), m_Law("NONE")
00275 {
00276
00277 m_Machine->AddAnalysisStartedListener(
00278 ::mitk::MessageDelegate<Observer>(this, &Observer::MachineStarted));
00279 m_Machine->AddAnalysisStoppedListener(
00280 ::mitk::MessageDelegate1<Observer, bool>(this, &Observer::MachineStopped));
00281 m_Machine->AddLawDiscoveredListener(
00282 ::mitk::MessageDelegate1<Observer, const Law&>(this, &Observer::LawDiscovered));
00283
00284
00285 }
00286
00287 ~Observer()
00288 {
00289
00290 m_Machine->RemoveAnalysisStartedListener(
00291 ::mitk::MessageDelegate<Observer>(this, &Observer::MachineStarted));
00292 m_Machine->RemoveAnalysisStoppedListener(
00293 ::mitk::MessageDelegate1<Observer, bool>(this, &Observer::MachineStopped));
00294 m_Machine->RemoveLawDiscoveredListener(
00295 ::mitk::MessageDelegate1<Observer, const Law&>(this, &Observer::LawDiscovered));
00296
00297
00298 }
00299
00300 void MachineStarted()
00301 {
00302 m_MachineStarted = true;
00303 }
00304
00305 void MachineStopped(bool error)
00306 {
00307 m_MachineStopped = true;
00308 m_Error = error;
00309 }
00310
00311 void LawDiscovered(const Law& law)
00312 {
00313 m_Law = law;
00314 }
00315 bool ReviewPatent()
00316 {
00317 m_PatentReviewed = true;
00318 return false;
00319 }
00320 bool m_MachineStarted;
00321 bool m_MachineStopped;
00322 bool m_Error;
00323 Law m_Law;
00324 bool m_PatentReviewed;
00325 };
00326
00327 };
00328
00329 }
00330
00331
00332 int mitkMessageTest(int , char* [])
00333 {
00334 MITK_TEST_BEGIN("Message")
00335
00336 mitk::mitkMessageTestTestClass::MessageSenderClass sender;
00337 mitk::mitkMessageTestTestClass::MessageReceiverClass receiver;
00338
00339 MITK_TEST_CONDITION_REQUIRED(true, "Testing instantiation");
00340
00341 receiver.RegisterObservers(sender);
00342
00343 MITK_TEST_CONDITION_REQUIRED(true, "Testing registration to messages");
00344
00345 MITK_TEST_CONDITION_REQUIRED(
00346 (sender.DoWaveHand(),
00347 receiver.HandWaved()),
00348 "Message without parameters");
00349 receiver.Amnesia();
00350
00351 MITK_TEST_CONDITION_REQUIRED(
00352 (sender.DoShowFinger(),
00353 receiver.HandWaved()),
00354 "Message without parameters");
00355 receiver.Amnesia();
00356
00357 MITK_TEST_CONDITION_REQUIRED(
00358 (sender.DoSay("Blooodworsch"),
00359 receiver.WordsSaid() == "Blooodworsch"),
00360 "Message with std::string parameter");
00361 receiver.Amnesia();
00362
00363 MITK_TEST_CONDITION_REQUIRED(
00364 (sender.DoWalk(2.67),
00365 (receiver.MetersWalked() - 2.67) < 0.0001 ),
00366 "Message with double parameter");
00367 receiver.Amnesia();
00368
00369 mitk::mitkMessageTestTestClass::Package package(8);
00370 MITK_TEST_CONDITION_REQUIRED(
00371 (sender.DoGivePackage(package),
00372 receiver.PackageReceived() == package),
00373 "Message with class parameter");
00374 receiver.Amnesia();
00375
00376 MITK_TEST_CONDITION_REQUIRED(
00377 (sender.DoShoutAgeAndFootSize(46, 30.5),
00378 (receiver.Age() == 46 && (receiver.FootSize() - 30.5 < 0.0001))),
00379 "Message with int AND float parameter");
00380 receiver.Amnesia();
00381
00382
00383 mitk::mitkMessageTestTestClass::NewtonMachine newtonMachine;
00384 mitk::mitkMessageTestTestClass::Observer observer1(&newtonMachine);
00385 mitk::mitkMessageTestTestClass::Observer observer2(&newtonMachine);
00386
00387
00388 newtonMachine.StartAnalysis();
00389 MITK_TEST_CONDITION(observer1.m_MachineStarted == true, "Message from Message Macro send to receiver 1");
00390 MITK_TEST_CONDITION(observer2.m_MachineStarted == true, "Message from Message Macro send to receiver 2");
00391
00392 MITK_TEST_CONDITION(observer1.m_Law.GetDescription() == std::string("Unit tests are mandatory!"),
00393 "Message1 from Message Macro send to receiver 1");
00394 MITK_TEST_CONDITION(observer2.m_Law.GetDescription() == std::string("Unit tests are mandatory!"),
00395 "Message1 from Message Macro send to receiver 2");
00396
00397
00398
00399 newtonMachine.StopAnalysis();
00400 MITK_TEST_CONDITION(observer1.m_MachineStopped == true, "Message1 from Message Macro send to receiver 1");
00401 MITK_TEST_CONDITION(observer1.m_Error == true, "Message1 parameter from Message Macro send to receiver 1");
00402
00403 MITK_TEST_CONDITION(observer2.m_MachineStopped == true, "Message1 from Message Macro send to receiver 2");
00404 MITK_TEST_CONDITION(observer2.m_Error == true, "Message1 parameter from Message Macro send to receiver 2");
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415 MITK_TEST_END();
00416 }