can
Version:
MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.
222 lines (202 loc) • 4.84 kB
JavaScript
define(["doh/main", "../Stateful", "../_base/declare", "../Deferred", "../json"],
function(doh, Stateful, declare, Deferred, JSON){
doh.register("tests.Stateful", [
function getSetWatch(t){
var s = new Stateful({
foo: 3
});
doh.is(3, s.get("foo"));
var watching = s.watch("foo", function(name, oldValue, value){
doh.is("foo", name);
doh.is(3, oldValue);
doh.is(4, value);
doh.is(4, s.get("foo"));
});
s.set("foo", 4);
doh.is(4, s.get("foo"));
watching.unwatch();
s.set("foo", 5);
doh.is(5, s.get("foo"));
},
function removeWatchHandle(t){
var s = new Stateful({
foo: 3
}),
watched = false;
var watching = s.watch("foo", function(){
t.f(watched);
watched = true;
});
s.set("foo", 4);
watching.remove();
s.set("foo", 5);
},
function removeWatchHandleTwice(t){
var s = new Stateful({
foo: 3
}),
assertions = 0;
var watching = s.watch("foo", function(){
assertions++;
});
var watching2 = s.watch("foo", function(){
assertions++;
});
s.set("foo", 4);
watching.remove();
watching.remove();
s.set("foo", 5);
t.is(3, assertions, "assertions");
},
function setHash(t){
var s = new Stateful(),
fooCount = 0,
handle = s.watch('foo', function () {
fooCount++;
});
s.set({
foo:3,
bar: 5
});
doh.is(3, s.get("foo"));
doh.is(5, s.get("bar"));
doh.is(1, fooCount);
var s2 = new Stateful();
s2.set(s);
doh.is(3, s2.get("foo"));
doh.is(5, s2.get("bar"));
// s watchers should not be copied to s2
doh.is(1, fooCount);
handle.unwatch();
},
function wildcard(t){
var s = new Stateful();
s.set({
foo: 3,
bar: 5
});
var wildcard = 0;
var foo = 0;
s.watch(function(){
wildcard++;
});
s.watch("foo", function(){
foo++;
});
s.set("foo", 4);
s.set("bar", 6);
doh.is(2, wildcard);
doh.is(1, foo);
},
function accessors(t){
var StatefulClass1 = declare([Stateful],{
foo: "",
bar: 0,
baz: "",
_fooSetter: function(value){
this.foo = value;
},
_fooGetter: function(){
return "bar";
},
_barSetter: function(value){
this.bar = value;
}
});
var attr1 = new StatefulClass1();
attr1.set("foo", "nothing");
attr1.set("bar", 2);
attr1.set("baz", "bar");
t.is("nothing", attr1.foo, "attribute set properly");
t.is("bar", attr1.get("foo"), "getter working properly");
t.is(2, attr1.bar, "attribute set properly");
t.is( 2, attr1.get("bar"), "getter working properly");
t.is("bar", attr1.get("baz"), "getter working properly");
t.is("bar", attr1.baz, "properly set properly");
},
function paramHandling(t){
var StatefulClass2 = declare([Stateful], {
foo: null,
bar: 5,
_fooSetter: function(value){
this.foo = value;
},
_barSetter: function(value){
this.bar = value;
}
});
var attr2 = new StatefulClass2({
foo: function(){
return "baz";
},
bar: 4
});
t.is("function", typeof attr2.foo, "function attribute set");
t.is("baz", attr2.foo(), "function has proper return value");
t.is(4, attr2.get("bar"), "attribute has proper value");
},
function deferredSetting(t){
var td = new doh.Deferred();
var StatefulClass3 = declare([Stateful], {
foo: null,
_fooSetter: function(value){
var d = new Deferred();
var self = this;
setTimeout(function(){
self.foo = value;
d.resolve(value);
}, 50);
return d;
}
});
var attr3 = new StatefulClass3();
attr3.watch("foo", function(name, oldValue, value){
t.is("foo", name, "right attribute");
t.f(oldValue, "no value previously");
t.is(3, value, "new value set");
td.callback(true);
});
attr3.set("foo", 3);
return td;
},
function changeAttrValue(t){
var output = [];
var StatefulClass4 = declare([Stateful], {
foo: null,
bar: null,
_fooSetter: function(value){
this._changeAttrValue("bar", value);
this.foo = value;
},
_barSetter: function(value){
this._changeAttrValue("foo", value);
this.bar = value;
}
});
var attr4 = new StatefulClass4();
attr4.watch("foo", function(name, oldValue, value){
output.push(name, oldValue, value);
});
attr4.watch("bar", function(name, oldValue, value){
output.push(name, oldValue, value);
});
attr4.set("foo", 3);
t.is(3, attr4.get("bar"), "value set properly");
attr4.set("bar", 4);
t.is(4, attr4.get("foo"), "value set properly");
t.is(["bar", null, 3, "foo", null, 3, "foo", 3, 4, "bar", 3, 4], output);
},
function serialize(t){
var StatefulClass5 = declare([Stateful], {
foo: null,
_fooSetter: function(value){
this.foo = value + "baz";
}
});
var obj = new StatefulClass5({
foo: "bar"
});
t.is('{"foo":"barbaz"}', JSON.stringify(obj), "object serializes properly");
}
]);
});