///
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(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(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(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(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(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(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);
}
);
});
}