dojo
Version:
Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.
325 lines (279 loc) • 7.25 kB
JavaScript
define([
'intern!object',
'intern/chai!assert',
'intern/dojo/_base/kernel',
'dojo/when',
'testing/_base/Deferred'
], function (
registerSuite,
assert,
kernel,
when,
Deferred
) {
function delay(ms) {
var d = new Deferred();
ms = ms || 20;
setTimeout(function () {
d.progress(0.5);
}, ms / 2);
setTimeout(function () {
d.resolve();
}, ms);
return d.promise;
}
registerSuite({
name: 'dojo/_base/Deferred',
'.callback()': function () {
var dfd = new Deferred();
dfd.addCallback(this.async().callback(function (res) {
assert.equal(res, 5);
}));
dfd.callback(5);
},
'.callback() with args': function () {
var dfd = new Deferred();
dfd.addCallback(kernel.global, this.async().callback(function (base, res) {
assert.equal(base + res, 35);
}), 30);
dfd.callback(5);
},
'.errBack()': function () {
var dfd = new Deferred();
dfd.addErrback(this.async().callback(function () {
assert.ok(true);
}));
dfd.errback();
},
'.callback() twice': function () {
var dfd = new Deferred();
var cnt = 0;
var thrown = false;
dfd.addCallback(function () {
return ++cnt;
});
dfd.callback();
assert.equal(cnt, 1);
try {
dfd.callback();
} catch (e) {
thrown = true;
}
assert.isTrue(thrown);
},
'.addBoth()': function () {
var dfd = new Deferred();
dfd.addBoth(this.async().callback(function () {
assert.ok(true);
}));
dfd.callback();
},
'.addCallback() nested': function () {
var dfd = new Deferred();
dfd.addCallback(function () {
dfd.addCallback(this.async().callback(function (res2) {
assert.equal('blue', res2);
}));
return 'blue';
});
dfd.callback('red');
},
'.then() simple': function () {
delay().then(this.async().callback(function () {
assert.ok(true);
}));
},
'.then() chaining': function () {
var p = delay();
var p2 = p.then(function () {
return 1;
});
var p3 = p2.then(function () {
return 2;
});
p3.then(function () {
p2.then(function (v1) {
p3.then(this.async().callback(function (v2) {
assert.equal(v1, 1);
assert.equal(v2, 2);
}));
});
});
},
'when() simple': function () {
when(delay(), this.async().callback(function () {
assert.ok(true);
}));
},
'progress': function () {
var percentDone;
when(delay(), this.async().callback(function () {
assert.equal(percentDone, 0.5);
}), function () {},
function (completed) {
percentDone = completed;
});
},
'.cancel() then derivative': function () {
var def = new Deferred();
var def2 = def.then();
var hasThrown = false;
try {
def2.cancel();
} catch (e) {
hasThrown = true;
}
assert.isFalse(hasThrown);
},
'.cancel() promise value': function () {
var cancelledDef;
var def = new Deferred(function (_def) {
cancelledDef = _def;
});
def.promise.cancel();
assert.equal(def, cancelledDef);
},
'.cancel() doesn\'t write to console': function () {
var testDef = new Deferred();
require(['dojo/has', 'testing/Deferred', 'testing/promise/instrumentation'],
function(has,
NewDeferred,
instrumentation) {
var origUseDeferredInstrumentation = has('config-useDeferredInstrumentation');
has.add('config-useDeferredInstrumentation', "report-unhandled-rejections", null, true);
instrumentation(NewDeferred);
require(['testing/promise/instrumentation'], function () {
var def = new Deferred(),
errOrig = console.error,
errorThrown = false;
console.error = function (s) {
if(s == "CancelError"){
console.error = errOrig;
testDef.reject(s);
}
errOrig.apply(null, arguments);
}
setTimeout(function() {
if (!testDef.isCanceled() && !testDef.isFulfilled()) {
testDef.resolve();
}
has.add('config-useDeferredInstrumentation', origUseDeferredInstrumentation, null, true);
instrumentation(NewDeferred);
}, 2500);
def.cancel();
}
);
});
return testDef.promise;
},
'.error() result': function () {
var def = new Deferred();
var result = new Error('rejected');
def.reject(result);
assert.equal(def.fired, 1);
assert.equal(def.results[1], result);
},
'global leak': function () {
var def = new Deferred();
def.then(this.async().callback(function () {
assert.isUndefined(kernel.global.results, 'results is leaking into global');
assert.isUndefined(kernel.global.fired, 'fired is leaking into global');
}));
def.resolve(true);
},
'back and forth process': function () {
var def = new Deferred();
def.addErrback(function () {
return 'ignore error and throw this good string';
}).addCallback(function () {
throw new Error('error1');
}).addErrback(function () {
return 'ignore second error and make it good again';
}).addCallback(this.async().callback(function () {
assert.ok(true);
}));
def.errback('');
},
'back and forth process then': function () {
var def = new Deferred();
def.then(null, function () {
return 'ignore error and throw this good string';
}).then(function () {
throw 'error1';
}).then(null, function () {
return 'ignore second error and make it good again';
}).then(this.async().callback(function () {
assert.ok(true);
}));
def.reject('');
},
'return error object': function () {
var def = new Deferred();
def.addCallback(function () {
return new Error('returning an error should work same as throwing');
}).addErrback(this.async().callback(function () {
assert.ok(true);
}));
def.callback();
},
'return error object then': function () {
var def = new Deferred();
def.then(function () {
return new Error('returning an error should NOT work same as throwing');
}).then(this.async().callback(function () {
assert.ok(true);
}));
def.resolve();
},
'errBack with promise': function () {
var def = new Deferred();
def.addCallbacks(function () {}, function (err) {
return err;
});
def.promise.then(null, this.async().callback(function () {
assert.ok(true);
}));
def.errback(new Error());
},
'test dojo promise progress basic': function () {
var a = new Deferred();
var b = new Deferred();
var called = false;
a.then(function () {
b.then(function () {
if (!called) {
console.log('Boo. ProgressBasic not called');
}
}, function () {
console.log('Unexpected');
}, this.async().callback(function () {
called = true;
assert.ok(called);
}));
});
a.resolve();
b.progress();
b.resolve();
},
'test dojo promise progress chain': function () {
var a = new Deferred();
var b = new Deferred();
var called = false;
a.then(function () {
return b;
}).then(function () {
if (!called) {
console.log('Boo. ProgressChain not called');
}
}, function () {
console.log('Unexpected');
}, this.async().callback(function () {
called = true;
assert.ok(called);
}));
a.resolve();
b.progress();
b.resolve();
}
});
});