relu-core
Version:
220 lines (216 loc) • 7.13 kB
JavaScript
var should = require("should");
var rp = require("../");
var checkRefs = require("./checkRefs");
describe("property", function() {
it("should operate with property in a flat object", checkRefs(function() {
var x = rp.variable({
a: 1,
b: 2
});
var a = x("a");
a().should.be.eql(1);
a.set(3);
a().should.be.eql(3);
x().should.be.eql({a:3,b:2});
x.set({b:{test:1}});
should.not.exist(a());
a.set(5);
a().should.be.eql(5);
x().should.be.eql({b:{test:1},a:5});
}));
it("should operate with properties in a nested object", checkRefs(function() {
var x = rp.variable({
a: {
b: {
c: "test"
}
}
});
var a = x("a");
var c = a("b", "c");
var e = x("a", "d", "e");
var c2 = c.computed(function(c) {
if(c) return c + c;
});
var e2 = e.computed(function(e) {
if(e) return e + e;
});
c().should.be.eql("test");
c2().should.be.eql("testtest");
should.not.exist(e());
should.not.exist(e2());
c.set("TEST");
e.set("TTEESSTT");
e2().should.be.eql("TTEESSTTTTEESSTT");
a().should.be.eql({
b: { c: "TEST" },
d: { e: "TTEESSTT" }
});
a.set({
b: { c: 123 },
d: { f: 456 }
});
c().should.be.eql(123);
c2().should.be.eql(246);
should.not.exist(e());
should.not.exist(e2());
}));
it("should dynamically access properties", checkRefs(function() {
var what = rp.variable("a.b.c");
var obj = rp.const({
a: {
b: {
c: 1,
d: 2
},
e: 3
},
f: 4
});
what.split(".")().should.be.eql(["a", "b", "c"]);
var x = obj(what.split("."));
var y = x.computed(function(x) {
return what() + " is " + x;
});
y().should.be.eql("a.b.c is 1");
what.set("a.b.d");
y().should.be.eql("a.b.d is 2");
what.set("a.e");
y().should.be.eql("a.e is 3");
what.set("f");
y().should.be.eql("f is 4");
what.set("g");
y().should.be.eql("g is undefined");
what.set("d.e.f");
y().should.be.eql("d.e.f is undefined");
}));
it("should map arrays on properties", checkRefs(function() {
var array = rp.variable([{
a: 1,
b: { c: 3 }
}, {
a: 2,
b: { c: 4 }
}, undefined]);
var summary = rp.computed(function() {
return [array(0, "a")(), array(0, "b", "c")(), array(1, "a")(), array(1, "b", "c")(), array(2, "a")(), array(2, "b", "c")()];
});
summary().should.be.eql([1, 3, 2, 4, undefined, undefined]);
var a = array("a");
a().should.be.eql([1, 2, undefined]);
a.set("test");
a().should.be.eql(["test", "test", "test"]);
summary().should.be.eql(["test", 3, "test", 4, "test", undefined]);
var c = array("b", "c");
c().should.be.eql([3, 4, undefined]);
c.set("test2");
c().should.be.eql(["test2", "test2", "test2"]);
summary().should.be.eql(["test", "test2", "test", "test2", "test", "test2"]);
}));
it("should fire correct events", checkRefs(function() {
var obj = rp.variable({
a: {
b: 1
},
c: 1
});
var b = obj("a", "b");
var c = obj("c");
var events = [];
obj.onChanged(function() {
events.push("obj changed");
});
b.onChanged(function() {
events.push("b changed");
});
c.onChanged(function() {
events.push("c changed");
});
b.onUpdated(function(n, o) {
events.push(["b updated", n, o]);
});
c.onUpdated(function(n, o) {
events.push(["c updated", n, o]);
});
c.set(2);
events.shift().should.be.eql(["c updated", 2, 1]);
events.shift().should.be.eql("c changed");
events.shift().should.be.eql("obj changed");
b.set(2);
events.shift().should.be.eql(["b updated", 2, 1]);
events.shift().should.be.eql("b changed");
events.shift().should.be.eql("obj changed");
obj.set("a", {b: 3});
events.shift().should.be.eql(["b updated", 3, 2]);
events.shift().should.be.eql("b changed");
events.shift().should.be.eql("obj changed");
obj.set({});
events.shift().should.be.eql(["c updated", undefined, 2]);
events.shift().should.be.eql("c changed");
events.shift().should.be.eql(["b updated", undefined, 3]);
events.shift().should.be.eql("b changed");
events.shift().should.be.eql("obj changed");
events.length.should.be.eql(0);
rp.atomic(function() {
b.set(10);
c.set(10);
});
events.shift().should.be.eql(["b updated", 10, undefined]);
events.shift().should.be.eql("b changed");
events.shift().should.be.eql(["c updated", 10, undefined]);
events.shift().should.be.eql("c changed");
events.shift().should.be.eql("obj changed");
events.length.should.be.eql(0);
}));
it("should fire nested events", checkRefs(function() {
var obj = rp.variable({
a: {
b: {
c: 1,
d: [2, 2]
},
e: 3,
f: [
{g: 1}
]
},
h: 5
});
var events = [];
obj.onNested(function(event, path, arg1, arg2) {
events.push(["obj", event, path, arg1, arg2]);
});
obj("a").onNested(function(event, path, arg1, arg2) {
events.push(["a", event, path, arg1, arg2]);
});
obj("a", "e").set(4);
events.shift().should.be.eql(["obj", "updated", ["a", "e"], 4, 3]);
events.shift().should.be.eql(["a", "updated", ["e"], 4, 3]);
events.shift().should.be.eql(["obj", "changed", ["a", "e"], undefined, undefined]);
events.shift().should.be.eql(["a", "changed", ["e"], undefined, undefined]);
events.shift().should.be.eql(["obj", "changed", ["a"], undefined, undefined]);
obj("a", "b", "d").push(2);
events.shift().should.be.eql(["obj", "added", ["a", "b", "d"], 2, 2]);
events.shift().should.be.eql(["a", "added", ["b", "d"], 2, 2]);
events.shift().should.be.eql(["obj", "changed", ["a", "b", "d"], undefined, undefined]);
events.shift().should.be.eql(["a", "changed", ["b", "d"], undefined, undefined]);
events.shift().should.be.eql(["obj", "changed", ["a", "b"], undefined, undefined]);
events.shift().should.be.eql(["a", "changed", ["b"], undefined, undefined]);
events.shift().should.be.eql(["obj", "changed", ["a"], undefined, undefined]);
obj("a", "f", 0, "g").set(2);
events.shift().should.be.eql(["obj", "updated", ["a", "f", 0, "g"], 2, 1]);
events.shift().should.be.eql(["a", "updated", ["f", 0, "g"], 2, 1]);
events.shift().should.be.eql(["obj", "changed", ["a", "f", 0, "g"], undefined, undefined]);
events.shift().should.be.eql(["a", "changed", ["f", 0, "g"], undefined, undefined]);
events.shift().should.be.eql(["obj", "changed", ["a", "f", 0], undefined, undefined]);
events.shift().should.be.eql(["a", "changed", ["f", 0], undefined, undefined]);
events.shift().should.be.eql(["obj", "changed", ["a", "f"], undefined, undefined]);
events.shift().should.be.eql(["a", "changed", ["f"], undefined, undefined]);
events.shift().should.be.eql(["obj", "changed", ["a"], undefined, undefined]);
var n, o = obj("a")();
obj("a").set(n = {b: "test", e: 3, f: [ {g: 2} ]});
events.shift().should.be.eql(["obj", "updated", ["a"], n, o]);
events.shift().should.be.eql(["obj", "changed", ["a"], undefined, undefined]);
events.length.should.be.eql(0);
}));
});