]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojo/tests/_base/connect.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojo / tests / _base / connect.js
diff --git a/static/dojo-release-1.1.1/dojo/tests/_base/connect.js b/static/dojo-release-1.1.1/dojo/tests/_base/connect.js
new file mode 100644 (file)
index 0000000..3761861
--- /dev/null
@@ -0,0 +1,225 @@
+if(!dojo._hasResource["tests._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["tests._base.connect"] = true;
+dojo.provide("tests._base.connect");
+
+hub = function(){
+}
+
+failures = 0;
+bad = function(){
+       failures++;
+}
+
+good = function(){
+}
+
+// make 'iterations' connections to hub
+// roughly half of which will be to 'good' and 
+// half to 'bad'
+// all connections to 'bad' are disconnected
+// test can then be performed on the values
+// 'failures' and 'successes'
+markAndSweepTest = function(iterations){
+       var marked = [];
+       // connections
+       for(var i=0; i<iterations; i++){
+               if(Math.random() < 0.5){
+                       marked.push(dojo.connect('hub', bad));
+               }else{
+                       dojo.connect('hub', good);
+               }
+       }
+       // Randomize markers (only if the count isn't very high)
+       if(i < Math.pow(10, 4)){
+               var rm = [ ];
+               while(marked.length){
+                       var m = Math.floor(Math.random() * marked.length);
+                       rm.push(marked[m]);
+                       marked.splice(m, 1);
+               }
+               marked = rm;                            
+       } 
+       for(var m=0; m<marked.length; m++){
+               dojo.disconnect(marked[m]);
+       }
+       // test
+       failures = 0;
+       hub();
+       // return number of disconnected functions that fired (should be 0)
+       return failures;
+}
+
+markAndSweepSubscribersTest = function(iterations){
+       var topic = "hubbins";
+       var marked = [];
+       // connections
+       for(var i=0; i<iterations; i++){
+               if(Math.random() < 0.5){
+                       marked.push(dojo.subscribe(topic, bad));
+               }else{
+                       dojo.subscribe(topic, good);
+               }
+       }
+       // Randomize markers (only if the count isn't very high)
+       if(i < Math.pow(10, 4)){
+               var rm = [ ];
+               while(marked.length){
+                       var m = Math.floor(Math.random() * marked.length);
+                       rm.push(marked[m]);
+                       marked.splice(m, 1);
+               }
+               marked = rm;                            
+       } 
+       for(var m=0; m<marked.length; m++){
+               dojo.unsubscribe(marked[m]);
+       }
+       // test
+       failures = 0;
+       dojo.publish(topic);
+       // return number of unsubscribed functions that fired (should be 0)
+       return failures;
+}
+
+tests.register("tests._base.connect",
+       [
+               function smokeTest(t){
+                       // foo sets ok to false
+                       var ok = false;
+                       var foo = { "foo": function(){ ok=false; } };
+                       // connected function sets ok to true
+                       dojo.connect(foo, "foo", null, function(){ ok=true; });
+                       foo.foo();
+                       t.is(true, ok);
+               },
+               function basicTest(t) {
+                       var out = '';
+                       var obj = {
+                               foo: function() {
+                                       out += 'foo';
+                               },
+                               bar: function() {
+                                       out += 'bar';
+                               },
+                               baz: function() {
+                                       out += 'baz';
+                               }
+                       };
+                       //
+                       var foobar = dojo.connect(obj, "foo", obj, "bar");
+                       dojo.connect(obj, "bar", obj, "baz");
+                       //
+                       out = '';
+                       obj.foo();
+                       t.is('foobarbaz', out);
+                       //
+                       out = '';
+                       obj.bar();
+                       t.is('barbaz', out);
+                       //
+                       out = '';
+                       obj.baz();
+                       t.is('baz', out);
+                       //
+                       dojo.connect(obj, "foo", obj, "baz");
+                       dojo.disconnect(foobar);
+                       //
+                       out = '';
+                       obj.foo();
+                       t.is('foobaz', out);
+                       //
+                       out = '';
+                       obj.bar();
+                       t.is('barbaz', out);
+                       //
+                       out = '';
+                       obj.baz();
+                       t.is('baz', out);
+               },
+               function hubConnectDisconnect1000(t){
+                       t.is(0, markAndSweepTest(1000));
+               },
+               function args4Test(t){
+                       // standard 4 args test
+                       var ok, obj = { foo: function(){ok=false;}, bar: function(){ok=true} };
+                       dojo.connect(obj, "foo", obj, "bar");
+                       obj.foo();
+                       t.is(true, ok);
+               },
+               function args3Test(t){
+                       // make some globals
+                       var ok;
+                       dojo.global["gFoo"] = function(){ok=false;};
+                       dojo.global["gOk"] = function(){ok=true;};
+                       // 3 arg shorthand for globals (a)
+                       var link = dojo.connect("gFoo", null, "gOk");
+                       gFoo();
+                       dojo.disconnect(link);
+                       t.is(true, ok);
+                       // 3 arg shorthand for globals (b)
+                       link = dojo.connect(null, "gFoo", "gOk");
+                       gFoo();
+                       dojo.disconnect(link);
+                       t.is(true, ok);
+                       // verify disconnections 
+                       gFoo();
+                       t.is(false, ok);
+               },
+               function args2Test(t){
+                       // make some globals
+                       var ok;
+                       dojo.global["gFoo"] = function(){ok=false;};
+                       dojo.global["gOk"] = function(){ok=true;};
+                       // 2 arg shorthand for globals 
+                       var link = dojo.connect("gFoo", "gOk");
+                       gFoo();
+                       dojo.disconnect(link);
+                       t.is(true, ok);
+                       // 2 arg shorthand for globals, alternate scoping 
+                       link = dojo.connect("gFoo", gOk);
+                       gFoo();
+                       dojo.disconnect(link);
+                       t.is(true, ok);
+               },
+               function scopeTest1(t){
+                       var foo = { ok: true, foo: function(){this.ok=false;} };
+                       var bar = { ok: false, bar: function(){this.ok=true} };
+                       // link foo.foo to bar.bar with natural scope
+                       var link = dojo.connect(foo, "foo", bar, "bar");
+                       foo.foo();
+                       t.is(false, foo.ok);
+                       t.is(true, bar.ok);
+               },              
+               function scopeTest2(t){
+                       var foo = { ok: true, foo: function(){this.ok=false;} };
+                       var bar = { ok: false, bar: function(){this.ok=true} };
+                       // link foo.foo to bar.bar such that scope is always 'foo'
+                       var link = dojo.connect(foo, "foo", bar.bar);
+                       foo.foo();
+                       t.is(true, foo.ok);
+                       t.is(false, bar.ok);
+               },
+               function connectPublisher(t){
+                       var foo = { inc: 0, foo: function(){ this.inc++; } };
+                       var bar = { inc: 0, bar: function(){ this.inc++; } };
+                       var c1h = dojo.connectPublisher("/blah", foo, "foo");
+                       var c2h = dojo.connectPublisher("/blah", foo, "foo");
+                       dojo.subscribe("/blah", bar, "bar");
+                       foo.foo();
+                       t.is(1, foo.inc);
+                       t.is(2, bar.inc);
+                       dojo.disconnect(c1h);
+                       foo.foo();
+                       t.is(2, foo.inc);
+                       t.is(3, bar.inc);
+                       dojo.disconnect(c2h);
+                       foo.foo();
+                       t.is(3, foo.inc);
+                       t.is(3, bar.inc);
+               },
+               function publishSubscribe1000(t){
+                       t.is(markAndSweepSubscribersTest(1000), 0);
+               }
+       ]
+);
+
+}