123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- /// <reference path="../../../src/tools/babylon.observable.ts" />
- module JasmineTest {
- import ObservableArray = BABYLON.ObservableArray;
- import ArrayChanged = BABYLON.ArrayChanged;
- import PropertyChangedBase = BABYLON.PropertyChangedBase;
- class Customer extends PropertyChangedBase {
- constructor(firstName: string, lastName: string) {
- super();
- this._firstName = firstName;
- this._lastName = lastName;
- }
- public get firstName(): string {
- return this._firstName;
- }
- public set firstName(value: string) {
- if (this._firstName === value) {
- return;
- }
- let old = this._firstName;
- let oldDN = this.displayName;
- this._firstName = value;
- this.onPropertyChanged("firstName", old, value);
- this.onPropertyChanged("displayName", oldDN, this.displayName);
- }
- public get lastName(): string {
- return this._lastName;
- }
- public set lastName(value: string) {
- if (this._lastName === value) {
- return;
- }
- let old = this._lastName;
- let oldDN = this.displayName;
- this._lastName = value;
- this.onPropertyChanged("lastName", old, value);
- this.onPropertyChanged("displayName", oldDN, this.displayName);
- }
- public get displayName(): string {
- return this.firstName + " " + this.lastName;
- }
- private _firstName: string;
- private _lastName: string;
- }
- describe("Tools - ObservableArray",
- () => {
- it("Push",
- () => {
- let oa = new ObservableArray<Customer>(true);
- oa.push(new Customer("loic", "baumann"));
- oa.propertyChanged.add((e, c) => {
- expect(e.oldValue).toBe(1, "PropChanged length is bad");
- expect(e.newValue).toBe(2, "PropChanged length is bad");
- });
- oa.arrayChanged.add((e, c) => {
- expect(e.action).toBe(ArrayChanged.newItemsAction, "Wrong ArrayChanged action");
- expect(e.newItems.length).toBe(1);
- let item = e.newItems[0];
- expect(item.index).toEqual(1);
- expect(item.value.firstName).toBe("david");
- expect(e.newStartingIndex).toBe(1);
- });
- oa.push(new Customer("david", "catuhe"));
- expect(oa.length).toBe(2);
- let item = oa.getAt(1);
- expect(item).toBeDefined();
- expect(item.firstName).toBe("david");
- let triggerCounter = 0;
- oa.watchedObjectChanged.add((e, c) => {
- if (triggerCounter === 0) {
- expect(e.propertyChanged.propertyName).toBe("firstName");
- expect(e.propertyChanged.oldValue).toBe("david");
- expect(e.propertyChanged.newValue).toBe("delta");
- ++triggerCounter;
- } else {
- expect(e.propertyChanged.propertyName).toBe("displayName");
- expect(e.propertyChanged.oldValue).toBe("david catuhe");
- expect(e.propertyChanged.newValue).toBe("delta catuhe");
- ++triggerCounter;
- }
- });
- }
- );
- it("SetAt/GetAt",
- () => {
- let oa = new ObservableArray<Customer>(true);
- let propChangedCount = 0;
- let co = oa.propertyChanged.add((e, c) => {
- if (e.propertyName !== "length") {
- return;
- }
- expect(e.oldValue).toBe(e.newValue - ((e.oldValue===3) ? 2 : 1), "bad length value reported in PropChanged");
- ++propChangedCount;
- expect(propChangedCount).toBeLessThan(5, "PropChanged notif sent during illegal item insertion");
- });
- let triggerCount = 0;
- let aco = oa.arrayChanged.add((e, c) => {
- expect(e.action).toBe(ArrayChanged.newItemsAction, "Wrong ArrayChanged action");
- switch (triggerCount) {
- case 0:
- expect(e.newItems.length).toBe(1);
- expect(e.newItems[0].index).toEqual(0);
- expect(e.newItems[0].value.firstName).toEqual("Mike");
- expect(e.newStartingIndex).toBe(0);
- break;
- case 1:
- expect(e.newItems.length).toBe(1);
- expect(e.newItems[0].index).toEqual(1);
- expect(e.newItems[0].value.firstName).toEqual("Steven");
- expect(e.newStartingIndex).toBe(1);
- break;
- case 2:
- expect(e.newItems.length).toBe(1);
- expect(e.newItems[0].index).toEqual(2);
- expect(e.newItems[0].value.firstName).toEqual("John");
- expect(e.newStartingIndex).toBe(2);
- break;
- case 3:
- expect(e.newItems.length).toBe(1);
- expect(e.newItems[0].index).toEqual(4);
- expect(e.newItems[0].value.firstName).toEqual("Matthew");
- expect(e.newStartingIndex).toBe(4);
- break;
- default:
- fail("arrayChanged called abnormally");
- }
- ++triggerCount;
- });
- oa.setAt(0, new Customer("Mike", "Portnoy"));
- oa.setAt(1, new Customer("Steven", "Wilson"));
- oa.setAt(2, new Customer("John", "Petrucci"));
- oa.setAt(4, new Customer("Matthew", "Bellamy"));
- oa.setAt(-10, new Customer("Hilary", "Hahn"));
- oa.propertyChanged.remove(co);
- oa.arrayChanged.remove(aco);
- expect(oa.length).toBe(5);
- expect(oa.getAt(0).firstName).toBe("Mike");
- expect(oa.getAt(1).firstName).toBe("Steven");
- expect(oa.getAt(2).firstName).toBe("John");
- expect(oa.getAt(4).firstName).toBe("Matthew");
- triggerCount = 0;
- oa.arrayChanged.add((e, c) => {
- expect(e.action).toBe((triggerCount < 2) ? ArrayChanged.changedItemAction : ArrayChanged.newItemsAction, "Wrong ArrayChanged action");
- switch (triggerCount) {
- case 0:
- expect(e.changedItems.length).toBe(1);
- expect(e.changedItems[0].index).toEqual(0);
- expect(e.changedItems[0].value.firstName).toEqual("MP");
- expect(e.changedStartingIndex).toBe(0);
- break;
- case 1:
- expect(e.changedItems.length).toBe(1);
- expect(e.changedItems[0].index).toEqual(1);
- expect(e.changedItems[0].value.firstName).toEqual("SW");
- expect(e.changedStartingIndex).toBe(1);
- break;
- case 2:
- expect(e.newItems.length).toBe(1);
- expect(e.newItems[0].index).toEqual(3);
- expect(e.newItems[0].value.firstName).toEqual("JP");
- expect(e.newStartingIndex).toBe(3);
- break;
- }
- ++triggerCount;
- });
- let cust0 = new Customer("MP", "Portnoy");
- let cust1 = new Customer("SW", "Wilson");
- let cust3 = new Customer("JP", "Petrucci");
- oa.setAt(0, cust0);
- oa.setAt(1, cust1);
- oa.setAt(3, cust3);
- let triggerCounter = 0;
- let propTriggered = false;
- oa.watchedObjectChanged.add((e, c) => {
- propTriggered = true;
- if (e.propertyChanged.propertyName === "firstName") {
- expect(e.propertyChanged.newValue).not.toBe("MP");
- expect(e.propertyChanged.newValue).not.toBe("SW");
- expect(e.propertyChanged.newValue).not.toBe("JP");
- }
- if (triggerCounter === 0) {
- expect(e.propertyChanged.propertyName).toBe("firstName");
- expect(e.propertyChanged.oldValue).toBe("MP");
- expect(e.propertyChanged.newValue).toBe("BestDrummerInDaWorld");
- ++triggerCounter;
- } else {
- expect(e.propertyChanged.propertyName).toBe("displayName");
- expect(e.propertyChanged.oldValue).toBe("MP Portnoy");
- expect(e.propertyChanged.newValue).toBe("BestDrummerInDaWorld Portnoy");
- ++triggerCounter;
- }
- });
- cust0.firstName = "BestDrummerInDaWorld";
- expect(propTriggered).toBe(true, "no WatchedObjectChanged was called, not ok!");
- }
- );
- it("Pop",
- () => {
- let oa = new ObservableArray<Customer>(true);
- oa.push(new Customer("Myles", "Kennedy"));
- oa.propertyChanged.add((e, c) => {
- expect(e.oldValue).toBe(1);
- expect(e.newValue).toBe(0);
- });
- oa.arrayChanged.add((e, c) => {
- expect(e.action).toBe(ArrayChanged.removedItemsAction);
- expect(e.removedItems.length).toBe(1);
- expect(e.removedItems[0].index).toEqual(0);
- expect(e.removedItems[0].value.firstName).toEqual("Myles");
- expect(e.removedStartingIndex).toBe(0);
- });
- let pop = oa.pop();
- expect(pop.firstName).toBe("Myles");
- oa.watchedObjectChanged.add((e, c) => {
- fail("watchedObject shouldn't be called as only a removed object had a property changed");
- });
- pop.firstName = "MK";
- }
- );
- it("Concat",
- () => {
- let oa = new ObservableArray<string>(false);
- oa.push("item0", "item1", "item2");
- oa.setAt(4, "item4");
- let noa = oa.concat("pipo0", "pipo1", "pipo2");
- let res = ["item0", "item1", "item2", "item4", "pipo0", "pipo1", "pipo2"];
- let i = 0;
- noa.forEach((v) => {
- expect(v).toBe(res[i++]);
- });
- expect(noa.length).toBe(8);
- }
- );
- it("Shift",
- () => {
- let oa = new ObservableArray<string>(false);
- oa.push("item0", "item1", "item2");
- oa.propertyChanged.add((e, c) => {
- expect(e.oldValue).toBe(3);
- expect(e.newValue).toBe(2);
- });
- oa.arrayChanged.add((e, c) => {
- expect(e.action).toBe(ArrayChanged.replacedArrayAction);
- expect(e.removedItems.length).toBe(1);
- expect(e.removedItems[0]).toEqual({ index: 0, value: "item0" });
- expect(oa.getAt(0)).toEqual("item1");
- expect(oa.getAt(1)).toEqual("item2");
- expect(e.removedStartingIndex).toBe(0);
- });
- oa.shift();
- }
- );
- it("Sort",
- () => {
- let oa = new ObservableArray<number>(false);
- oa.push(3, 2, 4, 1);
- oa.propertyChanged.add((e, c) => {
- fail("no propertyChanged should be fired");
- });
- oa.arrayChanged.add((e, c) => {
- expect(e.action).toBe(ArrayChanged.replacedArrayAction);
- expect(oa.getAt(0)).toEqual(1);
- expect(oa.getAt(1)).toEqual(2);
- expect(oa.getAt(2)).toEqual(3);
- expect(oa.getAt(3)).toEqual(4);
- });
- oa.sort((a, b) => a - b);
- }
- );
- });
- }
|