/tests/org/osflash/signals/MonoSignalTest.as

http://github.com/robertpenner/as3-signals · ActionScript · 308 lines · 229 code · 72 blank · 7 comment · 4 complexity · 7da83a52a456c8a6eeb7ccbdcd2dc221 MD5 · raw file

  1. package org.osflash.signals
  2. {
  3. import asunit.asserts.assertEquals;
  4. import asunit.asserts.assertNotNull;
  5. import asunit.asserts.assertNull;
  6. import asunit.asserts.assertTrue;
  7. import asunit.asserts.fail;
  8. import asunit.framework.IAsync;
  9. import org.osflash.signals.events.GenericEvent;
  10. import org.osflash.signals.events.IEvent;
  11. import flash.display.Sprite;
  12. import flash.errors.IllegalOperationError;
  13. /**
  14. * @author Simon Richardson - me@simonrichardson.info
  15. */
  16. public class MonoSignalTest
  17. {
  18. [Inject]
  19. public var async:IAsync;
  20. public var signal:MonoSignal;
  21. [Before]
  22. public function setUp():void
  23. {
  24. signal = new MonoSignal();
  25. }
  26. [After]
  27. public function tearDown():void
  28. {
  29. signal.removeAll();
  30. signal = null;
  31. }
  32. [Test]
  33. public function numListeners_is_0_after_creation():void
  34. {
  35. assertEquals(0, signal.numListeners);
  36. }
  37. [Test]
  38. public function dispatch_should_pass_event_to_listener_but_not_set_signal_or_target_properties():void
  39. {
  40. signal.add(async.add(checkGenericEvent, 10));
  41. signal.dispatch(new GenericEvent());
  42. }
  43. protected function checkGenericEvent(e:GenericEvent):void
  44. {
  45. assertNull('event.signal is not set by Signal', e.signal);
  46. assertNull('event.target is not set by Signal', e.target);
  47. }
  48. [Test(expects="flash.errors.IllegalOperationError")]
  49. public function add_two_listeners_should_throw_an_error():void
  50. {
  51. signal.add(checkGenericEvent);
  52. signal.add(checkGenericEvent);
  53. }
  54. [Test(expects="flash.errors.IllegalOperationError")]
  55. public function add_one_hundred_listeners_should_throw_an_error():void
  56. {
  57. for(var i:int = 0; i<100; i++)
  58. {
  59. signal.add(checkGenericEvent);
  60. }
  61. }
  62. [Test]
  63. public function add_one_listeners_then_remove_it_then_add_another_listener():void
  64. {
  65. signal.add(failIfCalled);
  66. signal.remove(failIfCalled);
  67. signal.add(checkGenericEvent);
  68. signal.dispatch(new GenericEvent());
  69. }
  70. [Test]
  71. public function addOnce_and_dispatch_should_remove_listener_automatically():void
  72. {
  73. signal.addOnce(newEmptyHandler());
  74. signal.dispatch(new GenericEvent());
  75. assertEquals('there should be no listeners', 0, signal.numListeners);
  76. }
  77. [Test]
  78. public function add_listener_then_remove_then_dispatch_should_not_call_listener():void
  79. {
  80. signal.add(failIfCalled);
  81. signal.remove(failIfCalled);
  82. signal.dispatch(new GenericEvent());
  83. }
  84. private function failIfCalled(e:IEvent):void
  85. {
  86. fail('This event handler should not have been called.');
  87. }
  88. [Test]
  89. public function add_listener_then_remove_function_not_in_listeners_should_do_nothing():void
  90. {
  91. signal.add(newEmptyHandler());
  92. signal.remove(newEmptyHandler());
  93. assertEquals(1, signal.numListeners);
  94. }
  95. private function newEmptyHandler():Function
  96. {
  97. return function(e:*):void {};
  98. }
  99. [Test(expects="flash.errors.IllegalOperationError")]
  100. public function addOnce_same_listener_twice_should_throw_error():void
  101. {
  102. var func:Function = newEmptyHandler();
  103. signal.addOnce(func);
  104. signal.addOnce(func);
  105. }
  106. [Test]
  107. public function dispatch_non_IEvent_without_error():void
  108. {
  109. signal.addOnce(checkSprite);
  110. // Sprite doesn't have a target property,
  111. // so if the signal tried to set .target,
  112. // an error would be thrown and this test would fail.
  113. signal.dispatch(new Sprite());
  114. }
  115. private function checkSprite(sprite:Sprite):void
  116. {
  117. assertTrue(sprite is Sprite);
  118. }
  119. [Test]
  120. public function adding_a_listener_during_dispatch_should_not_call_it():void
  121. {
  122. signal.add(async.add(addListenerDuringDispatch, 10));
  123. signal.dispatch(new GenericEvent());
  124. }
  125. private function addListenerDuringDispatch():void
  126. {
  127. try
  128. {
  129. signal.add(failIfCalled);
  130. }
  131. catch(error:IllegalOperationError)
  132. {
  133. assertTrue('there should be 1 listener', signal.numListeners == 1);
  134. }
  135. catch(error:Error)
  136. {
  137. fail('This error should not have been thrown.');
  138. }
  139. }
  140. [Test]
  141. public function removed_listener_should_return_slot():void
  142. {
  143. var listener:Function = function():void{};
  144. var slot:ISlot = signal.add(listener);
  145. assertTrue("Slot is returned", slot == signal.remove(listener));
  146. }
  147. [Test]
  148. public function removed_listener_should_be_returned():void
  149. {
  150. var slot:ISlot = signal.add(function():void{});
  151. var listener:Function = slot.listener;
  152. assertTrue("Slot is returned", slot == signal.remove(listener));
  153. }
  154. [Test]
  155. public function slot_params_are_null_when_created():void
  156. {
  157. var listener:Function = newEmptyHandler();
  158. var slot:ISlot = signal.add(listener);
  159. assertNull('params should be null', slot.params);
  160. }
  161. [Test]
  162. public function slot_params_should_not_be_null_after_adding_array():void
  163. {
  164. var listener:Function = newEmptyHandler();
  165. var slot:ISlot = signal.add(listener);
  166. slot.params = [];
  167. assertNotNull('params should not be null', slot.params);
  168. }
  169. [Test]
  170. public function slot_params_with_one_param_should_be_sent_through_to_listener():void
  171. {
  172. var listener:Function = function(...args):void
  173. {
  174. assertTrue(args[0] is int);
  175. assertEquals(args[0], 1234);
  176. };
  177. var slot:ISlot = signal.add(listener);
  178. slot.params = [1234];
  179. signal.dispatch();
  180. }
  181. [Test]
  182. public function slot_params_with_multiple_params_should_be_sent_through_to_listener():void
  183. {
  184. var listener:Function = function(...args):void
  185. {
  186. assertTrue(args[0] is int);
  187. assertEquals(args[0], 12345);
  188. assertTrue(args[1] is String);
  189. assertEquals(args[1], 'text');
  190. assertTrue(args[2] is Sprite);
  191. assertEquals(args[2], slot.params[2]);
  192. };
  193. var slot:ISlot = signal.add(listener);
  194. slot.params = [12345, 'text', new Sprite()];
  195. signal.dispatch();
  196. }
  197. [Test]
  198. public function verify_chaining_of_slot_params():void
  199. {
  200. var listener:Function = function(...args):void
  201. {
  202. assertEquals(args.length, 1);
  203. assertEquals(args[0], 1234567);
  204. };
  205. signal.add(listener).params = [1234567];
  206. signal.dispatch();
  207. }
  208. [Test]
  209. public function verify_chaining_and_concat_of_slot_params():void
  210. {
  211. var listener:Function = function(...args):void
  212. {
  213. assertEquals(args.length, 2);
  214. assertEquals(args[0], 12345678);
  215. assertEquals(args[1], 'text');
  216. };
  217. signal.add(listener).params = [12345678].concat(['text']);
  218. signal.dispatch();
  219. }
  220. [Test]
  221. public function verify_chaining_and_pushing_on_to_slot_params():void
  222. {
  223. var listener:Function = function(...args):void
  224. {
  225. assertEquals(args.length, 2);
  226. assertEquals(args[0], 123456789);
  227. assertEquals(args[1], 'text');
  228. };
  229. // This is ugly, but I put money on somebody will attempt to do this!
  230. var slots:ISlot;
  231. (slots = signal.add(listener)).params = [123456789];
  232. slots.params.push('text');
  233. signal.dispatch();
  234. }
  235. }
  236. }