Repository: flex-sdk Updated Branches: refs/heads/develop 9778f4142 -> 3f7bd745a
FLEX-34885 Testing some assumptions about how bindings work in relation to PropertyChangeEvents, because dispatches of generic PropertyChangeEvents might interfere with assumptions put in for this fix. More unit tests will follow, specifically for interactions with lists. Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/3f7bd745 Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/3f7bd745 Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/3f7bd745 Branch: refs/heads/develop Commit: 3f7bd745a388cf67d356edb0f4ac9661675d6efb Parents: 9778f41 Author: Mihai Chira <mih...@apache.org> Authored: Mon Feb 22 14:00:04 2016 +0100 Committer: Mihai Chira <mih...@apache.org> Committed: Mon Feb 22 14:00:04 2016 +0100 ---------------------------------------------------------------------- .../mx/binding/utils/BindingUtils_Tests.as | 201 +++++++++++++++++++ 1 file changed, 201 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/3f7bd745/frameworks/projects/framework/tests/mx/binding/utils/BindingUtils_Tests.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/framework/tests/mx/binding/utils/BindingUtils_Tests.as b/frameworks/projects/framework/tests/mx/binding/utils/BindingUtils_Tests.as new file mode 100644 index 0000000..5170531 --- /dev/null +++ b/frameworks/projects/framework/tests/mx/binding/utils/BindingUtils_Tests.as @@ -0,0 +1,201 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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.binding.utils { + import mx.events.PropertyChangeEvent; + import mx.events.PropertyChangeEventKind; + import mx.utils.ObjectUtil; + + import org.flexunit.asserts.assertEquals; + import org.flexunit.asserts.assertTrue; + + public class BindingUtils_Tests + { + private static var noTimesStreetBindingTriggered:int; + private static var noTimesStreetNumberBindingTriggered:int; + private static var address:AddressVO; + private static var addressWatcher:ChangeWatcher; + private static var addressNumberWatcher:ChangeWatcher; + private static var PROPERTY_CHANGE_EVENT:PropertyChangeEvent; + private static var PROPERTY_CHANGE_EVENT_UPDATE:PropertyChangeEvent; + private static var PROPERTY_CHANGE_EVENT_UPDATE_CONVENIENCE:PropertyChangeEvent; + + private static const STREET_INITIAL:String = "La Rambla"; + private static const STREET_OTHER:String = "Champs-Elysées"; + private static const STREET_NO_INITIAL:int = 23; + private static const STREET_NO_OTHER:int = 54; + + [Before] + public function setUp():void + { + noTimesStreetBindingTriggered = 0; + noTimesStreetNumberBindingTriggered = 0; + + PROPERTY_CHANGE_EVENT = new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE); + PROPERTY_CHANGE_EVENT_UPDATE = new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, false, false, PropertyChangeEventKind.UPDATE); + PROPERTY_CHANGE_EVENT_UPDATE_CONVENIENCE = PropertyChangeEvent.createUpdateEvent(null, null, null, null); + + address = new AddressVO(STREET_INITIAL, STREET_NO_INITIAL); + + addressWatcher = BindingUtils.bindSetter(setStreet, address, "street", false, false); + addressNumberWatcher = BindingUtils.bindSetter(setStreetNumber, address, "number", false, false); + } + + [After] + public function tearDown():void + { + addressWatcher.unwatch(); + addressNumberWatcher.unwatch(); + + PROPERTY_CHANGE_EVENT = null; + PROPERTY_CHANGE_EVENT_UPDATE = null; + PROPERTY_CHANGE_EVENT_UPDATE_CONVENIENCE = null; + } + + [Test] + public function test_binding_triggered_at_binding_definition():void + { + //then + assertTrue(1, noTimesStreetBindingTriggered); + assertTrue(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_triggered_at_manual_property_change():void + { + //when + address.street = STREET_OTHER; + address.number = STREET_NO_OTHER; + + //then + assertTrue(2, noTimesStreetBindingTriggered); + assertTrue(2, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_not_triggered_at_generic_PropertyChangeEvent_dispatch():void + { + //when + address.dispatchEvent(PROPERTY_CHANGE_EVENT); + + //then + assertEquals(1, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_PropertyChangeEvents_equivalent():void + { + //when + var eventComparison:int = ObjectUtil.compare(PROPERTY_CHANGE_EVENT_UPDATE, PROPERTY_CHANGE_EVENT_UPDATE_CONVENIENCE); + + //then + assertEquals(0, eventComparison); + } + + [Test] + public function test_binding_not_triggered_at_PropertyChangeEvent_UPDATE_dispatch():void + { + //when + address.dispatchEvent(PROPERTY_CHANGE_EVENT_UPDATE); + + //then + assertEquals(1, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_not_triggered_at_PropertyChangeEvent_UPDATE_dispatch_created_with_nulls_in_convenience_method():void + { + //when + address.dispatchEvent(PROPERTY_CHANGE_EVENT_UPDATE_CONVENIENCE); + + //then + assertEquals(1, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_triggered_at_PropertyChangeEvent_UPDATE_dispatch_created_with_expected_values_in_convenience_method():void + { + //when + address.dispatchEvent(PropertyChangeEvent.createUpdateEvent(address, "street", address.street, STREET_OTHER)); + + //then + assertEquals(2, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_triggered_at_PropertyChangeEvent_UPDATE_dispatch_created_with_expected_values_except_source():void + { + //when + address.dispatchEvent(PropertyChangeEvent.createUpdateEvent(null, "street", address.street, STREET_OTHER)); + + //then + assertEquals(2, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_triggered_at_PropertyChangeEvent_UPDATE_dispatch_created_only_with_property_name():void + { + //when + address.dispatchEvent(PropertyChangeEvent.createUpdateEvent(null, "street", null, null)); + + //then + assertEquals(2, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + [Test] + public function test_binding_triggered_at_PropertyChangeEvent_UPDATE_dispatch_created_with_expected_values():void + { + //when + address.dispatchEvent(new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, false, false, PropertyChangeEventKind.UPDATE, "street", address.street, STREET_OTHER, address)); + + //then + assertEquals(2, noTimesStreetBindingTriggered); + assertEquals(1, noTimesStreetNumberBindingTriggered); + } + + private static function setStreet(newStreet:String):void + { + noTimesStreetBindingTriggered++; + } + + private static function setStreetNumber(newStreetNumber:int):void + { + noTimesStreetNumberBindingTriggered++; + } + } +} + +[Bindable] +class AddressVO +{ + public var street:String; + public var number:int; + + public function AddressVO(street:String, number:int) + { + this.street = street; + this.number = number; + } +} \ No newline at end of file