/test/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapMemoryLeakTest.as

https://github.com/creynders/robotlegs-framework · ActionScript · 195 lines · 116 code · 46 blank · 33 comment · 1 complexity · 0b8b400d64e4aecfb1d8bb864781adab MD5 · raw file

  1. //------------------------------------------------------------------------------
  2. // Copyright (c) 2009-2013 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.mediatorMap.impl
  8. {
  9. import flash.display.Sprite;
  10. import flash.system.System;
  11. import flash.utils.Dictionary;
  12. import org.flexunit.asserts.assertEquals;
  13. import org.flexunit.async.Async;
  14. import org.swiftsuspenders.Injector;
  15. import robotlegs.bender.extensions.mediatorMap.api.IMediatorFactory;
  16. import robotlegs.bender.extensions.mediatorMap.api.IMediatorViewHandler;
  17. import robotlegs.bender.extensions.mediatorMap.impl.support.MediatorWeakMapTracker;
  18. public class MediatorMapMemoryLeakTest
  19. {
  20. /*============================================================================*/
  21. /* Private Properties */
  22. /*============================================================================*/
  23. private var mediatorMap:MediatorMap;
  24. private var mediatorTracker:MediatorWeakMapTracker;
  25. private var mediatorManager:MediatorManager;
  26. /*============================================================================*/
  27. /* Test Setup and Teardown */
  28. /*============================================================================*/
  29. [Before]
  30. public function setUp():void
  31. {
  32. const injector:Injector = new Injector();
  33. const factory:IMediatorFactory = new MediatorFactory(injector);
  34. const handler:IMediatorViewHandler = new MediatorViewHandler(factory);
  35. mediatorMap = new MediatorMap(factory, handler);
  36. mediatorManager = new MediatorManager(factory);
  37. mediatorTracker = new MediatorWeakMapTracker();
  38. injector.map(MediatorWeakMapTracker).toValue(mediatorTracker);
  39. }
  40. [After]
  41. public function tearDown():void
  42. {
  43. mediatorMap = null;
  44. mediatorManager = null;
  45. mediatorTracker = null;
  46. }
  47. /*============================================================================*/
  48. /* Tests */
  49. /*============================================================================*/
  50. [Test(async)]
  51. public function mediators_are_released_and_not_held_in_memory():void
  52. {
  53. mediatorMap.map(Sprite).toMediator(ExampleMediator);
  54. mediatorMap.map(Sprite).toMediator(ExampleMediator2);
  55. const view:Sprite = new Sprite();
  56. mediatorMap.mediate(view);
  57. const trackedMediators:Dictionary = mediatorTracker.trackedMediators;
  58. var expectedNumberOfKeys:uint = 2;
  59. assertEquals(expectedNumberOfKeys, dictionaryLength(trackedMediators));
  60. mediatorMap.unmediate(view);
  61. System.gc();
  62. expectedNumberOfKeys = 0;
  63. assertAfterDelay(function():void {
  64. assertEquals(expectedNumberOfKeys, dictionaryLength(trackedMediators));
  65. }, 50);
  66. }
  67. [Test(async)]
  68. public function mediated_view_is_released_and_not_held_in_memory():void
  69. {
  70. mediatorMap.map(Sprite).toMediator(ExampleMediator);
  71. mediatorMap.map(Sprite).toMediator(ExampleMediator2);
  72. var views:Array = [];
  73. views[0] = new Sprite();
  74. const trackedViews:Dictionary = new Dictionary(true);
  75. trackedViews[views[0]] = true;
  76. mediatorMap.mediate(views[0]);
  77. var expectedNumberOfKeys:uint = 1;
  78. assertEquals(expectedNumberOfKeys, dictionaryLength(trackedViews));
  79. mediatorMap.unmediate(views[0]);
  80. views[0] = new Sprite();
  81. System.gc();
  82. expectedNumberOfKeys = 0;
  83. assertAfterDelay(function():void {
  84. assertEquals(expectedNumberOfKeys, dictionaryLength(trackedViews));
  85. }, 50);
  86. }
  87. /*============================================================================*/
  88. /* Protected Functions */
  89. /*============================================================================*/
  90. protected function dictionaryLength(dict:Dictionary):uint
  91. {
  92. var itemsFound:uint = 0;
  93. for each (var item:Object in dict)
  94. {
  95. itemsFound++;
  96. }
  97. return itemsFound;
  98. }
  99. /*============================================================================*/
  100. /* Private Functions */
  101. /*============================================================================*/
  102. private function assertAfterDelay(assertion:Function, delay:Number = 50):void
  103. {
  104. Async.delayCall(this, assertion, delay);
  105. }
  106. }
  107. }
  108. import flash.display.Sprite;
  109. import robotlegs.bender.extensions.mediatorMap.impl.support.MediatorWeakMapTracker;
  110. class ExampleMediator
  111. {
  112. /*============================================================================*/
  113. /* Public Properties */
  114. /*============================================================================*/
  115. [Inject]
  116. public var mediatorTracker:MediatorWeakMapTracker;
  117. [Inject]
  118. public var view:Sprite;
  119. /*============================================================================*/
  120. /* Public Functions */
  121. /*============================================================================*/
  122. public function initialize():void
  123. {
  124. mediatorTracker.trackMediator(this);
  125. }
  126. public function destroy():void
  127. {
  128. }
  129. }
  130. class ExampleMediator2
  131. {
  132. /*============================================================================*/
  133. /* Public Properties */
  134. /*============================================================================*/
  135. [Inject]
  136. public var mediatorTracker:MediatorWeakMapTracker;
  137. [Inject]
  138. public var view:Sprite;
  139. /*============================================================================*/
  140. /* Public Functions */
  141. /*============================================================================*/
  142. public function initialize():void
  143. {
  144. mediatorTracker.trackMediator(this);
  145. }
  146. public function destroy():void
  147. {
  148. }
  149. }