226 lines
5.3 KiB
JavaScript
226 lines
5.3 KiB
JavaScript
|
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);
|
||
|
}
|
||
|
]
|
||
|
);
|
||
|
|
||
|
}
|