UNPKG

relu-core

Version:
220 lines (216 loc) 7.13 kB
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); })); });