relu-core
Version:
106 lines (105 loc) • 3.06 kB
JavaScript
var should = require("should");
var rp = require("../");
var checkRefs = require("./checkRefs");
describe("variable", function() {
it("should be able to get and set primitive values", checkRefs(function() {
var x = rp.variable("test");
x().should.be.eql("test");
x.set(123);
x().should.be.eql(123);
x.set(f);
x().should.be.eql(f);
x.isWritable().should.be.eql(true);
function f() {}
}));
it("should be able to get object and arrays", checkRefs(function() {
var O1 = {a: 1}, O2 = {b: 1};
var A1 = [1, 2, 3], A2 = [];
var x = rp.variable("test");
x.set(O1);
x().should.be.eql(O1);
x.set(O2);
x().should.be.eql(O2);
x.set(A1);
x().should.be.eql(A1);
x.set(A2);
x().should.be.eql(A2);
x.set("test");
x().should.be.eql("test");
}));
it("should fire correct events", checkRefs(function() {
var x = rp.variable(1);
var events = [];
x.onChanged(function() {
events.push("changed");
});
x.onUpdated(function(n, o) {
events.push(["updated", n, o]);
});
x.onAdded(function(idx, i) {
events.push(["added", idx, i]);
});
x.onRemoved(function(idx, i) {
events.push(["removed", idx, i]);
});
x.set(2);
events.shift().should.be.eql(["updated", 2, 1]);
events.shift().should.be.eql("changed");
rp.atomic(function() {
x.set([3, 2, 1]);
x.set([1, 2, 3]);
});
events.shift().should.be.eql(["updated", [1,2,3], 2]);
events.shift().should.be.eql("changed");
x.push(4);
events.shift().should.be.eql(["added", 3, 4]);
events.shift().should.be.eql("changed");
x.shift();
events.shift().should.be.eql(["removed", 0, 1]);
events.shift().should.be.eql("changed");
}));
it("should fire correct array events", checkRefs(function() {
var x = rp.variable([1,2,3]);
var events = [];
x.onChanged(function() {
events.push("changed");
});
x.onUpdated(function(n, o) {
events.push(["updated", n.slice(), o.slice()]);
});
x.onAdded(function(idx, i) {
events.push(["added", idx, i]);
});
x.onRemoved(function(idx, i) {
events.push(["removed", idx, i]);
});
x.push(4);
events.shift().should.be.eql(["added", 3, 4]);
events.shift().should.be.eql("changed");
x.pop();
events.shift().should.be.eql(["removed", 3, 4]);
events.shift().should.be.eql("changed");
rp.atomic(function() {
x.set([0, 1, 2]);
x.shift();
x.push(4);
});
events.shift().should.be.eql(["updated", [1, 2, 4], [1, 2, 3]]);
events.shift().should.be.eql("changed");
rp.atomic(function() {
x.unshift(0);
x.unshift(-1);
x.pop();
x.push(3);
x.push(4);
// value should not change inside a atomic block
x().should.be.eql([1, 2, 4]);
});
events.shift().should.be.eql(["removed", 2, 4]);
events.shift().should.be.eql(["added", 0, -1]);
events.shift().should.be.eql(["added", 1, 0]);
events.shift().should.be.eql(["added", 4, 3]);
events.shift().should.be.eql(["added", 5, 4]);
events.shift().should.be.eql("changed");
}));
});