| var vows = require("vows"), | |
| load = require("../load"), | |
| assert = require("../assert"); | |
| var suite = vows.describe("selection.on"); | |
| suite.addBatch({ | |
| "select(body)": { | |
| topic: load("selection/on").document(), | |
| "on a simple page": { | |
| topic: function(d3) { | |
| return d3.select("body"); | |
| }, | |
| "registers an event listener for the specified type": function(body) { | |
| var form = body.append("form"), count = 0; | |
| form.on("submit", function() { ++count; }); // jsdom has spotty event support | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(count, 1); | |
| }, | |
| "replaces an existing event listener for the same type": function(body) { | |
| var form = body.append("form"), count = 0, fail = 0; | |
| form.on("submit", function() { ++fail; }); | |
| form.on("submit", function() { ++count; }); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(count, 1); | |
| assert.equal(fail, 0); | |
| }, | |
| "removes an existing event listener": function(body) { | |
| var form = body.append("form"), fail = 0; | |
| form.on("submit", function() { ++fail; }); | |
| form.on("submit", null); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(fail, 0); | |
| assert.isUndefined(form.on("submit")); | |
| }, | |
| /* Regrettably, JSDOM ignores the capture flag, so we can't test this yet… | |
| "removing a listener doesn't require the capture flag": function(body) { | |
| var form = body.append("form"), fail = 0; | |
| form.on("submit", function() { ++fail; }, true); | |
| form.on("submit", null); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(fail, 0); | |
| assert.isUndefined(form.on("submit")); | |
| }, | |
| */ | |
| "ignores removal of non-matching event listener": function(body) { | |
| body.append("form").on("submit", null); | |
| }, | |
| "observes the specified namespace": function(body) { | |
| var form = body.append("form"), foo = 0, bar = 0; | |
| form.on("submit.foo", function() { ++foo; }); | |
| form.on({"submit.bar": function() { ++bar; }}); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(foo, 1); | |
| assert.equal(bar, 1); | |
| }, | |
| "can register listeners as a map": function(body) { | |
| var form = body.append("form"), count = 0, fail = 0; | |
| form.on({submit: function() { ++fail; }}); | |
| form.on({submit: function() { ++count; }}); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(count, 1); | |
| assert.equal(fail, 0); | |
| form.on({submit: null}); | |
| assert.isUndefined(form.on("submit")); | |
| }, | |
| /* Not really sure how to test this one… | |
| "observes the specified capture flag": function(body) { | |
| }, | |
| */ | |
| "passes the current data and index to the event listener": function(body) { | |
| var forms = body.html("").selectAll("form").data(["a", "b"]).enter().append("form"), dd, ii, data = new Object(); | |
| forms.on("submit", function(d, i) { dd = d; ii = i; }); | |
| forms.append("input").attr("type", "submit")[0][1].click(); | |
| assert.equal(dd, "b"); | |
| assert.equal(ii, 1); | |
| forms[0][1].__data__ = data; | |
| forms.append("input").attr("type", "submit")[0][1].click(); | |
| assert.equal(dd, data); | |
| assert.equal(ii, 1); | |
| }, | |
| "uses the current element as the context": function(body) { | |
| var forms = body.html("").selectAll("form").data(["a", "b"]).enter().append("form"), context; | |
| forms.on("submit", function() { context = this; }); | |
| forms.append("input").attr("type", "submit")[0][1].click(); | |
| assert.domEqual(context, forms[0][1]); | |
| }, | |
| "returns the current selection": function(body) { | |
| assert.isTrue(body.on("submit", function() {}) === body); | |
| }, | |
| "returns the assigned listener if called with one argument": function(body) { | |
| body.on("mouseover", f).on("click.foo", f); | |
| function f() {} | |
| assert.equal(body.on("mouseover"), f); | |
| assert.equal(body.on("click.foo"), f); | |
| assert.isUndefined(body.on("click")); | |
| assert.isUndefined(body.on("mouseover.foo")); | |
| }, | |
| "omitting the event type": { | |
| "returns undefined when retrieving a listener": function(body) { | |
| assert.isUndefined(body.on(".foo")); | |
| }, | |
| "null removes all named event listeners": function(body) { | |
| body.on("mouseover.foo", f) | |
| .on("click.foo", f) | |
| .on("click.foobar", f) | |
| .on(".foo", null); | |
| function f() {} | |
| assert.isUndefined(body.on("mouseover.foo")); | |
| assert.isUndefined(body.on("click.foo")); | |
| assert.equal(body.on("click.foobar"), f); | |
| }, | |
| "no-op when setting a listener": function(body) { | |
| assert.isTrue(body.on(".foo", function() {}) === body); | |
| assert.isUndefined(body.on(".foo")); | |
| } | |
| } | |
| }, | |
| "sets the current event as d3.event": function(d3) { | |
| var form = d3.select("body").append("form"), event; | |
| form.on("submit", function() { event = d3.event; }); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(event.type, "submit"); | |
| assert.domEqual(event.target, form[0][0]); | |
| }, | |
| "restores the original event after notifying listeners": function(d3) { | |
| var form = d3.select("body").append("form"), event = d3.event = new Object(); | |
| form.on("submit", function() {}); | |
| form.append("input").attr("type", "submit").node().click(); | |
| assert.equal(d3.event, event); | |
| } | |
| } | |
| }); | |
| suite.export(module); |