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"); } } }
