diff options
Diffstat (limited to 'includes/js/dojo/tests/_base/connect.js')
-rw-r--r-- | includes/js/dojo/tests/_base/connect.js | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/includes/js/dojo/tests/_base/connect.js b/includes/js/dojo/tests/_base/connect.js new file mode 100644 index 0000000..3761861 --- /dev/null +++ b/includes/js/dojo/tests/_base/connect.js @@ -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); + } + ] +); + +} |