FLEX-34424 Added a unit test to reproduce FLEX-34424. As expected, it is currently failing. Also added a few more tests to HierarchicalCollectionViewCursor_Basics_Test to do with the deletion of nodes. These are currently passing.
Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/4970df88 Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/4970df88 Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/4970df88 Branch: refs/heads/develop Commit: 4970df88bea72d134a53c4a5ceddf236db7dde84 Parents: c2e68dc Author: Mihai Chira <mih...@apache.org> Authored: Mon Jul 28 15:57:26 2014 +0100 Committer: Mihai Chira <mih...@apache.org> Committed: Mon Jul 28 16:03:01 2014 +0100 ---------------------------------------------------------------------- ...rarchicalCollectionViewCursor_Basics_Test.as | 81 +++++++++++- ...hicalCollectionViewCursor_FLEX_34424_Test.as | 126 +++++++++++++++++++ 2 files changed, 205 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/4970df88/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_Basics_Test.as ---------------------------------------------------------------------- diff --git a/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_Basics_Test.as b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_Basics_Test.as index 2990a80..6e3e34a 100644 --- a/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_Basics_Test.as +++ b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_Basics_Test.as @@ -1,8 +1,10 @@ package mx.collections { import flash.events.UncaughtErrorEvent; - - import mx.collections.ArrayCollection; + +import flashx.textLayout.debug.assert; + +import mx.collections.ArrayCollection; import mx.collections.CursorBookmark; import mx.collections.HierarchicalCollectionView; import mx.collections.HierarchicalCollectionViewCursor; @@ -125,6 +127,81 @@ package mx.collections //then assertEquals(newLastCompany, _sut.current); } + + [Test] + public function testRemovingCurrentMiddleItemChangesCurrentToNextItem():void + { + //given + var firstCompany:DataNode = _level0.getItemAt(0) as DataNode; + var secondLocation:DataNode = firstCompany.children.getItemAt(1) as DataNode; + var thirdDepartmentOfSecondLocation:DataNode = secondLocation.children.getItemAt(2) as DataNode; + + _sut.seek(new CursorBookmark(6)); //Company(1)->Location(2)->Department(2) + + //when + secondLocation.children.removeItemAt(1); + + //then + assertEquals(thirdDepartmentOfSecondLocation, _sut.current); + } + + [Test] + public function testRemovingPreviousSiblingOfCurrentMiddleItemDoesNotChangeCurrent():void + { + //given + var firstCompany:DataNode = _level0.getItemAt(0) as DataNode; + var secondLocation:DataNode = firstCompany.children.getItemAt(1) as DataNode; + var secondDepartmentOfSecondLocation:DataNode = secondLocation.children.getItemAt(1) as DataNode; + + //when + _sut.seek(new CursorBookmark(6)); //Company(1)->Location(2)->Department(2) + + //then + assertEquals(secondDepartmentOfSecondLocation, _sut.current); + + //when + secondLocation.children.removeItemAt(0); + + //then + assertEquals(secondDepartmentOfSecondLocation, _sut.current); + } + + [Test] + public function testRemovingCurrentFirstItemChangesCurrentToNextItem():void + { + //given + var firstCompany:DataNode = _level0.getItemAt(0) as DataNode; + var secondCompany:DataNode = _level0.getItemAt(1) as DataNode; + + //initial assumption + assertEquals(firstCompany, _sut.current); + + //when + _level0.removeItemAt(0); + + //then + assertEquals(secondCompany, _sut.current); + } + + [Test] + public function testRemovingSiblingOfCurrentFirstItemDoesNotChangeCurrent():void + { + //given + var firstCompany:DataNode = _level0.getItemAt(0) as DataNode; + var firstLocation:DataNode = firstCompany.children.getItemAt(0) as DataNode; + + //when + _sut.seek(new CursorBookmark(1)); //Company(1)->Location(1) + + //then + assertEquals(firstLocation, _sut.current); + + //when + firstCompany.children.removeItemAt(1); + + //then + assertEquals(firstLocation, _sut.current); + } private static function handleUncaughtClientError(event:UncaughtErrorEvent):void http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/4970df88/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_FLEX_34424_Test.as ---------------------------------------------------------------------- diff --git a/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_FLEX_34424_Test.as b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_FLEX_34424_Test.as new file mode 100644 index 0000000..2927c16 --- /dev/null +++ b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionViewCursor_FLEX_34424_Test.as @@ -0,0 +1,126 @@ +package mx.collections +{ +import flash.events.UncaughtErrorEvent; + +import mx.collections.ArrayCollection; +import mx.collections.CursorBookmark; +import mx.collections.HierarchicalCollectionView; +import mx.collections.HierarchicalCollectionViewCursor; +import mx.core.FlexGlobals; + +import org.flexunit.asserts.assertNotNull; +import org.flexunit.asserts.assertTrue; +import org.flexunit.runners.Parameterized; + +import spark.components.WindowedApplication; + +public class HierarchicalCollectionViewCursor_FLEX_34424_Test + { + private static var _utils:HierarchicalCollectionViewTestUtils = new HierarchicalCollectionViewTestUtils(); + private static var _noErrorsThrown:Boolean = true; + private static var _currentHierarchy:HierarchicalCollectionView; + private static var _sut:HierarchicalCollectionViewCursor; + private static var _operationCursor:HierarchicalCollectionViewCursor; + + [BeforeClass] + public static function setUpBeforeClass():void + { + (FlexGlobals.topLevelApplication as WindowedApplication).loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtClientError); + } + + [AfterClass] + public static function tearDownAfterClass():void + { + (FlexGlobals.topLevelApplication as WindowedApplication).loaderInfo.uncaughtErrorEvents.removeEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtClientError); + } + + [Before] + public function setUp():void + { + _currentHierarchy = _utils.generateOpenHierarchyFromRootListWithAllNodesMethod(_utils.generateHierarchySourceFromString(HIERARCHY_STRING)); + _sut = _currentHierarchy.createCursor() as HierarchicalCollectionViewCursor; + } + + [After] + public function tearDown():void + { + _sut = null; + _currentHierarchy = null; + _operationCursor = null; + } + + [Test] + public function testReproduce_FLEX_34424():void + { + //GIVEN + var selectedItemIndex:int = 10, operationIndex:int = 8; + + //WHEN + //1. Select a specific node + _sut.seek(new CursorBookmark(selectedItemIndex)); + + var selectedNode:DataNode = DataNode(_sut.current); + assertNotNull(selectedNode); + selectedNode.isSelected = true; + + //2. Perform setItemAt operation + _operationCursor = _currentHierarchy.createCursor() as HierarchicalCollectionViewCursor; + _operationCursor.seek(new CursorBookmark(operationIndex)); + performRemoval(_operationCursor); + + //THEN + assertTrue(_noErrorsThrown); + assertNotNull(_sut.current); + } + + private static function performRemoval(where:HierarchicalCollectionViewCursor):void + { + var itemToBeRemoved:DataNode = where.current as DataNode; + assertNotNull(itemToBeRemoved); + + var parentOfReplacementLocation:DataNode = _currentHierarchy.getParentItem(itemToBeRemoved) as DataNode; + var collectionToChange:ArrayCollection = parentOfReplacementLocation ? parentOfReplacementLocation.children : _utils.getRoot(_currentHierarchy) as ArrayCollection; + var removedItemIndex:int = collectionToChange.getItemIndex(itemToBeRemoved); + + collectionToChange.removeItemAt(removedItemIndex); + } + + + + + + private static function onUncaughtClientError(event:UncaughtErrorEvent):void + { + event.preventDefault(); + event.stopImmediatePropagation(); + _noErrorsThrown = false; + + trace("\n FAIL: " + event.error); + _utils.printHCollectionView(_currentHierarchy); + } + + + private static const HIERARCHY_STRING:String = (<![CDATA[ + Region(1) + Region(2) + Region(2)->City(0) + Region(2)->City(1) + Region(2)->City(1)->Company(1) + Region(2)->City(1)->Company(2) + Region(2)->City(1)->Company(2)->Department(1) + Region(2)->City(1)->Company(2)->Department(2) + Region(2)->City(1)->Company(2)->Department(2)->Employee(1)TBR + Region(2)->City(1)->Company(2)->Department(2)->Employee(2) + Region(2)->City(1)->Company(2)->Department(2)->Employee(3)SEL + Region(2)->City(1)->Company(2)->Department(3) + Region(2)->City(1)->Company(2)->Department(3)->Employee(1) + Region(2)->City(1)->Company(2)->Department(3)->Employee(2) + Region(2)->City(1)->Company(2)->Department(3)->Employee(3) + Region(2)->City(1)->Company(2)->Department(3)->Employee(4) + Region(2)->City(1)->Company(3) + Region(2)->City(1)->Company(3)->Department(1) + Region(2)->City(1)->Company(3)->Department(1)->Employee(1) + Region(2)->City(1)->Company(3)->Department(2) + ]]>).toString(); + } +} \ No newline at end of file