var tape = require("tape"); var on = require("../../lib/events/on"); var off = require("../../lib/events/off"); var trigger = require("../../lib/events/trigger"); var el = document.createElement("div"); var el2 = document.createElement("span"); var els = [el, el2]; var classCb = function() { this.className += "on"; }; var attrCb = function() { this.setAttribute("data-state", this.getAttribute("data-state") + "ON"); }; tape("test events on/off/trigger for one element, one event", function(t) { el.className = ""; on(el, "click", classCb); trigger(el, "click"); t.equal(el.className, "on", "attached callback has been fired properly"); el.className = "off"; off(el, "click", classCb); trigger(el, "click"); t.equal(el.className, "off", "triggered event didn't fire detached callback"); t.end(); }); tape("test events on/off/trigger for multiple elements, one event", function( t ) { el.className = ""; el2.className = ""; on(els, "click", classCb); trigger(els, "click"); t.equal( el.className, "on", "attached callback has been fired properly on the first element" ); t.equal( el2.className, "on", "attached callback has been fired properly on the second element" ); el.className = "off"; el2.className = "off"; off(els, "click", classCb); trigger(els, "click"); t.equal( el.className, "off", "triggered event didn't fire detached callback on the first element" ); t.equal( el2.className, "off", "triggered event didn't fire detached callback on the second element" ); t.end(); }); tape("test events on/off/trigger for one element, multiple events", function( t ) { el.className = ""; on(el, "click mouseover", classCb); trigger(el, "click mouseover"); t.equal(el.className, "onon", "attached callbacks have been fired properly"); el.className = "off"; off(el, "click mouseover", classCb); trigger(el, "click mouseover"); t.equal( el.className, "off", "triggered events didn't fire detached callback" ); t.end(); }); tape( "test events on/off/trigger for multiple elements, multiple events", function(t) { el.className = ""; el2.className = ""; el.setAttribute("data-state", ""); el2.setAttribute("data-state", ""); on(els, "click mouseover", classCb); on(els, "resize scroll", attrCb); trigger(els, "click mouseover resize scroll"); t.equal( el.className, "onon", "attached callbacks has been fired properly on the first element" ); t.equal( el.getAttribute("data-state"), "ONON", "attached callbacks has been fired properly on the first element" ); t.equal( el2.className, "onon", "attached callbacks has been fired properly on the second element" ); t.equal( el2.getAttribute("data-state"), "ONON", "attached callbacks has been fired properly on the second element" ); el.className = "off"; el2.className = "off"; el.setAttribute("data-state", "off"); el2.setAttribute("data-state", "off"); off(els, "click mouseover", classCb); off(els, "resize scroll", attrCb); trigger(els, "click mouseover resize scroll"); t.equal( el.className, "off", "triggered events didn't fire detached callbacks on the first element" ); t.equal( el.getAttribute("data-state"), "off", "triggered events didn't fire detached callbacks on the first element" ); t.equal( el2.className, "off", "triggered events didn't fire detached callbacks on the first element" ); t.equal( el2.getAttribute("data-state"), "off", "triggered events didn't fire detached callbacks on the first element" ); t.end(); } ); tape("test events on top level elements", function(t) { var el = document; el.className = ""; on(el, "click", classCb); trigger(el, "click"); t.equal( el.className, "on", "attached callback has been fired properly on document" ); el = window; el.className = ""; // With jsdom, the default this is global, not window, so we need to explicitly bind to window. on(el, "click", classCb.bind(window)); trigger(el, "click"); t.equal( el.className, "on", "attached callback has been fired properly on window" ); t.end(); });