/test/org/robotlegs/v2/view/impl/StageWatcher_BlockingTests.as

https://github.com/ZackPierce/robotlegs-framework · ActionScript · 192 lines · 130 code · 34 blank · 28 comment · 0 complexity · 0654c06021be3ef689fb36d491079def MD5 · raw file

  1. //------------------------------------------------------------------------------
  2. // Copyright (c) 2011 the original author or authors. All Rights Reserved.
  3. //
  4. // NOTICE: You are permitted to use, modify, and distribute this file
  5. // in accordance with the terms of the license agreement accompanying it.
  6. //------------------------------------------------------------------------------
  7. package org.robotlegs.v2.view.impl
  8. {
  9. import flash.display.DisplayObject;
  10. import flash.display.DisplayObjectContainer;
  11. import flash.display.Sprite;
  12. import mx.core.UIComponent;
  13. import org.fluint.uiImpersonation.UIImpersonator;
  14. import org.hamcrest.assertThat;
  15. import org.hamcrest.object.equalTo;
  16. import org.hamcrest.object.isFalse;
  17. import org.hamcrest.object.isTrue;
  18. import org.robotlegs.v2.view.api.IViewClassInfo;
  19. import org.robotlegs.v2.view.api.IViewWatcher;
  20. import org.robotlegs.v2.view.impl.support.ViewHandlerSupport;
  21. public class StageWatcher_BlockingTests
  22. {
  23. /*============================================================================*/
  24. /* Protected Properties */
  25. /*============================================================================*/
  26. protected var container:DisplayObjectContainer;
  27. protected var group:UIComponent;
  28. protected var watcher:IViewWatcher;
  29. /*============================================================================*/
  30. /* Test Setup and Teardown */
  31. /*============================================================================*/
  32. [Before(ui)]
  33. public function setUp():void
  34. {
  35. group = new UIComponent()
  36. container = new Sprite();
  37. watcher = new StageWatcher();
  38. group.addChild(container)
  39. UIImpersonator.addChild(group);
  40. }
  41. [After]
  42. public function tearDown():void
  43. {
  44. watcher = null;
  45. UIImpersonator.removeAllChildren();
  46. }
  47. /*============================================================================*/
  48. /* Tests */
  49. /*============================================================================*/
  50. [Test]
  51. public function bitmasking_should_work_as_expected():void
  52. {
  53. var combinedResponse:uint = 0;
  54. const interests:uint = uint(parseInt('0001', 2));
  55. const blockingResponse:uint = uint(parseInt('0011', 2));
  56. const skipFirst:Boolean = !((combinedResponse & 0xAAAAAAAA) ^ (interests << 1));
  57. combinedResponse |= blockingResponse;
  58. const skipSecond:Boolean = !((combinedResponse & 0xAAAAAAAA) ^ (interests << 1));
  59. assertThat(skipFirst, isFalse());
  60. assertThat(skipSecond, isTrue());
  61. // shift interest to form blocking interest
  62. assertThat(0x000001 << 1, equalTo(0x000002));
  63. assertThat(0x000004 << 1, equalTo(0x000008));
  64. }
  65. [Test]
  66. public function first_blocking_handler_should_block_second_handler_when_interests_are_the_same():void
  67. {
  68. const responses:Array =
  69. add_handlers_and_add_and_remove_view_and_return_results([
  70. new HandlerConfig(1, 1, true),
  71. new HandlerConfig(1, 1, true)
  72. ]);
  73. const secondHandlerAddedCalled:Boolean = HandlerResult(responses[1]).addedCallCount > 0;
  74. assertThat(secondHandlerAddedCalled, isFalse());
  75. }
  76. [Test]
  77. public function first_blocking_handler_should_not_block_second_handler_when_interests_are_different():void
  78. {
  79. const responses:Array =
  80. add_handlers_and_add_and_remove_view_and_return_results([
  81. new HandlerConfig(1, 1, true),
  82. new HandlerConfig(4, 4, true)
  83. ]);
  84. const secondHandlerAddedCalled:Boolean = HandlerResult(responses[1]).addedCallCount > 0;
  85. assertThat(secondHandlerAddedCalled, isTrue());
  86. }
  87. [Test]
  88. public function first_nonBlocking_handler_should_not_block_second_handler_when_interests_are_the_same():void
  89. {
  90. const responses:Array =
  91. add_handlers_and_add_and_remove_view_and_return_results([
  92. new HandlerConfig(1, 1, false),
  93. new HandlerConfig(1, 1, false)
  94. ]);
  95. const secondHandlerAddedCalled:Boolean = HandlerResult(responses[1]).addedCallCount > 0;
  96. assertThat(secondHandlerAddedCalled, isTrue());
  97. }
  98. /*============================================================================*/
  99. /* Private Functions */
  100. /*============================================================================*/
  101. private function add_handlers_and_add_and_remove_view_and_return_results(handlerConfigs:Array):Array
  102. {
  103. const view:Sprite = new Sprite();
  104. const results:Array = handlerConfigs.map(function(... rest):HandlerResult
  105. {
  106. return new HandlerResult();
  107. }, this);
  108. handlerConfigs.forEach(function(config:HandlerConfig, index:int, ... rest):void
  109. {
  110. var result:HandlerResult = results[index];
  111. var handler:ViewHandlerSupport = new ViewHandlerSupport(
  112. config.interests,
  113. config.interestsToHandle,
  114. config.blocking,
  115. function onAdded(view:DisplayObject, info:IViewClassInfo, response:uint):void
  116. {
  117. result.addedCallCount++;
  118. result.response = response;
  119. },
  120. function onRemoved(view:DisplayObject):void
  121. {
  122. result.removedCallCount++;
  123. });
  124. watcher.addHandler(handler, container);
  125. }, this);
  126. container.addChild(view);
  127. container.removeChild(view);
  128. return results;
  129. }
  130. }
  131. }
  132. class HandlerConfig
  133. {
  134. /*============================================================================*/
  135. /* Public Properties */
  136. /*============================================================================*/
  137. public var blocking:Boolean;
  138. public var interests:uint;
  139. public var interestsToHandle:uint;
  140. /*============================================================================*/
  141. /* Constructor */
  142. /*============================================================================*/
  143. public function HandlerConfig(interests:uint, interestsToHandle:uint, blocking:Boolean)
  144. {
  145. this.interests = interests;
  146. this.interestsToHandle = interestsToHandle;
  147. this.blocking = blocking;
  148. }
  149. }
  150. class HandlerResult
  151. {
  152. /*============================================================================*/
  153. /* Public Properties */
  154. /*============================================================================*/
  155. public var addedCallCount:uint;
  156. public var removedCallCount:uint;
  157. public var response:uint;
  158. }