var vows = require(“vows”),
load = require("../load"), assert = require("../assert");
var suite = vows.describe(“d3.timer”);
suite.addBatch({
"timer": { topic: load("event/timer").expression("d3.timer").document(), "with no delay": { topic: delay(), "first calls after 17 ms or less": function(info) { assert.inDelta(info.start - info.scheduled, 17, 20); }, "calls until the function returns true": function(info) { assert.equal(info.count, 4); }, "calls every 17 ms": function(info) { assert.inDelta(info.stop - info.start, 17 * 3, 20); } }, "with a specified delay": { topic: delay(250), "first calls after the delay": function(info) { assert.inDelta(info.start - info.scheduled, 250, 20); }, "calls until the function returns true": function(info) { assert.equal(info.count, 4); }, "calls every 17 ms": function(info) { assert.inDelta(info.stop - info.start, 17 * 3, 20); } }, "with multiple registered tasks": { topic: function(timer) { var callback = this.callback, results = []; timer(function() { results.push("A"); return true; }); timer(function() { results.push("B"); return true; }); timer(function() { results.push("C"); return true; }); timer(function() { callback(null, results); return true; }) }, "invokes tasks in the order they were registered": function(results) { assert.deepEqual(results, ["A", "B", "C"]); } } }
});
function delay(delay) {
var args = Array.prototype.slice.call(arguments); return function(timer) { var cb = this.callback, info = {scheduled: Date.now(), count: 0}; args.unshift(function() { var count = ++info.count; if (count === 1) { info.start = Date.now(); } else if (count === 4) { info.stop = Date.now(); cb(null, info); return true; } }); timer.apply(this, args); };
}
suite.export(module);