Added in Ben Alman's proposed event.namespace property (the property holds the namesp...
[jquery.git] / test / unit / event.js
index 7d66c9c..786a46e 100644 (file)
@@ -11,6 +11,17 @@ test("bind(), with data", function() {
        ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
 });
 
+test("click(), with data", function() {
+       expect(3);
+       var handler = function(event) {
+               ok( event.data, "bind() with data, check passed data exists" );
+               equals( event.data.foo, "bar", "bind() with data, Check value of passed data" );
+       };
+       jQuery("#firstp").click({foo: "bar"}, handler).click().unbind("click", handler);
+
+       ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
+});
+
 test("bind(), with data, trigger with data", function() {
        expect(4);
        var handler = function(event, data) {
@@ -373,6 +384,54 @@ test("bind(), with different this object", function() {
        ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using different this object and data." );
 });
 
+test("bind(name, false), unbind(name, false)", function() {
+       expect(3);
+
+       var main = 0;
+       jQuery("#main").bind("click", function(e){ main++; });
+       jQuery("#ap").trigger("click");
+       equals( main, 1, "Verify that the trigger happened correctly." );
+
+       main = 0;
+       jQuery("#ap").bind("click", false);
+       jQuery("#ap").trigger("click");
+       equals( main, 0, "Verify that no bubble happened." );
+
+       main = 0;
+       jQuery("#ap").unbind("click", false);
+       jQuery("#ap").trigger("click");
+       equals( main, 1, "Verify that the trigger happened correctly." );
+});
+
+test("bind()/trigger()/unbind() on plain object", function() {
+       expect( 2 );
+
+       var obj = {};
+
+       // Make sure it doesn't complain when no events are found
+       jQuery(obj).trigger("test");
+
+       // Make sure it doesn't complain when no events are found
+       jQuery(obj).unbind("test");
+
+       jQuery(obj).bind("test", function(){
+               ok( true, "Custom event run." );
+       });
+
+       ok( jQuery(obj).data("events"), "Object has events bound." );
+
+       // Should trigger 1
+       jQuery(obj).trigger("test");
+
+       jQuery(obj).unbind("test");
+
+       // Should trigger 0
+       jQuery(obj).trigger("test");
+
+       // Make sure it doesn't complain when no events are found
+       jQuery(obj).unbind("test");
+});
+
 test("unbind(type)", function() {
        expect( 0 );
        
@@ -799,7 +858,7 @@ test(".live()/.die()", function() {
        submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendivchild").trigger("click");
        equals( submit, 0, "Click on inner div" );
-       equals( div, 1, "Click on inner div" );
+       equals( div, 2, "Click on inner div" );
        equals( livea, 1, "Click on inner div" );
        equals( liveb, 1, "Click on inner div" );
 
@@ -815,7 +874,7 @@ test(".live()/.die()", function() {
        submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendivchild").trigger("click");
        equals( submit, 0, "die Click on inner div" );
-       equals( div, 1, "die Click on inner div" );
+       equals( div, 2, "die Click on inner div" );
        equals( livea, 1, "die Click on inner div" );
        equals( liveb, 1, "die Click on inner div" );
 
@@ -824,7 +883,7 @@ test(".live()/.die()", function() {
        jQuery("div#nothiddendivchild").die("click");
        jQuery("div#nothiddendivchild").trigger("click");
        equals( submit, 0, "die Click on inner div" );
-       equals( div, 1, "die Click on inner div" );
+       equals( div, 2, "die Click on inner div" );
        equals( livea, 1, "die Click on inner div" );
        equals( liveb, 0, "die Click on inner div" );
 
@@ -842,7 +901,7 @@ test(".live()/.die()", function() {
        jQuery("div#nothiddendivchild").trigger("click");
        equals( submit, 0, "stopPropagation Click on inner div" );
        equals( div, 1, "stopPropagation Click on inner div" );
-       equals( livea, 1, "stopPropagation Click on inner div" );
+       equals( livea, 0, "stopPropagation Click on inner div" );
        equals( liveb, 1, "stopPropagation Click on inner div" );
 
        // Make sure click events only fire with primary click
@@ -1076,41 +1135,55 @@ test("live with multiple events", function(){
 });
 
 test("live with namespaces", function(){
-       expect(6);
+       expect(12);
 
        var count1 = 0, count2 = 0;
 
-       jQuery("#liveSpan1").live("foo.bar", function(){
+       jQuery("#liveSpan1").live("foo.bar", function(e){
                count1++;
        });
 
-       jQuery("#liveSpan2").live("foo.zed", function(){
+       jQuery("#liveSpan1").live("foo.zed", function(e){
                count2++;
        });
 
        jQuery("#liveSpan1").trigger("foo.bar");
        equals( count1, 1, "Got live foo.bar" );
+       equals( count2, 0, "Got live foo.bar" );
 
-       jQuery("#liveSpan2").trigger("foo.zed");
+       count1 = 0, count2 = 0;
+
+       jQuery("#liveSpan1").trigger("foo.zed");
+       equals( count1, 0, "Got live foo.zed" );
        equals( count2, 1, "Got live foo.zed" );
 
        //remove one
-       jQuery("#liveSpan2").die("foo.zed");
+       count1 = 0, count2 = 0;
+
+       jQuery("#liveSpan1").die("foo.zed");
        jQuery("#liveSpan1").trigger("foo.bar");
 
-       equals( count1, 2, "Got live foo.bar after dieing foo.zed" );
+       equals( count1, 1, "Got live foo.bar after dieing foo.zed" );
+       equals( count2, 0, "Got live foo.bar after dieing foo.zed" );
 
-       jQuery("#liveSpan2").trigger("foo.zed");
-       equals( count2, 1, "Got live foo.zed" );
+       count1 = 0, count2 = 0;
+
+       jQuery("#liveSpan1").trigger("foo.zed");
+       equals( count1, 0, "Got live foo.zed" );
+       equals( count2, 0, "Got live foo.zed" );
 
        //remove the other
        jQuery("#liveSpan1").die("foo.bar");
 
+       count1 = 0, count2 = 0;
+
        jQuery("#liveSpan1").trigger("foo.bar");
-       equals( count1, 2, "Did not respond to foo.bar after dieing it" );
+       equals( count1, 0, "Did not respond to foo.bar after dieing it" );
+       equals( count2, 0, "Did not respond to foo.bar after dieing it" );
 
-       jQuery("#liveSpan2").trigger("foo.zed");
-       equals( count2, 1, "Did not trigger foo.zed again" );
+       jQuery("#liveSpan1").trigger("foo.zed");
+       equals( count1, 0, "Did not trigger foo.zed again" );
+       equals( count2, 0, "Did not trigger foo.zed again" );
 });
 
 test("live with change", function(){
@@ -1252,6 +1325,7 @@ test(".delegate()/.undelegate()", function() {
        equals( liveb, 0, "Click on body" );
 
        // This should trigger two events
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendiv").trigger("click");
        equals( submit, 0, "Click on div" );
        equals( div, 1, "Click on div" );
@@ -1259,55 +1333,62 @@ test(".delegate()/.undelegate()", function() {
        equals( liveb, 0, "Click on div" );
 
        // This should trigger three events (w/ bubbling)
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendivchild").trigger("click");
        equals( submit, 0, "Click on inner div" );
        equals( div, 2, "Click on inner div" );
-       equals( livea, 2, "Click on inner div" );
+       equals( livea, 1, "Click on inner div" );
        equals( liveb, 1, "Click on inner div" );
 
        // This should trigger one submit
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendivchild").trigger("submit");
        equals( submit, 1, "Submit on div" );
-       equals( div, 2, "Submit on div" );
-       equals( livea, 2, "Submit on div" );
-       equals( liveb, 1, "Submit on div" );
+       equals( div, 0, "Submit on div" );
+       equals( livea, 0, "Submit on div" );
+       equals( liveb, 0, "Submit on div" );
 
        // Make sure no other events were removed in the process
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendivchild").trigger("click");
-       equals( submit, 1, "undelegate Click on inner div" );
-       equals( div, 3, "undelegate Click on inner div" );
-       equals( livea, 3, "undelegate Click on inner div" );
-       equals( liveb, 2, "undelegate Click on inner div" );
+       equals( submit, 0, "undelegate Click on inner div" );
+       equals( div, 2, "undelegate Click on inner div" );
+       equals( livea, 1, "undelegate Click on inner div" );
+       equals( liveb, 1, "undelegate Click on inner div" );
 
        // Now make sure that the removal works
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("#body").undelegate("div#nothiddendivchild", "click");
        jQuery("div#nothiddendivchild").trigger("click");
-       equals( submit, 1, "undelegate Click on inner div" );
-       equals( div, 4, "undelegate Click on inner div" );
-       equals( livea, 4, "undelegate Click on inner div" );
-       equals( liveb, 2, "undelegate Click on inner div" );
+       equals( submit, 0, "undelegate Click on inner div" );
+       equals( div, 2, "undelegate Click on inner div" );
+       equals( livea, 1, "undelegate Click on inner div" );
+       equals( liveb, 0, "undelegate Click on inner div" );
 
        // Make sure that the click wasn't removed too early
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("div#nothiddendiv").trigger("click");
-       equals( submit, 1, "undelegate Click on inner div" );
-       equals( div, 5, "undelegate Click on inner div" );
-       equals( livea, 5, "undelegate Click on inner div" );
-       equals( liveb, 2, "undelegate Click on inner div" );
+       equals( submit, 0, "undelegate Click on inner div" );
+       equals( div, 1, "undelegate Click on inner div" );
+       equals( livea, 1, "undelegate Click on inner div" );
+       equals( liveb, 0, "undelegate Click on inner div" );
 
        // Make sure that stopPropgation doesn't stop live events
+       submit = 0, div = 0, livea = 0, liveb = 0;
        jQuery("#body").delegate("div#nothiddendivchild", "click", function(e){ liveb++; e.stopPropagation(); });
        jQuery("div#nothiddendivchild").trigger("click");
-       equals( submit, 1, "stopPropagation Click on inner div" );
-       equals( div, 6, "stopPropagation Click on inner div" );
-       equals( livea, 6, "stopPropagation Click on inner div" );
-       equals( liveb, 3, "stopPropagation Click on inner div" );
+       equals( submit, 0, "stopPropagation Click on inner div" );
+       equals( div, 1, "stopPropagation Click on inner div" );
+       equals( livea, 0, "stopPropagation Click on inner div" );
+       equals( liveb, 1, "stopPropagation Click on inner div" );
 
        // Make sure click events only fire with primary click
+       submit = 0, div = 0, livea = 0, liveb = 0;
        var event = jQuery.Event("click");
        event.button = 1;
        jQuery("div#nothiddendiv").trigger(event);
 
-       equals( livea, 6, "delegate secondary click" );
+       equals( livea, 0, "delegate secondary click" );
 
        jQuery("#body").undelegate("div#nothiddendivchild", "click");
        jQuery("#body").undelegate("div#nothiddendiv", "click");
@@ -1648,24 +1729,15 @@ test("delegate with submit", function() {
 });
 
 test("Non DOM element events", function() {
-       expect(3);
-
-       jQuery({})
-               .bind('nonelementglobal', function(e) {
-                       ok( true, "Global event on non-DOM annonymos object triggered" );
-               });
+       expect(1);
 
        var o = {};
 
-       jQuery(o)
-               .bind('nonelementobj', function(e) {
-                       ok( true, "Event on non-DOM object triggered" );
-               }).bind('nonelementglobal', function() {
-                       ok( true, "Global event on non-DOM object triggered" );
-               });
+       jQuery(o).bind('nonelementobj', function(e) {
+               ok( true, "Event on non-DOM object triggered" );
+       });
 
        jQuery(o).trigger('nonelementobj');
-       jQuery.event.trigger('nonelementglobal');
 });
 
 /*