blob: 20f472bce4207aa12643751135fba1f571283c8c [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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 noTimesAddressBindingTriggered:int;
private static var noTimesStreetBindingTriggered:int;
private static var noTimesStreetNumberBindingTriggered:int;
private static var address:AddressVO;
private static var _house:PropertyVO;
private static var _streetWatcher:ChangeWatcher;
private static var _streetNumberWatcher:ChangeWatcher;
private static var _addressWatcher: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
{
noTimesAddressBindingTriggered = 0;
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);
_house = new PropertyVO(address, "Jim Tim");
_addressWatcher = BindingUtils.bindSetter(setAddress, _house, "address", false, false);
_streetWatcher = BindingUtils.bindSetter(setStreet, address, "street", false, false);
_streetNumberWatcher = BindingUtils.bindSetter(setStreetNumber, address, "number", false, false);
}
[After]
public function tearDown():void
{
_addressWatcher.unwatch();
_streetWatcher.unwatch();
_streetNumberWatcher.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, noTimesAddressBindingTriggered);
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, noTimesAddressBindingTriggered);
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, noTimesAddressBindingTriggered);
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, noTimesAddressBindingTriggered);
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(1, noTimesAddressBindingTriggered);
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(1, noTimesAddressBindingTriggered);
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(1, noTimesAddressBindingTriggered);
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(1, noTimesAddressBindingTriggered);
assertEquals(2, noTimesStreetBindingTriggered);
assertEquals(1, noTimesStreetNumberBindingTriggered);
}
private static function setAddress(newAddress:AddressVO):void
{
noTimesAddressBindingTriggered++;
}
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;
}
}
[Bindable]
class PropertyVO
{
public var address:AddressVO;
public var ownerName:String;
public function PropertyVO(address:AddressVO, ownerName:String)
{
this.address = address;
this.ownerName = ownerName;
}
}