73 строки
2.5 KiB
JavaScript
73 строки
2.5 KiB
JavaScript
require("../env");
|
|
|
|
var assert = require("assert");
|
|
|
|
module.exports = {
|
|
topic: function() {
|
|
var cb = this.callback,
|
|
dd = [],
|
|
ii = [],
|
|
tt = [],
|
|
vv = [],
|
|
fails = 0;
|
|
|
|
var s = d3.select("body").html("").append("div").selectAll("div")
|
|
.data(["red", "green"])
|
|
.enter().append("div")
|
|
.style("background-color", function(d) { return d3.rgb(d)+""; });
|
|
|
|
var t = s.transition()
|
|
.styleTween("background-color", function() { ++fails; })
|
|
.styleTween("background-color", tween);
|
|
|
|
function tween(d, i, v) {
|
|
dd.push(d);
|
|
ii.push(i);
|
|
vv.push(v);
|
|
if (tt.push(this) >= 2) cb(null, {
|
|
selection: s,
|
|
transition: t,
|
|
data: dd,
|
|
index: ii,
|
|
value: vv,
|
|
context: tt,
|
|
fails: fails
|
|
});
|
|
return i && d3.interpolateHsl(v, "blue");
|
|
}
|
|
},
|
|
|
|
// The order here is a bit brittle: because the transition has zero delay,
|
|
// it's invoking the start event immediately for all nodes, rather than
|
|
// pushing each node onto the timer queue (which would reverse the order of
|
|
// callbacks). The order in which tweens are invoked is undefined, so perhaps
|
|
// we should sort the expected and actual values before comparing.
|
|
|
|
"defines the corresponding style tween": function(result) {
|
|
assert.typeOf(result.transition.tween("style.background-color"), "function");
|
|
},
|
|
"the last style tween takes precedence": function(result) {
|
|
assert.equal(result.fails, 0);
|
|
},
|
|
"invokes the tween function": function(result) {
|
|
assert.deepEqual(result.data, ["red", "green"], "expected data, got {actual}");
|
|
assert.deepEqual(result.index, [0, 1], "expected data, got {actual}");
|
|
assert.deepEqual(result.value, ["#ff0000", "#008000"], "expected value, got {actual}");
|
|
assert.domEqual(result.context[0], result.selection[0][0], "expected this, got {actual}");
|
|
assert.domEqual(result.context[1], result.selection[0][1], "expected this, got {actual}");
|
|
},
|
|
|
|
"end": {
|
|
topic: function(result) {
|
|
var cb = this.callback;
|
|
result.transition.each("end", function(d, i) { if (i >= 1) cb(null, result); });
|
|
},
|
|
"uses the returned interpolator": function(result) {
|
|
assert.equal(result.selection[0][1].style.getPropertyValue("background-color"), "#0000ff");
|
|
},
|
|
"does nothing if the interpolator is falsey": function(result) {
|
|
assert.equal(result.selection[0][0].style.getPropertyValue("background-color"), "#ff0000");
|
|
}
|
|
}
|
|
};
|