FLEX-34885 Adding unit tests to show that IList/ICollectionView.itemUpdated() creates the same unexpected results as dispatching generic PropertyChangeEvents from list items.
Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/3a71cc8e Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/3a71cc8e Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/3a71cc8e Branch: refs/heads/develop Commit: 3a71cc8ee613c5d8bf45c93ee4a8123b623201ab Parents: cccf3a4 Author: Mihai Chira <[email protected]> Authored: Tue Mar 1 13:43:56 2016 +0100 Committer: Mihai Chira <[email protected]> Committed: Tue Mar 1 13:43:56 2016 +0100 ---------------------------------------------------------------------- ...tCollectionView_PropertyChangeEvent_Tests.as | 99 ++++++++++++++++++++ 1 file changed, 99 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/3a71cc8e/frameworks/projects/framework/tests/mx/collections/ListCollectionView_PropertyChangeEvent_Tests.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/framework/tests/mx/collections/ListCollectionView_PropertyChangeEvent_Tests.as b/frameworks/projects/framework/tests/mx/collections/ListCollectionView_PropertyChangeEvent_Tests.as index 35ba4cc..0f59439 100644 --- a/frameworks/projects/framework/tests/mx/collections/ListCollectionView_PropertyChangeEvent_Tests.as +++ b/frameworks/projects/framework/tests/mx/collections/ListCollectionView_PropertyChangeEvent_Tests.as @@ -174,6 +174,47 @@ package mx.collections { } [Test] + public function test_when_item_is_changed_bypassing_binding_and_collection_notified_of_itemUpdated_with_property_null_is_not_removed_from_list():void + { + //given + _sut.addItem(null); + _sut.filterFunction = allowAll; + _sut.refresh(); + const positionOfNull:int = _sut.getItemIndex(null); + const positionOfFirstWorkout:int = _sut.getItemIndex(_firstWorkout); + + //when + _firstWorkout.setMuscleGroupsWithoutTriggeringBinding("biceps"); + _sut.itemUpdated(_firstWorkout, "muscleGroups", null, _firstWorkout.muscleGroups); + + //then + assertTrue(positionOfNull != -1); + assertEquals(positionOfNull, _sut.getItemIndex(null)); + assertEquals(positionOfFirstWorkout, _sut.getItemIndex(_firstWorkout)); + } + + [Test] + public function test_when_item_is_changed_bypassing_binding_and_collection_notified_of_itemUpdated_without_property_null_is_removed_from_list():void + { + //given + _sut.addItem(null); + _sut.filterFunction = allowAll; + _sut.refresh(); + const positionOfNull:int = _sut.getItemIndex(null); + const positionOfFirstWorkout:int = _sut.getItemIndex(_firstWorkout); + + //when + _firstWorkout.setMuscleGroupsWithoutTriggeringBinding("biceps"); + _firstWorkout.setMinAgeWithoutTriggeringBinding(14); + _sut.itemUpdated(_firstWorkout); + + //then + assertTrue(positionOfNull != -1); + assertEquals(-1, _sut.getItemIndex(null)); + assertEquals(positionOfFirstWorkout, _sut.getItemIndex(_firstWorkout)); + } + + [Test] public function test_when_collection_item_dispatches_PropertyChangeEvent_with_UPDATE_null_is_removed_from_list():void { //given @@ -277,6 +318,32 @@ package mx.collections { assertTrue(_uncaughtError is TypeError); } + [Test] + public function test_when_collection_notified_of_itemUpdated_without_valid_property_sort_compare_function_called_with_null_and_fatals_if_no_null_check():void + { + function compareWorkouts(a:Object, b:Object, fields:Array = null):int + { + if(a.duration > b.duration) + return 1; + if(a.duration < b.duration) + return -1; + + return 0; + } + //given + var sort:InspectableSort = new InspectableSort([], compareWorkouts); + _sut.sort = sort; + _sut.refresh(); + + //when + _firstWorkout.setMuscleGroupsWithoutTriggeringBinding("chest"); + _firstWorkout.setMinAgeWithoutTriggeringBinding(20); + _sut.itemUpdated(_firstWorkout); + + //then - fatal because compareWorkouts was called with null, which it didn't expect (but should have) + assertTrue(_uncaughtError is TypeError); + } + private static function allowAll(object:Object):Boolean { _lastFilteredObject = object; @@ -313,12 +380,44 @@ class WorkoutVO { public var duration:int; public var name:String; + private var _muscleGroups:String; + private var _minAge:uint; public function WorkoutVO(name:String, duration:int) { this.name = name; this.duration = duration; } + + public function get muscleGroups():String + { + return _muscleGroups; + } + + public function set muscleGroups(value:String):void + { + _muscleGroups = value; + } + + public function setMuscleGroupsWithoutTriggeringBinding(groups:String):void + { + _muscleGroups = groups; + } + + public function get minAge():uint + { + return _minAge; + } + + public function set minAge(value:uint):void + { + _minAge = value; + } + + public function setMinAgeWithoutTriggeringBinding(age:uint):void + { + _minAge = age; + } } class InspectableSort extends Sort
