FLEX-18746 Added unit test (current fails).
diff --git a/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Tests.as b/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Tests.as
new file mode 100644
index 0000000..5d64b06
--- /dev/null
+++ b/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Tests.as
@@ -0,0 +1,112 @@
+package mx.controls {
+ import flash.events.Event;
+ import flash.events.EventDispatcher;
+
+ import mx.collections.ArrayCollection;
+ import mx.core.mx_internal;
+
+ import org.flexunit.assertThat;
+ import org.flexunit.async.Async;
+ import org.fluint.uiImpersonation.UIImpersonator;
+
+ use namespace mx_internal;
+
+ public class Tree_FLEX_18746_Tests
+ {
+ private static var noEnterFramesToWait:int = NaN;
+ private static const _finishNotifier:EventDispatcher = new EventDispatcher();
+
+ private static var _sut:Tree;
+ private static var child:Object = {label: "Item"};
+ private static var parent0:Object = {label: "Folder 0", children: new ArrayCollection()};
+ private static var parent1:Object = {label: "Folder 1", children: new ArrayCollection([child])};
+
+
+ [Before]
+ public function setUp():void
+ {
+ _sut = new Tree();
+ _sut.width = 200;
+ _sut.height = 200;
+ UIImpersonator.addChild(_sut);
+ }
+
+ [After]
+ public function tearDown():void
+ {
+ UIImpersonator.removeAllChildren();
+ _sut = null;
+ }
+
+
+ //--------------------------------------------------------------------------
+ //
+ // Test method
+ //
+ //--------------------------------------------------------------------------
+
+ [Test(async, timeout=1000)]
+ public function test_object_removed_from_stage_via_code_is_not_initialized():void
+ {
+ //given
+ const dataProvider:ArrayCollection = new ArrayCollection();
+ dataProvider.addItem(parent0);
+ dataProvider.addItem(parent1);
+
+ //when
+ _sut.dataProvider = dataProvider;
+
+ //then wait a few frames
+ noEnterFramesToWait = 2;
+ UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, onEnterFrame);
+ Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_expand_second_folder, 200);
+ }
+
+
+ private function then_expand_second_folder(event:Event, passThroughData:Object):void
+ {
+ //when
+ _sut.expandItem(parent1, true, true, true);
+
+ //then wait a bit
+ noEnterFramesToWait = 5;
+ UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, onEnterFrame);
+ Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_move_child_to_first_parent_and_expand_it, 500);
+ }
+
+ private function then_move_child_to_first_parent_and_expand_it(event:Event, passThroughData:Object):void
+ {
+ //then
+ assertThat(_sut.isItemOpen(parent1));
+
+ //when
+ ArrayCollection(parent1.children).removeItemAt(0);
+ _sut.expandItem(parent0, true, true, true);
+ ArrayCollection(parent0.children).addItem(child);
+
+ //then wait a bit
+ noEnterFramesToWait = 1;
+ UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, onEnterFrame);
+ Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_contract_second_folder, 200);
+ }
+
+ private static function then_contract_second_folder(event:Event, passThroughData:Object):void
+ {
+ //when
+ _sut.expandItem(parent1, false, true, true);
+
+ //then no error was thrown
+ assertThat(true);
+ }
+
+
+ private static function onEnterFrame(event:Event):void
+ {
+ if(!--noEnterFramesToWait)
+ {
+ UIImpersonator.testDisplay.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
+ _finishNotifier.dispatchEvent(new Event(Event.COMPLETE));
+ }
+ }
+ }
+}
\ No newline at end of file