dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
217 lines (206 loc) • 4.48 kB
JavaScript
dojo.provide("dojox.lang.tests.async");
dojo.require("dojox.lang.async");
dojo.require("dojox.lang.async.timeout");
dojo.require("dojox.lang.async.topic");
(function(){
var async = dojox.lang.async,
wait = async.timeout.from,
QUANT = 50, // ms
MAX_TICKS = 5;
function randomTimes(n){
var a = [];
for(var i = 0; i < n; ++i){
a.push((Math.floor(Math.random() * MAX_TICKS) + 1) * QUANT);
}
return a;
}
function getMin(a){
return Math.min.apply(Math, a);
}
function getMax(a){
return Math.max.apply(Math, a);
}
function waitAndExpect(expected, ms){
return function(value){
console.log("waitAndExpect: ", value, ", expected: ", expected);
if(expected !== value){
console.log("ERROR: unexpected value");
throw new Error("Unexpected value");
}
return wait(ms)();
}
}
function identity(x){
return x;
}
function is(a, b, visited){
if(a === b){
return true;
}
if(typeof a != typeof b){
return false;
}
if(Object.prototype.toString.call(a) != Object.prototype.toString.call(b)){
return false;
}
if(Object.prototype.toString.call(a) == "[object Function]"){
return false;
}
if(Object.prototype.toString.call(a) == "[object Array]"){
if(a.length !== b.length){
return false;
}
for(var i = 0; i < a.length; ++i){
if(!is(a[i], b[i], visited)){
return false;
}
return true;
}
}
if(typeof a == "object"){
if(visited){
for(var i = 0; i < visited.length; ++i){
if(visited[i] === a || visited[i] === b){
return true;
}
}
visited.push(a, b);
}else{
visited = [a, b];
}
var akeys = [];
for(var i in a){
akeys.push(i);
}
var bkeys = [];
for(var i in b){
bkeys.push(i);
}
akeys.sort();
bkeys.sort();
if(!is(akeys, bkeys)){
return false;
}
for(var i = 0; i < akeys.length; ++i){
if(!is(a[akeys[i]], b[bkeys[i]])){
return false;
}
}
return true;
}
return false;
}
var waitFor0 = waitAndExpect(0, 20),
waitFor1 = waitAndExpect(1, 20),
waitFor2 = waitAndExpect(2, 20);
tests.register("dojox.lang.tests.async", [
function smokeTest(){
var a = randomTimes(1),
r = new dojo.Deferred();
wait(a[0])().addCallback(function(x){
if(r == a[0]){
console.log("ERROR: smokeTest: wrong result");
throw new Error("smokeTest: wrong result");
}
r.callback();
});
return r;
},
function testSeq(){
var a = randomTimes(5),
fs = dojo.map(a, function(ms, i){
return waitAndExpect(i && a[i - 1], ms);
});
return async.seq(fs)(0).addCallback(function(value){
if(a[a.length - 1] !== value){
console.log("ERROR: testSeq: wrong time");
throw new Error("testSeq: wrong time");
}
});
},
function testPar(){
var a = randomTimes(5),
fs = dojo.map(a, function(ms){
return waitAndExpect(0, ms);
});
return async.par(fs)(0).addCallback(function(value){
console.log(a, " - ", value);
if(!is(a, value)){
console.log("ERROR: testPar: wrong time");
throw new Error("testPar: wrong time");
}
});
},
function testAny(){
var a = randomTimes(5),
min = getMin(a),
fs = dojo.map(a, function(ms){
return waitAndExpect(0, ms);
});
return async.any(fs)(0).addCallback(function(value){
console.log(min, " - ", value);
if(min !== value){
console.log("ERROR: testAny: wrong time");
throw new Error("testAny: wrong time");
}
});
},
function testSelect0(){
return async.select(
identity,
waitFor0,
waitFor1,
waitFor2
)(0);
},
function testSelect1(){
return async.select(
identity,
waitFor0,
waitFor1,
waitFor2
)(1);
},
function testSelect2(){
return async.select(
identity,
waitFor0,
waitFor1,
waitFor2
)(2);
},
function testIfThenT(){
return async.ifThen(
identity,
waitFor1,
waitFor0
)(1);
},
function testIfThenF(){
return async.ifThen(
identity,
waitFor1,
waitFor0
)(0);
},
function testLoop(){
var counter = 0;
return async.seq(
async.loop(
identity,
function(ms){
++counter;
return wait(ms - 10)();
}
),
function(){
console.log(counter, " - ", 3);
if(counter !== 3){
console.log("ERROR: testLoop: wrong number of iterations");
throw new Error("testLoop: wrong number of iterations");
}
}
)(30);
}
]);
})();