FLEX-34854
Collection RESET and REFRESH now get the ComplexFieldChangeWatcher to listen to 
the new events. (Unit tested.)


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/8b90f8b4
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/8b90f8b4
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/8b90f8b4

Branch: refs/heads/develop
Commit: 8b90f8b45e06b93e90463f26da30e31ea56d8b2f
Parents: b9fba79
Author: Mihai Chira <[email protected]>
Authored: Mon Jun 8 19:22:24 2015 +0200
Committer: Mihai Chira <[email protected]>
Committed: Mon Jun 8 19:22:24 2015 +0200

----------------------------------------------------------------------
 .../mx/collections/ComplexFieldChangeWatcher.as | 25 ++++++--
 .../framework/tests/FLEX_34854_Tests.as         | 67 +++++++++++++++++++-
 .../ListCollectionView_FLEX_34837_Tests.as      |  4 +-
 3 files changed, 88 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/8b90f8b4/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as 
b/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
index a128cf3..20b1e8c 100644
--- 
a/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
+++ 
b/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
@@ -41,7 +41,7 @@ package mx.collections {
 
         private function unwatchAllItems():void
         {
-            for each(var item:Object in _complexFieldWatchers)
+            for(var item:Object in _complexFieldWatchers)
             {
                 unwatchItem(item);
                 delete _complexFieldWatchers[item];
@@ -70,6 +70,11 @@ package mx.collections {
         public function startWatchingForComplexFieldChanges():void
         {
             watchListForChanges();
+            watchAllItems();
+        }
+
+        private function watchAllItems():void
+        {
             watchItems(list);
         }
 
@@ -95,13 +100,13 @@ package mx.collections {
             }
         }
 
-        private function watchItem(item:Object, sortFields:Array):void
+        private function watchItem(item:Object, fieldsToWatch:Array):void
         {
             if(item)
             {
-                for(var i:int = 0; i < sortFields.length; i++)
+                for(var i:int = 0; i < fieldsToWatch.length; i++)
                 {
-                    var sortField:IComplexSortField = sortFields[i] as 
IComplexSortField;
+                    var sortField:IComplexSortField = fieldsToWatch[i] as 
IComplexSortField;
                     if(sortField && sortField.nameParts)
                     {
                         watchItemForField(item, sortField.nameParts);
@@ -176,8 +181,20 @@ package mx.collections {
                     unwatchArrayOfItems(event.items);
                     break;
                 }
+                case CollectionEventKind.REFRESH:
+                case CollectionEventKind.RESET:
+                {
+                    reset();
+                    break;
+                }
             }
         }
+
+        private function reset():void
+        {
+            unwatchAllItems();
+            watchAllItems();
+        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/8b90f8b4/frameworks/projects/framework/tests/FLEX_34854_Tests.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/framework/tests/FLEX_34854_Tests.as 
b/frameworks/projects/framework/tests/FLEX_34854_Tests.as
index f45fc96..5433b32 100644
--- a/frameworks/projects/framework/tests/FLEX_34854_Tests.as
+++ b/frameworks/projects/framework/tests/FLEX_34854_Tests.as
@@ -119,11 +119,74 @@ package {
             assertEquals("the item should have been removed form the list", 
-1, newItemIndex);
             for(var i:int = 0; i < _sut.length; i++)
             {
-                var vo:ListCollectionView_FLEX_34854_VO = _sut.getItemAt(i) as 
ListCollectionView_FLEX_34854_VO;
-                assertThat(vo != removedItem);
+                assertThat(_sut.getItemAt(i) != removedItem);
             }
         }
 
+        [Test]
+        public function 
test_replacing_and_changing_complex_sort_field_value_keeps_it_away_from_collection():void
+        {
+            //given
+            var from1To4:IList = generateVOs(5);
+            from1To4.removeItemAt(0);
+            _sut.addAll(from1To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new 
ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values["address.street"]: Street1, Street2, 
Street3, Street4
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            const replacedItem:ListCollectionView_FLEX_34854_VO = 
_sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+            const newItem:ListCollectionView_FLEX_34854_VO = 
generateOneObject(9);
+            _sut.setItemAt(newItem, 0);
+            replacedItem.address.street = "Street9"; //should make no 
difference
+            newItem.address.street = "Street5"; //should move it to the end of 
the list
+
+            //then
+            const indexOfRemovedItem:int = _sut.getItemIndex(replacedItem);
+            assertEquals("the item should have been removed form the list", 
-1, indexOfRemovedItem);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != replacedItem);
+            }
+            assertEquals("the new item should have been moved to the end of 
the list", _sut.length - 1, _sut.getItemIndex(newItem));
+        }
+
+        [Test]
+        public function 
test_replacing_list_and_changing_old_items_does_not_influence_current_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4);
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new 
ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values["address.street"]: Street0, Street1, 
Street2, Street3, Street4
+
+            //when
+            const firstItemFromOldList:ListCollectionView_FLEX_34854_VO = 
_sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+            _sut.list = generateVOs(3); //values["address.street"]: Street0, 
Street1, Street2
+            const firstItemFromNewList:ListCollectionView_FLEX_34854_VO = 
_sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+
+            firstItemFromOldList.address.street = "Street9"; //should make no 
difference
+            firstItemFromNewList.address.street = "Street9"; //should move it 
to the end of the list
+
+            //then
+            const indexOfRemovedItem:int = 
_sut.getItemIndex(firstItemFromOldList);
+            assertEquals("the item should have been removed form the list", 
-1, indexOfRemovedItem);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != firstItemFromOldList);
+            }
+            assertEquals("the new item should have been moved to the end of 
the list", _sut.length - 1, _sut.getItemIndex(firstItemFromNewList));
+        }
+
         private function assertIndexesAre(indexes:Array):void
         {
             assertEquals(indexes.length, _sut.length);

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/8b90f8b4/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as 
b/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as
index 776b4a4..f762358 100644
--- a/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as
+++ b/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as
@@ -152,9 +152,9 @@ package {
             return new ArrayList(result);
         }
 
-        private static function 
generateOneObject(i:Number):ListCollectionView_FLEX_34837_VO
+        private static function 
generateOneObject(index:Number):ListCollectionView_FLEX_34837_VO
         {
-            return new ListCollectionView_FLEX_34837_VO(i, "Object"+i, 
"Street"+i);
+            return new ListCollectionView_FLEX_34837_VO(index, "Object", 
"Street");
         }
     }
 }

Reply via email to