UNPKG

can

Version:

MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.

130 lines (124 loc) 3.63 kB
steal('can/util', 'can/control/modifier', 'can/util/event.js', 'steal-qunit', function (can) { module('can/control/modifier'); test('nested selectors', function () { var paw, tail; var controllerClass = can.Control({ '.cat .paw click': function () { paw++; }, '.cat .tail click': function () { tail++; } }); can.$('#qunit-fixture')[0].innerHTML = '<div class=\'cat\'><div class=\'paw\'></div><div class=\'tail\'></div></div>'; new controllerClass(can.$('#qunit-fixture')); paw = 0; tail = 0; can.trigger(can.$('.tail'), 'click'); equal(tail, 1); equal(paw, 0); }); test('pluginName', function () { stop(); var controllerClass = can.Control({ defaults: { binder: undefined } }, { ' click:debounce(30)': function () { ok(this instanceof can.Control, 'Debounced function has the correct context.'); fooToTheBar = true; run++; }, 'bar:debounce(30)': function () { run2++; }, '{binder} click:debounce(50)': function () { run2++; }, 'span click:debounce(50)': function () { run3++; } }); can.$('#qunit-fixture')[0].innerHTML = '<div id="foo"><span>Test</span></div><div id="bar"></div>'; /**/ var controller1 = new controllerClass('#foo', { binder: can.$(document.body) }), run = 0, run2 = 0, run3 = 0, fooToTheBar; new controllerClass('#bar', { binder: can.$(document.body) }); // Do a bunch of clicks! can.trigger(can.$('#foo'), 'click'); can.trigger(can.$('#foo span'), 'click'); can.trigger(can.$('#bar'), 'click'); can.trigger(can.$('#foo'), 'click'); can.trigger(can.$('#bar'), 'click'); can.trigger(can.$('#foo'), 'click'); can.trigger(can.$('#bar'), 'click'); // Make sure foo is still undefined (should be > 30ms before its defined) ok(!fooToTheBar, '`fooToTheBar` is undefined.'); ok('bar' in controller1, 'Method name gets aliased correctly'); controller1.bar(); controller1.bar(); controller1.bar(); controller1.bar(); // Check if setTimeout(function () { ok(fooToTheBar, '`fooToTheBar` is true.'); equal(run, 2, '`run` is 2'); equal(run2, 1, '`run2` is 1'); // Do a bunch more clicks! can.trigger(can.$('#foo'), 'click'); can.trigger(can.$('#bar'), 'click'); can.trigger(can.$('#foo'), 'click'); can.trigger(can.$('#bar'), 'click'); can.trigger(can.$('#foo'), 'click'); can.trigger(can.$('#bar'), 'click'); can.trigger(can.$(document.body), 'click'); setTimeout(function () { equal(run3, 1, '`run3` is 1'); equal(run, 4, '`run` is 4'); can.remove(can.$('#foo')); start(); }, 40); }, 40); }); test('Modifiers should work with objects that don\'t implement delegate (#754)', function() { stop(); var some_event_fired = false, some_event_debounce_fired = false; // Create event-dispatching class var some_object = { bind: can.bind, unbind: can.unbind, dispatch: can.dispatch }; // Create control listening for object events var SomeControl = can.Control({ setObject: function(object) { this.options.object = object; this.on(); }, "{object} some_event": function() { some_event_fired = true; }, "{object} some_event:debounce(50)": function() { some_event_debounce_fired = true; } }); var some_control = new SomeControl(document.body); some_control.setObject(some_object); // Fire the event some_object.dispatch("some_event"); equal(some_event_fired, true, "Basic event handler fired"); setTimeout(function() { equal(some_event_debounce_fired, true, "Debounced event handler fired"); start(); }, 250); }); });