var assert = require("../assert");

module.exports = {
  topic: function(d3) {
    var s = d3.select("body").append("div").selectAll("div")
        .data(["one", "two", "three", "four"])
      .enter().append("div")
        .attr("class", String);

    s.filter(function(d, i) { return i > 0; }).append("span");
    s.filter(function(d, i) { return i > 1; }).append("span");
    s[0][3] = null;

    return s.transition()
        .delay(function(d, i) { return i * 13; })
        .duration(function(d, i) { return i * 21; });
  },

  "selects all matching elements": function(transition) {
    var t = transition.selectAll("span");
    assert.domEqual(t[1][0].parentNode, transition[0][1]);
    assert.domEqual(t[2][0].parentNode, transition[0][2]);
    assert.domEqual(t[2][1].parentNode, transition[0][2]);
  },
  "ignores null elements": function(transition) {
    var t = transition.selectAll("span");
    assert.equal(t.length, 3);
  },
  "propagates delay to the selected elements": function(transition) {
    var t = transition.selectAll("span");
    assert.domEqual(t[1][0].__transition__[t.id].delay, 13);
    assert.domEqual(t[2][0].__transition__[t.id].delay, 26);
    assert.domEqual(t[2][1].__transition__[t.id].delay, 26);
  },
  "propagates duration to the selected elements": function(transition) {
    var t = transition.selectAll("span");
    assert.domEqual(t[1][0].__transition__[t.id].duration, 21);
    assert.domEqual(t[2][0].__transition__[t.id].duration, 42);
    assert.domEqual(t[2][1].__transition__[t.id].duration, 42);
  },
  "returns empty if no match is found": function(transition) {
    var t = transition.selectAll("span");
    assert.isEmpty(t[0]);
  },
  "inherits transition id": function(transition) {
    var id = transition.id,
        t0 = transition.selectAll("span"),
        t1 = transition.selectAll("span");
    assert.equal(t0.id, id);
    assert.equal(t1.id, id);
  },
  "groups are arrays, not instances of NodeList": function(transition) {
    var t = transition.selectAll(function() { return this.getElementsByClassName("span"); });
    assert.isTrue(Array.isArray(t[0]));
  }
};
