ares-ide
Version:
A browser-based code editor and UI designer for Enyo 2 projects
273 lines (271 loc) • 8.38 kB
JavaScript
enyo.kind({
name: "ObserverTest",
kind: enyo.TestSuite,
noDefer: true,
testPublishedPropertyAsObserver: function () {
var test = {}, o;
test.Object = enyo.kind({
kind: enyo.Object,
published: {
testProp: false
},
testPropChanged: function () {}
});
o = new test.Object();
this.finish(
(!o.observers.testPropChanged && "the testPropChanged method should have been an observer") ||
(enyo.indexOf("testProp", o.observers.testPropChanged) !== 0 && "observer dependency should have been testProp") ||
(!o.observerMap.testProp && "observer map did not include dependency map of testProp") ||
(enyo.trim(o.observerMap.testProp) !== "testPropChanged" && "observer map should map testProp to testPropChanged handler")
);
},
testFindChangedHandlers: function () {
var test = {}, o;
test.Object = enyo.kind({
kind: enyo.Object,
testPropChanged: function () {},
testProp1Changed: function () {}
});
o = new test.Object();
this.finish(
(!o.observerMap.testProp && "testProp was not automatically added as an observer") ||
(!o.observerMap.testProp1 && "testProp1 was not automatically added as an observer")
);
},
testAddObserverAPI: function () {
var test = {}, o, s = this, fn = function (p,c,prop) {
s.finish(
(!prop && "the property parameter wasn't present") ||
(prop !== "testProp" && "the property parameter wasn't correct") ||
(p !== 0 && "previous value not correct") ||
(c !== 1 && "current value not correct")
);
};
test.Object = enyo.kind({
kind: enyo.Object,
published: {
testProp: 0
}
});
o = new test.Object();
o.addObserver("testProp", fn);
if (!o.observerMap.testProp) {
return this.finish("observer map not updated on addObserver as expected");
}
o.set("testProp", 1);
},
testRemoveObserverAPI: function () {
var o = new enyo.Object(), fn = function () {};
o.addObserver("noName", fn);
if (!o.observerMap.noName) {
return this.finish("remove observer API cannot work because add observer API doesn't work");
}
o.removeObserver("noName", fn);
if (o.observerMap.noName) {
return this.finish("failed to remove the entry for the observer as expected");
}
this.finish();
},
testNotificationQueue: function () {
var test = {}, s = this, o, allowed = false;
test.Object = enyo.kind({
kind: enyo.Object,
published: {
testProp: 0
},
testPropChanged: function (p,c,prop) {
if (!allowed) {
throw "observer fired even when notifications were turned off";
} else {
s.finish(
(p !== 1 && "even though the property was queued it did not update the parameters") ||
(c !== 2 && "even though the property was queued it did not update the parameters")
);
}
}
});
o = new test.Object();
o.stopNotifications();
if (o.observerNotificationsEnabled) {
return this.finish("the notifications flag was still enabled");
}
if (o.observerStopCount !== 1) {
return this.finish("the stop count was not updated as expected");
}
o.set("testProp", 1);
// when enabled again the queue should flush only one updated for the observer
// and its values should have been updated
o.set("testProp", 2);
allowed = true;
o.startNotifications();
},
testInheritedKindObservers: function () {
var test = {},
rs = "",
ex = "This message should be short and it should be stupid, but all's well that ends well, right?";
test.Object1 = enyo.kind({
kind: enyo.Object,
observers: {observer1: ["myProp1"]},
observer1: function () {
rs += "This message " + this.myProp1 + " short and it ";
}
});
test.Object2 = enyo.kind({
kind: test.Object1,
observers: {
observer3: ["myProp1"],
observer2: ["myProp2"]
},
observer1: function () {
this.inherited(arguments);
rs += this.myProp1 + " stupid, but";
},
observer2: function () {
rs += " that " + this.myProp2 + ", right?";
},
observer3: function () {
rs += " all's well";
}
});
test.i = new test.Object2();
test.i.set("myProp1", "should be");
test.i.set("myProp2", "ends well");
this.finish(rs != ex && "the sentences did not match, `" +rs+ "` should have read `" + ex + "`");
}
});
enyo.kind({
name: "ComputedTest",
kind: enyo.TestSuite,
noDefer: true,
testWithComputedProperties: function () {
var test = {}, o, s = this, allowed = false;
test.Object = enyo.kind({
kind: enyo.Object,
published: {
testProp: 1
},
computed: {
testProp1: ["testProp"],
testProp2: ["testProp1", "testProp"]
},
testProp1: function () {
return 1 + this.get("testProp");
},
testProp2: function () {
return this.get("testProp") + this.get("testProp1");
},
testProp2Changed: function (p,c,prop) {
if (!allowed) {
throw "observer fired but notifications were disabled";
}
s.finish(c !== 7 && "computed value was not correct, expected 7, got " + c);
}
});
o = new test.Object();
o.stopNotifications();
o.set("testProp", 2);
o.set("testProp", 3);
allowed = true;
o.startNotifications();
},
testComputedWithBindings: function () {
var test = {}, o, t, s = this;
test.Object = enyo.kind({
kind: enyo.Object,
published: {
first: "",
last: ""
},
computed: {
fullName: ["first", "last"]
},
fullName: function () {
return this.get("first") + " " + this.get("last");
}
});
o = new test.Object({first: "Polly", last: "Shore"});
t = new enyo.Object({
fullNameChanged: function () {
s.finish(
(this.fullName != "Polly Shore" && "name changed but was not correct")
);
}
});
o.binding({from: ".fullName", to: ".fullName", target: t});
},
testInheritedKindComputed: function () {
var test = {},
rs = "",
ex = "This message should be short and it should be stupid, but all's well that ends well, right?";
test.Object1 = enyo.kind({
kind: enyo.Object,
computed: {observer1: ["myProp1"]},
observer1: function () {
return "This message " + this.myProp1 + " short and it ";
}
});
test.Object2 = enyo.kind({
kind: test.Object1,
computed: {
observer2: ["myProp2"]
},
observer1: function () {
var r = this.inherited(arguments);
return (r += this.myProp1 + " stupid, but all's well");
},
observer2: function () {
return " that " + this.myProp2 + ", right?";
}
});
test.i = new test.Object2();
test.i.set("myProp1", "should be");
test.i.set("myProp2", "ends well");
rs = test.i.get("observer1") + test.i.get("observer2");
this.finish(rs != ex && "the sentences did not match, `" +rs+ "` should have read `" + ex + "`");
},
testDuplicateEntries: function () {
/*global test:true */
enyo.kind({
name: "test.OCSTBase",
noDefer: true,
defaultProp1Changed: function () {},
observers: {
prop1Changed: ["prop1.1", "prop1.2", "prop1.3"]
},
computed: {
prop1Computed: ["prop1.1", "prop1.2", {cached: true}]
}
});
enyo.kind({
name: "test.OCSTKind",
kind: "test.OCSTBase",
noDefer: true,
defaultPropChanged: function () {},
observers: {
prop1Changed: ["prop1.1", "prop1.2"],
defaultPropChanged: ["aDifferentProp"]
},
computed: {
prop1Computed: ["prop1.1", "prop1.3"]
}
});
var k = test.OCSTKind.prototype;
var i;
if (!~(i=enyo.indexOf("defaultProp", k.observers.defaultPropChanged)) || (i!==enyo.lastIndexOf("defaultProp", k.observers.defaultPropChanged))) {
return this.finish("no entry or duplicate entry of observer property from implicit + explicit");
}
if (!~(i=enyo.indexOf("prop1.1", k.observers.prop1Changed)) || (i!==enyo.lastIndexOf("prop1.1", k.observers.prop1Changed))) {
return this.finish("no entry or dupcliate entry of observer for compound observer via inheritance");
}
if (k.observers.prop1Changed != "prop1.1 prop1.2 prop1.3") {
return this.finish("the observer entry was either the wrong format or missing properties");
}
if (!~(i=enyo.indexOf("prop1.1", k.computed.prop1Computed)) || (i!==enyo.lastIndexOf("prop1.1", k.computed.prop1Computed))) {
return this.finish("no entry or duplicate entry of computed property from inherited kind");
}
if (k.computed.prop1Computed != "prop1.1 prop1.2 prop1.3") {
return this.finish("the computed entry was either the wrong format or missing properties");
}
this.finish();
}
});