utmessagemanager.pp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. unit utMessageManager;
  2. {$mode objfpc}{$H+}
  3. {$modeswitch functionreferences}
  4. interface
  5. uses
  6. Classes, SysUtils, fpcunit, testutils, testregistry, system.messaging;
  7. type
  8. { TMyMessage }
  9. TMyBaseMessage = Class(Specialize TMessage<String>)
  10. OnDestroy: TNotifyEvent;
  11. destructor Destroy; override;
  12. end;
  13. TMyMessage1 = Class(TMyBaseMessage);
  14. TMyMessage2 = Class(TMyBaseMessage);
  15. { TTestMessageManager }
  16. generic TTestMessageManager<T: TBaseMessageManager> = class(TTestCase)
  17. private
  18. FM1: TMyMessage1;
  19. FM2: TMyMessage2;
  20. FMID1 : Integer;
  21. FMID2 : Integer;
  22. FManager: T;
  23. FSenderHandled: Array[1..2] of TObject;
  24. FMessageHandled: Array[1..2] of TMessagebase;
  25. procedure DoDestroy1(Sender: TObject);
  26. procedure DoDestroy2(Sender: TObject);
  27. protected
  28. procedure DoMyMessage(const aSender : TObject; const aMessage : TMessagebase);
  29. procedure DoMyMessage2(const aSender : TObject; const aMessage : TMessagebase);
  30. procedure DoMyMessage1Unsubscribe2(const aSender : TObject; const aMessage : TMessagebase);
  31. procedure SetUp; override;
  32. procedure TearDown; override;
  33. Property Manager : T Read FManager Write FManager;
  34. Property Msg1 : TMyMessage1 Read FM1 Write FM1;
  35. Property Msg2 : TMyMessage2 Read FM2 Write FM2;
  36. Property MsgID1 : Integer Read FMID1 Write FMID1;
  37. Property MsgID2 : Integer Read FMID2 Write FMID2;
  38. published
  39. procedure TestHookUp;
  40. procedure TestRegisterMessage;
  41. procedure TestSendMessage;
  42. procedure TestSendMessage2;
  43. procedure TestSendMessageDelete;
  44. procedure TestUnsubscribe;
  45. procedure TestUnsubscribeMethod;
  46. procedure TestUnsubscribeRef;
  47. procedure TestUnsubscribeInMessage;
  48. end;
  49. TSimpleMessageManagerTest = Class(specialize TTestMessageManager<TSimpleMessageManager>);
  50. TDefaultMessageManagerTest = Class(specialize TTestMessageManager<TMessageManager>);
  51. implementation
  52. { TMyMessage }
  53. destructor TMyBaseMessage.Destroy;
  54. begin
  55. if Assigned(OnDestroy) then
  56. OnDestroy(Self);
  57. inherited Destroy;
  58. end;
  59. procedure TTestMessageManager.TestHookUp;
  60. var
  61. I : Integer;
  62. begin
  63. AssertNotnull(Manager);
  64. For I:=1 to 2 do
  65. begin
  66. AssertNull(Format('Msg %d',[I]),FMessageHandled[I]);
  67. AssertNull(Format('Sender %d',[I]),FSenderHandled[I]);
  68. end;
  69. end;
  70. procedure TTestMessageManager.TestRegisterMessage;
  71. begin
  72. Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage);
  73. // nothing to test. Just needs to compile (and no memleaks)
  74. end;
  75. procedure TTestMessageManager.TestSendMessage;
  76. begin
  77. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage);
  78. AssertTrue('Have Message registration ID',MsgID1>0);
  79. MsgID2:=Manager.SubscribeToMessage(TMyMessage2,@DoMyMessage2);
  80. AssertTrue('New Message registration ID',MsgID2>MsgID1);
  81. Manager.SendMessage(Self,Msg1,False);
  82. AssertNotNull('Message not destroyed',Msg1);
  83. AssertSame('Message handled',Msg1,FMessageHandled[1]);
  84. AssertSame('Sender passed',Self,FSenderHandled[1]);
  85. AssertNull('Message 2 not handled',FMessageHandled[2]);
  86. end;
  87. procedure TTestMessageManager.TestSendMessage2;
  88. begin
  89. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage);
  90. AssertTrue('Have Message registration ID',MsgID1>0);
  91. MsgID2:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage2);
  92. AssertTrue('New Message registration ID',MsgID2>MsgID1);
  93. Manager.SendMessage(Self,Msg1,False);
  94. AssertNotNull('Message not destroyed',Msg1);
  95. AssertSame('Message handled',Msg1,FMessageHandled[1]);
  96. AssertSame('Sender passed',Self,FSenderHandled[1]);
  97. AssertSame('Message handled second handler',Msg1,FMessageHandled[2]);
  98. AssertSame('Sender passed second handler',Self,FSenderHandled[2]);
  99. end;
  100. procedure TTestMessageManager.TestSendMessageDelete;
  101. var
  102. Was : TMyMessage1;
  103. begin
  104. Was:=Msg1;
  105. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage);
  106. AssertTrue('Have Message registration ID',MsgID1>0);
  107. MsgID2:=Manager.SubscribeToMessage(TMyMessage2,@DoMyMessage2);
  108. AssertTrue('New Message registration ID',MsgID2>MsgID1);
  109. Manager.SendMessage(Self,Msg1,True);
  110. AssertNull('Message destroyed',Msg1);
  111. AssertSame('Message handled',Was,FMessageHandled[1]);
  112. AssertSame('Sender passed',Self,FSenderHandled[1]);
  113. AssertNull('Message 2 not handled',FMessageHandled[2]);
  114. end;
  115. procedure TTestMessageManager.TestUnsubscribe;
  116. begin
  117. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage);
  118. Manager.Unsubscribe(TMyMessage1,MsgID1);
  119. Manager.SendMessage(Self,Msg1,False);
  120. AssertNotNull('Message not destroyed',Msg1);
  121. AssertNull('Message not handled',FMessageHandled[1]);
  122. end;
  123. procedure TTestMessageManager.TestUnsubscribeMethod;
  124. begin
  125. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage);
  126. Manager.Unsubscribe(TMyMessage1,@DoMyMessage);
  127. Manager.SendMessage(Self,Msg1,False);
  128. AssertNotNull('Message not destroyed',Msg1);
  129. AssertNull('Message not handled',FMessageHandled[1]);
  130. end;
  131. procedure TTestMessageManager.TestUnsubscribeRef;
  132. Procedure DoAMessage(const Sender : TObject; Const Msg : TMessageBase);
  133. begin
  134. FMessageHandled[1]:=Msg;
  135. FSenderHandled[1]:=Msg;
  136. end;
  137. var
  138. M : TMessageListener;
  139. begin
  140. M:=@DoAMessage;
  141. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,M);
  142. Manager.Unsubscribe(TMyMessage1,M);
  143. Manager.SendMessage(Self,Msg1,False);
  144. AssertNotNull('Message not destroyed',Msg1);
  145. AssertNull('Message not handled',FMessageHandled[1]);
  146. end;
  147. procedure TTestMessageManager.TestUnsubscribeInMessage;
  148. begin
  149. MsgID1:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage1Unsubscribe2);
  150. MsgID2:=Manager.SubscribeToMessage(TMyMessage1,@DoMyMessage2);
  151. AssertTrue('Have Message registration ID',MsgID1>0);
  152. AssertTrue('New Message registration ID',MsgID2>MsgID1);
  153. Manager.SendMessage(Self,Msg1,False);
  154. AssertNotNull('Message not destroyed',Msg1);
  155. AssertSame('Message handled',Msg1,FMessageHandled[1]);
  156. AssertSame('Message sender handled',Self,FSenderHandled[1]);
  157. AssertNull('Message 2 not handled',FMessageHandled[2]);
  158. AssertNull('Message 2 sender not handled',FSenderHandled[2]);
  159. end;
  160. procedure TTestMessageManager.DoMyMessage(const aSender: TObject;
  161. const aMessage: TMessagebase);
  162. begin
  163. FMessageHandled[1]:=aMessage;
  164. FSenderHandled[1]:=aSender;
  165. end;
  166. procedure TTestMessageManager.DoMyMessage2(const aSender: TObject;
  167. const aMessage: TMessagebase);
  168. begin
  169. FMessageHandled[2]:=aMessage;
  170. FSenderHandled[2]:=aSender;
  171. end;
  172. procedure TTestMessageManager.DoMyMessage1Unsubscribe2(const aSender: TObject;
  173. const aMessage: TMessagebase);
  174. begin
  175. FMessageHandled[1]:=aMessage;
  176. FSenderHandled[1]:=aSender;
  177. Manager.Unsubscribe(TMyMessage1,MsgID2);
  178. end;
  179. procedure TTestMessageManager.DoDestroy1(Sender : TObject);
  180. begin
  181. FM1:=Nil;
  182. end;
  183. procedure TTestMessageManager.DoDestroy2(Sender : TObject);
  184. begin
  185. FM2:=Nil;
  186. end;
  187. procedure TTestMessageManager.SetUp;
  188. var
  189. I : Integer;
  190. begin
  191. FManager:=T.Create;
  192. FM1:=TMyMessage1.Create('ABC');
  193. FM1.OnDestroy:=@DoDestroy1;
  194. FM2:=TMyMessage2.Create('DEF');
  195. FM2.OnDestroy:=@DoDestroy2;
  196. FMID1:=0;
  197. FMID2:=0;
  198. For I:=1 to 2 do
  199. begin
  200. FMessageHandled[I]:=Nil;
  201. FSenderHandled[I]:=Nil;
  202. end;
  203. end;
  204. procedure TTestMessageManager.TearDown;
  205. begin
  206. FreeAndNil(FManager);
  207. FreeAndNil(FM1);
  208. FreeAndNil(FM2);
  209. end;
  210. initialization
  211. RegisterTests([TSimpleMessageManagerTest,TDefaultMessageManagerTest]);
  212. end.