Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

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);
                }
        ]
);

}