FLEX-18746 Adding another unit test which goes to the heart of the bug - the length calculation in HierarchicalCollectionView. (Currently the test function test_opening_closing_with_Jill_having_no_children_to_begin_with() fails, as expected.)
Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/5fb2fb63 Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/5fb2fb63 Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/5fb2fb63 Branch: refs/heads/develop Commit: 5fb2fb634ea856cc0cd4034dc9bc99e4a58219d5 Parents: 7a519a3 Author: Mihai Chira <mih...@apache.org> Authored: Tue Aug 15 17:20:48 2017 +0200 Committer: Mihai Chira <mih...@apache.org> Committed: Tue Aug 15 17:20:48 2017 +0200 ---------------------------------------------------------------------- .../Tree_FLEX_18746_Collection_Length_Tests.as | 201 +++++++++++++++++++ .../tests/mx/controls/Tree_FLEX_18746_Tests.as | 6 - 2 files changed, 201 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/5fb2fb63/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Collection_Length_Tests.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Collection_Length_Tests.as b/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Collection_Length_Tests.as new file mode 100644 index 0000000..1d7a131 --- /dev/null +++ b/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Collection_Length_Tests.as @@ -0,0 +1,201 @@ +package mx.controls { + import flash.events.Event; + import flash.events.EventDispatcher; + + import mx.collections.ArrayCollection; + import mx.core.mx_internal; + + import org.flexunit.asserts.assertEquals; + import org.flexunit.async.Async; + import org.fluint.uiImpersonation.UIImpersonator; + + use namespace mx_internal; + + public class Tree_FLEX_18746_Collection_Length_Tests + { + private static var noEnterFramesToWait:int = NaN; + private static const _finishNotifier:EventDispatcher = new EventDispatcher(); + + private static var _sut:Tree_; + private static var Sam:TreeItem; + private static var Ana:TreeItem; + private static var Jenny:TreeItem; + private static var Marc:TreeItem; + private static var parentJill:TreeItem; + private static var parentJohn:TreeItem; + + + [Before] + public function setUp():void + { + Sam = new TreeItem("Sam"); + Ana = new TreeItem("Ana"); + Jenny = new TreeItem("Jenny"); + Marc = new TreeItem("Marc"); + + _sut = new Tree_(); + _sut.width = 200; + _sut.height = 200; + + UIImpersonator.addChild(_sut); + } + + [After] + public function tearDown():void + { + UIImpersonator.removeAllChildren(); + _sut = null; + } + + + [Test(async, timeout=300)] + public function test_opening_closing_with_both_parents_having_at_least_one_child():void + { + //given + parentJill = new TreeItem("Jill", new ArrayCollection([Marc])); + parentJohn = new TreeItem("John", new ArrayCollection([Sam])); + + const dataProvider:ArrayCollection = new ArrayCollection(); + dataProvider.addItem(parentJill); + dataProvider.addItem(parentJohn); + + //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_and_contract, 250); + } + + [Test(async, timeout=300)] + public function test_opening_closing_with_Jill_having_no_children_to_begin_with():void + { + //given + parentJill = new TreeItem("Jill", new ArrayCollection()); + parentJohn = new TreeItem("John", new ArrayCollection([Sam])); + + const dataProvider:ArrayCollection = new ArrayCollection(); + dataProvider.addItem(parentJill); + dataProvider.addItem(parentJohn); + + //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_and_contract, 250); + } + + private static function then_expand_and_contract(event:Event, passThroughData:Object):void + { + //given + var currentLength:int = _sut.collectionLength_; //current length is correct + + //then + assertEquals(2, currentLength); + + //when + _sut.expandItem(parentJohn, true, false, true); + currentLength += parentJohn.children.length; + + //then + assertEquals(currentLength, _sut.collectionLength_); + + //when + _sut.expandItem(parentJill, true, false, true); + currentLength += parentJill.children.length; + + //then + assertEquals(currentLength, _sut.collectionLength_); + + //when + parentJohn.children.addItem(Jenny); + currentLength += 1; + + //then + assertEquals(currentLength, _sut.collectionLength_); + + //when + _sut.expandItem(parentJohn, false, false, true); + currentLength -= parentJohn.children.length; + + //then + assertEquals(currentLength, _sut.collectionLength_); + + //when + parentJill.children.addItem(Ana); + currentLength += 1; + + //then + assertEquals(currentLength, _sut.collectionLength_); + } + + + private static function onEnterFrame(event:Event):void + { + if(!--noEnterFramesToWait) + { + UIImpersonator.testDisplay.removeEventListener(Event.ENTER_FRAME, onEnterFrame); + _finishNotifier.dispatchEvent(new Event(Event.COMPLETE)); + } + } + } +} + +import mx.controls.Tree; +import mx.controls.treeClasses.HierarchicalCollectionView; + +class Tree_ extends Tree +{ + public function getHierarchicalCollection():HierarchicalCollectionView + { + return super.collection as HierarchicalCollectionView; + } + + public function get collectionLength_():int + { + return getHierarchicalCollection().length; + } +} + +import mx.collections.ArrayCollection; + +class TreeItem { + private var _label:String; + private var _children:ArrayCollection; + + public function TreeItem(label:String, children:ArrayCollection = null) + { + this.label = label; + this.children = children; + } + + [Bindable] + public function set label(label:String):void + { + _label = label; + } + + public function get label():String + { + return _label; + } + + [Bindable] + public function set children(children:ArrayCollection):void + { + _children = children; + } + + public function get children():ArrayCollection + { + return _children; + } + + public function toString():String + { + return "TreeItem{_label=" + String(_label) + "}"; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/5fb2fb63/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Tests.as ---------------------------------------------------------------------- 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 index 16a3cbc..0cfb3af 100644 --- a/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Tests.as +++ b/frameworks/projects/mx/tests/mx/controls/Tree_FLEX_18746_Tests.as @@ -43,12 +43,6 @@ package mx.controls { } - //-------------------------------------------------------------------------- - // - // Test method - // - //-------------------------------------------------------------------------- - [Test(async, timeout=1000)] public function test_closing_previously_opened_folder_with_0_children_without_animation_does_not_throw_fatal():void {