Running… see browser console for results
').appendTo('body'); t.assert(window.someGlobalVariable); window.someGlobalVariable = false; $('<' + 'script>this.someGlobalVariable = true;').appendTo('body'); t.assert(window.someGlobalVariable); } finally { delete window.someGlobalVariable; } }, testHtmlEval: function (t) { try { window.someGlobalVariable = false; $('').appendTo('body') .html('<' + 'script>window.someGlobalVariable = true;'); t.assert(window.someGlobalVariable); } finally { delete window.someGlobalVariable; } }, testAppendTemplateNonEval: function (t) { try { window.someGlobalVariable = true; $('<' + 'script type="text/template">window.someGlobalVariable = false;').appendTo('body'); t.assert(window.someGlobalVariable); window.someGlobalVariable = true; $('<' + 'script type="text/template">this.someGlobalVariable = false;').appendTo('body'); t.assert(window.someGlobalVariable); } finally { delete window.someGlobalVariable; } }, testHtmlTemplateNonEval: function (t) { try { window.someGlobalVariable = true; $('').appendTo('body') .html('<' + 'script type="text/template">window.someGlobalVariable = false;'); t.assert(window.someGlobalVariable); } finally { delete window.someGlobalVariable; } }, testRemove: function (t) { var newElement1 = $(''); newElement1 .appendTo('body') .remove(); t.assertEqual( $('#some_new_element_1').length, 0 ); // var newElement2 = $(''), errorRaised = false; newElement2.appendTo('body'); $('#some_new_element_2').remove(); try { newElement2.remove(); } catch (e) { errorRaised = true; }; t.assert(!errorRaised); }, testAddRemoveClass: function(t){ var el = $('#some_element').get(0); $('#some_element').addClass('green'); t.assertEqual('green', el.className); $('#some_element').addClass('green'); t.assertEqual('green', el.className); $('#some_element').addClass('red'); t.assertEqual('green red', el.className); $('#some_element').addClass('blue red'); t.assertEqual('green red blue', el.className); $('#some_element').removeClass('green blue'); t.assertEqual('red', el.className); $('#some_element').attr('class', ' red green blue '); t.assertEqual(' red green blue ', el.className); // sanity check that WebKit doesn't change original input $('#some_element').removeClass('green'); t.assertEqual('red blue', el.className); //addClass with function argument $('#some_element').addClass(function(idx,classes){ //test the value of "this" t.assertEqualCollection($('#some_element'), $(this)); //test original classes are being passed t.assertEqual('red blue', this.className); return "green"; }); t.assertEqual('red blue green', el.className); //removeClass with function argument $('#some_element').removeClass(function(idx,classes){ //test the value of "this" t.assertEqualCollection($('#some_element'), $(this)); //test original classes are being passed t.assertEqual('red blue green', this.className); return "blue"; }); t.assertEqual('red green', el.className); $('#some_element').removeClass(); t.assertEqual('', el.className); }, testHasClass: function(t){ var el = $('#some_element').get(0); $('#some_element').addClass('green'); t.assert($('#some_element').hasClass('green')); t.assert(!$('#some_element').hasClass('orange')); $('#some_element').addClass('orange'); t.assert($('#some_element').hasClass('green')); t.assert($('#some_element').hasClass('orange')); }, testHasClassEmpty: function(t){ var z = $('#doesnotexist'); t.assertEqual(0, z.size()); t.assertFalse(z.hasClass('a')); }, testToggleClass: function(t){ var el = $('#toggle_element').get(0); $('#toggle_element').toggleClass('green'); t.assert($('#toggle_element').hasClass('green')); t.assert(!$('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('orange'); t.assert($('#toggle_element').hasClass('green')); t.assert($('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('green'); t.assert(!$('#toggle_element').hasClass('green')); t.assert($('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('orange'); t.assert(!$('#toggle_element').hasClass('green')); t.assert(!$('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('orange', false); t.assert(!$('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('orange', false); t.assert(!$('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('orange', true); t.assert($('#toggle_element').hasClass('orange')); $('#toggle_element').toggleClass('orange', true); t.assert($('#toggle_element').hasClass('orange')); //function argument $('#toggle_element').toggleClass(function(idx,classes){ //test the value of "this" t.assertEqualCollection($('#toggle_element'), $(this)); //test original classes are being passed t.assertEqual('orange', this.className); return "brown"; }); t.assert($('#toggle_element').hasClass('brown')); $('#toggle_element').toggleClass(function(idx,classes){ return "yellow"; },false); t.assert(!$('#toggle_element').hasClass('yellow')); $('#toggle_element').toggleClass(function(idx,classes){ return "yellow"; },true); t.assert($('#toggle_element').hasClass('yellow')); }, testIndex: function(t){ t.assertEqual($("p > span").index("#nay"), 2); t.assertEqual($("p > span").index(".yay"), 0); t.assertEqual($("span").index("span"), 0); t.assertEqual($("span").index("boo"), -1); t.assertEqual($('#index_test > *').eq(-1).index(), 1); }, testBoolAttr: function (t) { t.assertEqual($('#BooleanInput').attr('required'), true); t.assertEqual($('#BooleanInput').attr('non_existant_attr'), undefined); }, testDocumentReady: function (t) { // Check that if document is already loaded, ready() immediately executes callback var arg1, arg2, fired = false; $(function (Z1) { arg1 = Z1; $(document).ready(function (Z2) { arg2 = Z2; fired = true; }) }); t.assertTrue(fired); t.assertIdentical(Zepto, arg1); t.assertIdentical(Zepto, arg2); }, testSlice: function (t) { var $els = $("#slice_test div"); t.assertEqual($els.slice().length, 3); t.assertEqual(typeof $els.slice().ready, 'function'); t.assertEqual($els.slice(-1)[0].className, 'slice3'); }, testEnd: function (t) { t.assert($().end().length, 0); var $endTest = $('#end_test'); var $endTest2 = $('#end_test').find('div').find('span').end().end(); t.assertEqual($endTest.length, $endTest2.length); t.assertEqual($endTest.get(0), $endTest2.get(0)); }, testAndSelf: function (t) { var testDiv = $('#andself_test'), secondEl = $('.two', testDiv), thirdEl = $('.three', testDiv), nextAndSelf = secondEl.next().andSelf(); t.assert( secondEl.get(0), nextAndSelf.get(0) ); t.assert( thirdEl.get(0), nextAndSelf.get(1) ); } }); Evidence('EventTest', { tearDown: function(){ $('*').unbind(); }, testBind: function(t){ var counter = 0; $(document.body).bind('click', function(){ counter++ }); click($('#some_element').get(0)); t.assertEqual(1, counter); counter = 0; $('#some_element').bind('click mousedown', function(){ counter++ }); click($('#some_element').get(0)); mousedown($('#some_element').get(0)); t.assertEqual(3, counter); // 1 = body click, 2 = element click, 3 = element mousedown }, testBindWithObject: function(t){ var counter = 0, keyCounter = 0, el = $('#some_element'), eventData = { click: function(){ counter++ }, keypress: function(){ keyCounter++ } }; $(document.body).bind(eventData); el.trigger('click'); el.trigger('click'); t.assertEqual(2, counter); el.trigger('keypress'); t.assertEqual(1, keyCounter); $(document.body).unbind({ keypress: eventData.keypress }); el.trigger('click'); t.assertEqual(3, counter); el.trigger('keypress'); t.assertEqual(1, keyCounter); }, testBindContext: function(t){ var context, handler = function(){ context = $(this); }; $('#empty_test').bind("click",handler); $('#empty_test').bind("mousedown",handler); click($('#empty_test').get(0)); t.assertEqualCollection($('#empty_test'), context); context = null; mousedown($('#empty_test').get(0)); t.assertEqualCollection($('#empty_test'), context); }, testBindWithCustomData: function(t) { var counter = 0; var handler = function(ev,customData) { counter = customData.counter }; $('#some_element').bind('custom', handler); $('#some_element').trigger('custom', { counter: 10 }); t.assertEqual(10, counter); }, testBindPreventDefault: function (t) { var link = $(''), prevented = false; link .appendTo('body') .bind('click', function () { return false; }) .bind('click', function (e) { prevented = e.defaultPrevented; }) .trigger('click'); t.assert(prevented); }, testCreateEventObject: function(t){ var e = $.Event('custom'); t.assertEqual('custom', e.type); var e2 = new $.Event('custom'); t.assertEqual('custom', e2.type); var e3 = $.Event('custom', {customKey: 'customValue'}); t.assertEqual('custom', e3.type); t.assertEqual('customValue', e3.customKey); var e4 = $.Event('custom', {bubbles: false}); t.assertFalse(e4.bubbles); }, testTriggerEventObject: function(t){ var counter = 0, customEventKey = 0; var handler = function(ev,customData) { counter = customData.counter; customEventKey = ev.customKey; }; var customEventObject = $.Event('custom', { customKey: 20 }); $('#some_element').bind('custom', handler); $('#some_element').trigger(customEventObject, { counter: 10 }); t.assertEqual(10, counter); t.assertEqual(20, customEventKey); }, testTriggerEventCancelled: function(t){ $('#some_element').bind('custom', function(e){ e.preventDefault(); }); var event = $.Event('custom'); t.assert(!event.defaultPrevented); $('#some_element').trigger(event); t.assert(event.defaultPrevented); }, testTriggerHandler: function(t){ t.assertUndefined($('doesnotexist').triggerHandler('submit')); var form = $('#trigger_handler form').get(0); $('#trigger_handler').bind('submit', function(e) { t.fail("triggerHandler shouldn't bubble"); }); var executed = []; $(form).bind('submit', function(e) { executed.push("1"); t.assertEqual(form, e.target); return 1; }); $(form).bind('submit', function(e) { executed.push("2"); t.assertEqual(form, e.target); e.stopImmediatePropagation(); return 2; }); $(form).bind('submit', function(e) { t.fail("triggerHandler shouldn't continue after stopImmediatePropagation"); }); t.assertIdentical(2, $(form).triggerHandler('submit')); t.assertEqual('1 2', executed.join(' ')); }, testUnbind: function(t){ var counter = 0, el = $('#another_element').get(0); var handler = function(){ counter++ }; $('#another_element').bind('click mousedown', handler); click(el); mousedown(el); t.assertEqual(2, counter); $('#another_element').unbind('click', handler); click(el); t.assertEqual(2, counter); mousedown(el); t.assertEqual(3, counter); $('#another_element').unbind('mousedown'); mousedown(el); t.assertEqual(3, counter); $('#another_element').bind('click mousedown', handler); click(el); mousedown(el); t.assertEqual(5, counter); $('#another_element').unbind(); click(el); mousedown(el); t.assertEqual(5, counter); }, testUnbindWithNamespace: function(t){ var count = 0; $("#namespace_test").bind("click.bar", function() { count++ }); $("#namespace_test").bind("click.foo", function() { count++ }); $("#namespace_test").bind("mousedown.foo.bar", function() { count++ }); $("#namespace_test").trigger("click"); t.assertEqual(2, count); $("#namespace_test").unbind("click.baz"); $("#namespace_test").trigger("click"); t.assertEqual(4, count); $("#namespace_test").unbind("click.foo"); $("#namespace_test").trigger("click"); t.assertEqual(5, count); $("#namespace_test").trigger("mousedown"); t.assertEqual(6, count); $("#namespace_test").unbind(".bar"); $("#namespace_test").trigger("click").trigger("mousedown"); t.assertEqual(6, count); }, testDelegate: function(t){ var counter = 0, pcounter = 0; $(document.body).delegate('#some_element', 'click', function(){ counter++ }); $('p').delegate('span.yay', 'click', function(){ counter++ }); $(document.body).delegate('p', 'click', function(){ pcounter++ }); click($('#some_element').get(0)); t.assertEqual(1, counter); click($('span.yay').get(0)); t.assertEqual(2, counter); click($('span.nay').get(0)); t.assertEqual(2, counter); click($('p').get(0)); t.assertEqual(3, pcounter); }, testDelegateReturnFalse: function(t){ $(document.body).delegate('#some_element', 'click', function(){ return false }); var event = $.Event('click'); $('#some_element').trigger(event); t.assertTrue(event.defaultPrevented); }, testDelegateWithObject: function(t){ var counter = 0, received, el = $('p').first(), eventData = { click: function(){ counter++ }, custom: function(e, data){ received = data } }; $(document.body).delegate('p', eventData); el.trigger('click'); t.assertEqual(1, counter); el.trigger('click'); t.assertEqual(2, counter); el.trigger('custom', 'boo'); t.assertEqual('boo', received); $(document.body).undelegate('p', {custom: eventData.custom}); el.trigger('click'); t.assertEqual(3, counter); el.trigger('custom', 'bam'); t.assertEqual('boo', received); }, testDelegateWithCustomData: function(t) { var received; $(document).delegate('#some_element', 'custom', function(e, data, more){ received = data + more }); $('p').delegate('span.yay', 'custom', function(e, data){ received = data }); $(document).delegate('p', 'custom', function(e, data){ received = data }); $('#some_element').trigger('custom', 'one'); t.assertEqual('oneundefined', received); $('#some_element').trigger('custom', ['one', 'two']); t.assertEqual('onetwo', received); $('span.yay').trigger('custom', 'boom'); t.assertEqual('boom', received); $('span.yay').trigger('custom', ['bam', 'boom']); t.assertEqual('bam', received); $('span.nay').trigger('custom', 'noes'); t.assertEqual('noes', received); $('p').first().trigger('custom', 'para'); t.assertEqual('para', received); }, testDelegateEventProxy: function(t){ var content; $('div#delegate_test').delegate('span.second-level', 'click', function(e){ t.assertEqual($('span.second-level').get(0), this); t.assertEqual($('span.second-level').get(0), e.currentTarget); t.refuteEqual($('span.second-level').get(0), e.originalEvent.currentTarget); t.assertEqual($('div#delegate_test').get(0), e.liveFired); content = $(this).html(); }); click($('span.second-level').get(0)); t.assertEqual('hi', content); var fired = false; if (window.location.hash.length) window.location.hash = ''; $('div#delegate_test').html(''); $('div#delegate_test').delegate('a', 'click', function(e){ e.preventDefault(); fired = true; }); click($('div#delegate_test a').get(0)); t.assert(fired); t.refuteEqual('#foo', window.location.hash); fired = false; if (window.location.hash.length) window.location.hash = ''; $('div#delegate_test').html(''); $('div#delegate_test a').trigger('click'); t.assert(fired); t.refuteEqual('#bar', window.location.hash); }, testUndelegate: function(t){ var count = 0, handler = function() { count++ }; $("#undelegate_test").bind("click mousedown", handler); $("#undelegate_test").delegate("span.first-level", "click mousedown", handler); $("#undelegate_test").delegate("span.second-level", "click mousedown", handler); $("#undelegate_test span.second-level").trigger("click"); t.assertEqual(3, count); $("#undelegate_test").undelegate("span.second-level", "click", handler); $("#undelegate_test span.second-level").trigger("click"); t.assertEqual(5, count); $("#undelegate_test").undelegate("span.first-level"); $("#undelegate_test span.second-level").trigger("click"); t.assertEqual(6, count); $("#undelegate_test").unbind("click"); $("#undelegate_test span.second-level").trigger("click"); t.assertEqual(6, count); $("#undelegate_test span.second-level").trigger("mousedown"); t.assertEqual(8, count); $("#undelegate_test").undelegate(); $("#undelegate_test span.second-level").trigger("mousedown"); t.assertEqual(8, count); }, testLive: function(t){ var counter = 0; $('p.live').live('click', function(){ counter++ }); $(document.body).append(''); $(document.body).append(''); click($('#live_1').get(0)); click($('#live_2').get(0)); $('p.live').remove(); $(document.body).append(''); $('p.live').live('click', function(){ t.assertEqual(document.getElementById('live_this_test'), this); }); click($('#live_this_test').get(0)); t.assertEqual(3, counter); }, testDie: function(t){ var count = 0, handler = function() { count++ }; $("#another_element").live("click mousedown", handler); $("#another_element").trigger("click"); t.assertEqual(1, count); $("#another_element").die("click", handler); $("#another_element").trigger("click"); t.assertEqual(1, count); $("#another_element").trigger("mousedown"); t.assertEqual(2, count); $("#another_element").die(); $("#another_element").trigger("mousedown"); t.assertEqual(2, count); }, testOn: function(t){ var el = $('#some_element'), node = el.get(0), ret, bindTriggered = 0, delegateTriggered = 0; ret = el.on('click', function(e){ bindTriggered++; t.assertIdentical(node, this); }) .on({ click: function(){bindTriggered++} }); t.assertIdentical(el, ret); ret = $(document.body).on('click', 'div', function(e){ delegateTriggered++; t.assertIdentical(node, this); }) .on({ click: function(){delegateTriggered++} }, '*[id^=some]'); t.assertIdentical(document.body, ret.get(0)); click(node); t.assertEqual(2, bindTriggered, "bind handlers"); t.assertEqual(2, delegateTriggered, "delegate handlers"); }, testOff: function(t){ var el = $('#some_element'), bindTriggered = 0, delegateTriggered = 0, handler = function(){ bindTriggered++ }; el.bind('click', handler).bind('click', function(){ bindTriggered++ }); el.live('click', function(){ delegateTriggered++ }); click(el.get(0)); t.assertEqual(2, bindTriggered, "bind handlers before unbind"); t.assertEqual(1, delegateTriggered, "delegate handlers before unbind"); el.off('click', handler); $(document.body).off('click', '#some_element'); click(el.get(0)); t.assertEqual(3, bindTriggered, "bind handlers"); t.assertEqual(1, delegateTriggered, "delegate handlers"); }, testOne: function(t){ var counter = 0, context, received, el = $('#some_element'); $(document.body).one('click', function(e, data, more){ context = this; counter++; received = data + more; t.assertIn('preventDefault', e); return false; }); var evt = $.Event('click'); el.trigger(evt, ['one', 'two']); t.assertEqual(1, counter); t.assertEqual('onetwo', received); t.assertIdentical(document.body, context); t.assertTrue(evt.defaultPrevented); el.trigger('click'); t.assertEqual(1, counter, "the event handler didn't unbind itself"); }, testOneWithObject: function(t){ var counter = 0, el = $('#some_element'); $(document.body).one({ click: function() { counter++ }, custom: function() { counter-- } }); el.trigger('click'); t.assertEqual(1, counter); el.trigger('click'); t.assertEqual(1, counter); el.trigger('custom'); t.assertEqual(0, counter); el.trigger('custom'); t.assertEqual(0, counter); }, testDOMEventWrappers: function(t){ var events = ('blur focus focusin focusout load resize scroll unload click dblclick '+ 'mousedown mouseup mousemove mouseover mouseout '+ 'change select keydown keypress keyup error').split(' '); var el = $('#another_element'), count = 0; events.forEach(function(event){ t.assertTrue($.isFunction(el[event]), 'event type: ' + event); }); el.click(function(){ count++ }); click(el.get(0)); t.assertEqual(1, count); }, testCustomEvents: function (t) { var el = $(document.body); el.bind('custom', function(evt, a, b) { t.assertEqual(a, 1); t.assertEqual(b, 2); el.unbind(); }) el.trigger('custom', [1, 2]); el.bind('custom', function(evt, a) { t.assertEqual(a, 1); el.unbind(); }) el.trigger('custom', 1); var eventData = {z: 1}; el.bind('custom', function(evt, a) { t.assertEqual(a, eventData); el.unbind(); }) el.trigger('custom', eventData); }, testSpecialEvent: function (t) { var clickEvent = $.Event('click'), mouseDownEvent = $.Event('mousedown'), mouseUpEvent = $.Event('mouseup'), mouseMoveEvent = $.Event('mousemove'), submitEvent = $.Event('submit'); t.assertEqual(MouseEvent, clickEvent.constructor); t.assertEqual(MouseEvent, mouseDownEvent.constructor); t.assertEqual(MouseEvent, mouseUpEvent.constructor); t.assertEqual(MouseEvent, mouseMoveEvent.constructor); t.assertEqual(Event, submitEvent.constructor); } }); })();