/test/robotlegs/bender/extensions/viewManager/impl/ContainerRegistryTest.as

https://github.com/creynders/robotlegs-framework · ActionScript · 284 lines · 200 code · 57 blank · 27 comment · 1 complexity · c3132ce890cef13e4503e3af823422e2 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 robotlegs.bender.extensions.viewManager.impl
  8. {
  9. import flash.display.DisplayObjectContainer;
  10. import flash.display.Sprite;
  11. import org.flexunit.assertThat;
  12. import org.flexunit.asserts.assertEquals;
  13. import org.flexunit.asserts.assertEqualsVectorsIgnoringOrder;
  14. import org.hamcrest.object.equalTo;
  15. import org.hamcrest.object.nullValue;
  16. import robotlegs.bender.extensions.viewManager.api.IViewHandler;
  17. import robotlegs.bender.extensions.viewManager.support.CallbackViewHandler;
  18. import robotlegs.bender.extensions.viewManager.support.TreeSpriteSupport;
  19. public class ContainerRegistryTest
  20. {
  21. /*============================================================================*/
  22. /* Private Properties */
  23. /*============================================================================*/
  24. private var registry:ContainerRegistry;
  25. private var container:DisplayObjectContainer;
  26. /*============================================================================*/
  27. /* Test Setup and Teardown */
  28. /*============================================================================*/
  29. [Before]
  30. public function before():void
  31. {
  32. registry = new ContainerRegistry();
  33. container = new Sprite();
  34. }
  35. /*============================================================================*/
  36. /* Tests */
  37. /*============================================================================*/
  38. [Test]
  39. public function addContainer():void
  40. {
  41. registry.addContainer(container);
  42. }
  43. [Test]
  44. public function finds_correct_nearest_interested_container_view_and_returns_its_binding():void
  45. {
  46. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  47. registry.addContainer(searchTrees[0]);
  48. registry.addContainer(searchTrees[1]);
  49. var correctTree:TreeSpriteSupport = searchTrees[1];
  50. var searchItem:Sprite = correctTree.children[3].children[3].children[3].children[3];
  51. var result:ContainerBinding = registry.findParentBinding(searchItem);
  52. // TODO: use a matcher
  53. assertEquals("Finds correct nearest interested container view and returns its binding", correctTree, result.container);
  54. }
  55. [Test]
  56. public function binding_returns_with_correct_interested_parent_chain():void
  57. {
  58. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  59. registry.addContainer(searchTrees[0]);
  60. registry.addContainer(searchTrees[1]);
  61. registry.addContainer(searchTrees[1].children[3]);
  62. var searchItem:Sprite = searchTrees[1].children[3].children[3].children[3].children[3];
  63. var result:ContainerBinding = registry.findParentBinding(searchItem);
  64. // TODO: use a matcher
  65. assertEquals("Binding returns with correct container view", searchTrees[1].children[3], result.container);
  66. assertEquals("Binding returns with correct container parent view", searchTrees[1], result.parent.container);
  67. assertEquals("Further parents are null", null, result.parent.parent);
  68. }
  69. [Test]
  70. public function binding_returns_with_correct_interested_parent_chain_if_interested_views_added_in_wrong_order():void
  71. {
  72. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  73. registry.addContainer(searchTrees[0]);
  74. registry.addContainer(searchTrees[1].children[3]);
  75. registry.addContainer(searchTrees[1]);
  76. var searchItem:Sprite = searchTrees[1].children[3].children[3].children[3].children[3];
  77. var result:ContainerBinding = registry.findParentBinding(searchItem);
  78. // TODO: use a matcher
  79. assertEquals("Binding returns with correct container view", searchTrees[1].children[3], result.container);
  80. assertEquals("Binding returns with correct container parent view", searchTrees[1], result.parent.container);
  81. assertEquals("Further parents are null", null, result.parent.parent);
  82. }
  83. [Test]
  84. public function binding_returns_with_correct_interested_parent_chain_if_interested_views_added_in_wrong_order_with_gaps():void
  85. {
  86. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  87. registry.addContainer(searchTrees[0]);
  88. registry.addContainer(searchTrees[1].children[3].children[2]);
  89. registry.addContainer(searchTrees[1]);
  90. var searchItem:Sprite = searchTrees[1].children[3].children[2].children[3].children[3];
  91. var result:ContainerBinding = registry.findParentBinding(searchItem);
  92. // TODO: use a matcher
  93. assertEquals("Binding returns with correct container view", searchTrees[1].children[3].children[2], result.container);
  94. assertEquals("Binding returns with correct container parent view", searchTrees[1], result.parent.container);
  95. assertEquals("Further parents are null", null, result.parent.parent);
  96. }
  97. [Test]
  98. public function binding_returns_with_correct_interested_parent_chain_after_removal():void
  99. {
  100. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  101. registry.addContainer(searchTrees[0]);
  102. registry.addContainer(searchTrees[1]);
  103. registry.addContainer(searchTrees[1].children[3].children[2].children[3]);
  104. registry.addContainer(searchTrees[1].children[3].children[2]);
  105. registry.addContainer(searchTrees[1].children[3]);
  106. registry.removeContainer(searchTrees[1].children[3].children[2]);
  107. var searchItem:Sprite = searchTrees[1].children[3].children[2].children[3].children[3];
  108. var result:ContainerBinding = registry.findParentBinding(searchItem);
  109. // TODO: use a matcher
  110. assertEquals("Binding returns with correct container view", searchTrees[1].children[3].children[2].children[3], result.container);
  111. assertEquals("Binding returns with correct container parent view", searchTrees[1].children[3], result.parent.container);
  112. assertEquals("Binding returns with correct container parent parent view", searchTrees[1], result.parent.parent.container);
  113. assertEquals("Further parents are null", null, result.parent.parent.parent);
  114. }
  115. [Test]
  116. public function returns_null_if_search_item_is_not_inside_an_included_view():void
  117. {
  118. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  119. registry.addContainer(searchTrees[0]);
  120. registry.addContainer(searchTrees[1]);
  121. registry.addContainer(searchTrees[1].children[3].children[2].children[3]);
  122. registry.addContainer(searchTrees[1].children[3].children[2]);
  123. registry.addContainer(searchTrees[1].children[3]);
  124. registry.removeContainer(searchTrees[1].children[3].children[2]);
  125. var searchItem:Sprite = searchTrees[2].children[3].children[2].children[3].children[3];
  126. var result:ContainerBinding = registry.findParentBinding(searchItem);
  127. // TODO: use a matcher
  128. assertEquals("Returns null if not inside an included view", null, result);
  129. }
  130. [Test]
  131. public function returns_root_container_view_bindings_one_item():void
  132. {
  133. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(1, 1);
  134. var expectedBinding:ContainerBinding = registry.addContainer(searchTrees[0]);
  135. var expectedRootBindings:Vector.<ContainerBinding> = new <ContainerBinding>[expectedBinding];
  136. // TODO: use a matcher
  137. assertEqualsVectorsIgnoringOrder("Returns root container view bindings one item", expectedRootBindings, registry.rootBindings);
  138. }
  139. [Test]
  140. public function returns_root_container_view_bindings_many_items():void
  141. {
  142. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  143. var firstExpectedBinding:ContainerBinding = registry.addContainer(searchTrees[0]);
  144. registry.addContainer(searchTrees[1].children[3].children[2].children[3]);
  145. registry.addContainer(searchTrees[1].children[3].children[2]);
  146. var secondExpectedBinding:ContainerBinding = registry.addContainer(searchTrees[1]);
  147. registry.addContainer(searchTrees[1].children[3]);
  148. var expectedRootBindings:Vector.<ContainerBinding> = new <ContainerBinding>[firstExpectedBinding, secondExpectedBinding];
  149. // TODO: use a matcher
  150. assertEqualsVectorsIgnoringOrder("Returns root container view bindings one item", expectedRootBindings, registry.rootBindings);
  151. }
  152. [Test]
  153. public function returns_root_container_view_bindings_many_items_after_removals():void
  154. {
  155. var searchTrees:Vector.<TreeSpriteSupport> = createTrees(5, 4);
  156. var firstExpectedBinding:ContainerBinding = registry.addContainer(searchTrees[0]);
  157. registry.addContainer(searchTrees[1].children[3].children[2].children[3]);
  158. registry.addContainer(searchTrees[1].children[3].children[2]);
  159. registry.addContainer(searchTrees[1]);
  160. var secondExpectedBinding:ContainerBinding = registry.addContainer(searchTrees[1].children[3]);
  161. registry.removeContainer(searchTrees[1]);
  162. var expectedRootBindings:Vector.<ContainerBinding> = new <ContainerBinding>[firstExpectedBinding, secondExpectedBinding];
  163. // TODO: use a matcher
  164. assertEqualsVectorsIgnoringOrder("Returns root container view bindings one item", expectedRootBindings, registry.rootBindings);
  165. }
  166. [Test]
  167. public function adding_container_dispatches_event():void
  168. {
  169. var callCount:int = 0;
  170. registry.addEventListener(
  171. ContainerRegistryEvent.CONTAINER_ADD,
  172. function onContainerAdd(event:ContainerRegistryEvent):void {
  173. callCount++;
  174. });
  175. registry.addContainer(container);
  176. registry.addContainer(container);
  177. assertThat(callCount, equalTo(1));
  178. }
  179. [Test]
  180. public function removing_container_dispatches_event():void
  181. {
  182. var callCount:int = 0;
  183. registry.addEventListener(
  184. ContainerRegistryEvent.CONTAINER_REMOVE,
  185. function onContainerAdd(event:ContainerRegistryEvent):void {
  186. callCount++;
  187. });
  188. registry.addContainer(container);
  189. registry.removeContainer(container);
  190. registry.removeContainer(container);
  191. assertThat(callCount, equalTo(1));
  192. }
  193. [Test]
  194. public function adding_root_container_dispatches_event():void
  195. {
  196. var callCount:int = 0;
  197. registry.addEventListener(
  198. ContainerRegistryEvent.ROOT_CONTAINER_ADD,
  199. function onContainerAdd(event:ContainerRegistryEvent):void {
  200. callCount++;
  201. });
  202. registry.addContainer(container);
  203. assertThat(callCount, equalTo(1));
  204. }
  205. [Test]
  206. public function empty_binding_is_removed():void
  207. {
  208. const handler:IViewHandler = new CallbackViewHandler();
  209. registry.addContainer(container).addHandler(handler);
  210. registry.getBinding(container).removeHandler(handler);
  211. assertThat(registry.getBinding(container), nullValue());
  212. }
  213. /*============================================================================*/
  214. /* Private Functions */
  215. /*============================================================================*/
  216. private function createTrees(tree_depth:uint, tree_width:uint):Vector.<TreeSpriteSupport>
  217. {
  218. const trees:Vector.<TreeSpriteSupport> = new Vector.<TreeSpriteSupport>();
  219. for (var i:uint = 0; i < tree_width; i++)
  220. {
  221. var nextTree:TreeSpriteSupport = new TreeSpriteSupport(tree_depth, tree_width);
  222. trees.push(nextTree);
  223. }
  224. return trees;
  225. }
  226. }
  227. }