Merge branch 'patch-2' of https://github.com/kevinGodell/flex-sdk into develop
diff --git a/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34775_Tests.as b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34775_Tests.as
index e4eeccd..2b07605 100644
--- a/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34775_Tests.as
+++ b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34775_Tests.as
@@ -19,32 +19,35 @@
 
 package mx.collections
 {
+    import mx.collections.*;
+    import mx.utils.StringUtil;
+
     import org.flexunit.asserts.assertEquals;
 
-    public class HierarchicalCollectionView_FLEX_34775_Tests
-	{
-		private static var _utils:HierarchicalCollectionViewTestUtils = new HierarchicalCollectionViewTestUtils();
-		private static var _sut:HierarchicalCollectionView;
-		private var _level0:ArrayCollection;
-		
-		[Before]
-		public function setUp():void
-		{
+    public class HierarchicalCollectionView_FLEX_34775_Test
+    {
+        private static var _utils:HierarchicalCollectionViewTestUtils = new HierarchicalCollectionViewTestUtils();
+        private static var _sut:HierarchicalCollectionView;
+        private var _level0:ArrayCollection;
+
+        [Before]
+        public function setUp():void
+        {
             _sut = generateHierarchyViewWithClosedNodes();
             _level0 = _utils.getRoot(_sut) as ArrayCollection;
-		}
-		
-		[After]
-		public function tearDown():void
-		{
+        }
+
+        [After]
+        public function tearDown():void
+        {
             _sut = null;
             _level0 = null;
-		}
+        }
 
 
 
         [Test]
-        public function test_navigation_after_opening_hidden_node():void
+        public function test_navigation_after_trying_to_open_inaccessible_node():void
         {
             //given
             var company:DataNode = _level0.getItemAt(0) as DataNode;
@@ -53,27 +56,95 @@
             //when
             _sut.openNode(location);
 
-            var cursor:IViewCursor = _sut.createCursor();
+            //then
+            var stepsRequiredToNavigateStructure:int = attemptNavigation(_sut);
+            assertEquals(1, stepsRequiredToNavigateStructure);
+            assertEquals(1, _sut.length);
+        }
+
+        [Test]
+        public function test_navigation_after_trying_to_open_accessible_node():void
+        {
+            //given
+            var company:DataNode = _level0.getItemAt(0) as DataNode;
+            var location:DataNode = company.children.getItemAt(0) as DataNode;
+
+            //when
+            _sut.openNode(company);
+            _sut.openNode(location);
+
+            //then
+            var stepsRequiredToNavigateStructure:int = attemptNavigation(_sut);
+            assertEquals(3, stepsRequiredToNavigateStructure);
+            assertEquals(3, _sut.length);
+        }
+
+        [Test]
+        public function test_navigation_after_trying_to_open_previously_closed_node():void
+        {
+            //given
+            var company:DataNode = _level0.getItemAt(0) as DataNode;
+            var location:DataNode = company.children.getItemAt(0) as DataNode;
+
+            //when
+            _sut.openNode(company);
+            _sut.openNode(location);
+            _sut.closeNode(location);
+
+            //then
+            var stepsRequiredToNavigateStructure:int = attemptNavigation(_sut);
+            assertEquals(2, stepsRequiredToNavigateStructure);
+            assertEquals(2, _sut.length);
+        }
+
+        [Test]
+        public function test_navigation_after_trying_to_open_filtered_out_node():void
+        {
+            function filterOutLocationNode(node:DataNode):Boolean {
+                return node && node.label != locationNodeName;
+            };
+
+            const locationNodeName:String = StringUtil.trim(HIERARCHY_STRING.split("\n")[2]);
+
+            //given
+            var company:DataNode = _level0.getItemAt(0) as DataNode;
+            var location:DataNode = company.children.getItemAt(0) as DataNode;
+            _sut.openNode(company);
+            _sut.openNode(location);
+
+            //when
+            _sut.filterFunction = filterOutLocationNode;
+            _sut.refresh();
+
+            _sut.openNode(location);
+
+            //then
+            var stepsRequiredToNavigateStructure:int = attemptNavigation(_sut);
+            assertEquals(1, stepsRequiredToNavigateStructure);
+            assertEquals(1, _sut.length);
+        }
+
+        private function attemptNavigation(into:HierarchicalCollectionView):int
+        {
+            var cursor:IViewCursor = into.createCursor();
             var i:int = 0;
             while(!cursor.afterLast && i++ < 100)
             {
                 cursor.moveNext();
             }
 
-            //then
-            assertEquals(1, i);
-            assertEquals(1, _sut.length);
+            return i;
         }
 
-		private static function generateHierarchyViewWithClosedNodes():HierarchicalCollectionView
-		{
-			return _utils.generateHCV(_utils.generateHierarchySourceFromString(HIERARCHY_STRING));
-		}
+        private static function generateHierarchyViewWithClosedNodes():HierarchicalCollectionView
+        {
+            return _utils.generateHCV(_utils.generateHierarchySourceFromString(HIERARCHY_STRING));
+        }
 
-		private static const HIERARCHY_STRING:String = (<![CDATA[
-			Adobe
-			Adobe->London
-            Adobe->London->FlexDept
-		]]>).toString();
-	}
+        private static const HIERARCHY_STRING:String = (<![CDATA[
+                Adobe
+        Adobe->London
+        Adobe->London->FlexDept
+    ]]>).toString();
+    }
 }
\ No newline at end of file
diff --git a/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34778_Tests.as b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34778_Tests.as
new file mode 100644
index 0000000..9a85102
--- /dev/null
+++ b/frameworks/tests/unitTests/mx/collections/HierarchicalCollectionView_FLEX_34778_Tests.as
@@ -0,0 +1,74 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.collections
+{
+    import mx.collections.ArrayCollection;
+    import mx.collections.HierarchicalCollectionView;
+
+    import org.flexunit.asserts.assertEquals;
+
+    public class HierarchicalCollectionView_FLEX_34778_Tests
+    {
+        private static var _utils:HierarchicalCollectionViewTestUtils = new HierarchicalCollectionViewTestUtils();
+        private static var _sut:HierarchicalCollectionView;
+        private var _level0:ArrayCollection;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = generateHierarchyViewWithClosedNodes();
+            _level0 = _utils.getRoot(_sut) as ArrayCollection;
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+            _level0 = null;
+        }
+
+
+        [Test]
+        public function test_replacing_inaccessible_node():void
+        {
+            //given
+            var company:DataNode = _level0.getItemAt(0) as DataNode;
+
+            //when
+            _sut.openNode(company); //so that it starts listening to collection change events on its children
+            _sut.closeNode(company);
+            company.children.setItemAt(new DataNode("Adobe->Brussels"), 0); //makes the app hang here
+
+            //then
+            assertEquals(1, _sut.length);
+        }
+
+        private static function generateHierarchyViewWithClosedNodes():HierarchicalCollectionView
+        {
+            return _utils.generateHCV(_utils.generateHierarchySourceFromString(HIERARCHY_STRING));
+        }
+
+        private static const HIERARCHY_STRING:String = (<![CDATA[
+        Adobe
+        Adobe->London
+        Adobe->London->FlexDept
+    ]]>).toString();
+    }
+}
\ No newline at end of file