UNPKG

can

Version:

MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.

306 lines (278 loc) 6.57 kB
dojo.provide("dojo.tests._base.Deferred"); var delay = function(ms){ var d = new dojo.Deferred(); ms = ms || 20; if(this.setTimeout){ setTimeout(function(){ d.progress(0.5); },ms/2); setTimeout(function(){ d.resolve(); },ms); }else{ d.progress(0.5); d.resolve(); } return d.promise; }; doh.register("tests._base.Deferred", [ function callback(t){ var nd = new dojo.Deferred(); var cnt = 0; nd.addCallback(function(res){ doh.debug("debug from dojo.Deferred callback"); return res; }); nd.addCallback(function(res){ // t.debug("val:", res); cnt+=res; return cnt; }); nd.callback(5); // t.debug("cnt:", cnt); t.assertEqual(cnt, 5); }, function callback_extra_args(t){ var nd = new dojo.Deferred(); var cnt = 0; nd.addCallback(dojo.global, function(base, res){ cnt+=base; cnt+=res; return cnt; }, 30); nd.callback(5); t.assertEqual(cnt, 35); }, function errback(t){ var nd = new dojo.Deferred(); var cnt = 0; nd.addErrback(function(val){ return ++cnt; }); nd.errback(); t.assertEqual(cnt, 1); }, function callbackTwice(t){ var nd = new dojo.Deferred(); var cnt = 0; nd.addCallback(function(res){ return ++cnt; }); nd.callback(); t.assertEqual(cnt, 1); var thrown = false; try{ nd.callback(); }catch(e){ thrown = true; } t.assertTrue(thrown); }, function addBoth(t){ var nd = new dojo.Deferred(); var cnt = 0; nd.addBoth(function(res){ return ++cnt; }); nd.callback(); t.assertEqual(cnt, 1); // nd.callback(); // t.debug(cnt); // t.assertEqual(cnt, 1); }, function callbackNested(t){ var nd = new dojo.Deferred(); var nestedReturn = "yellow"; nd.addCallback(function(res){ nd.addCallback(function(res2){ nestedReturn = res2; }); return "blue"; }); nd.callback("red"); t.assertEqual("blue", nestedReturn); }, function simpleThen(t){ var td = new doh.Deferred(); delay().then(function(){ td.callback(true); }); return td; }, function thenChaining(t){ var td = new doh.Deferred(); var p = delay(); var p2 = p.then(function(){ return 1; }); p3 = p2.then(function(){ return 2; }); p3.then(function(){ p2.then(function(v){ t.assertEqual(v, 1); p3.then(function(v){ t.assertEqual(v, 2); td.callback(true); }); }); }); return td; }, function simpleWhen(t){ var td = new doh.Deferred(); dojo.when(delay(), function(){ td.callback(true); }); return td; }, function progress(t){ if(dojo.isBrowser){ var td = new doh.Deferred(); var percentDone; dojo.when(delay(), function(){ t.is(percentDone, 0.5); td.callback(true); },function(){}, function(completed){ percentDone = completed; }); return td; } return null; }, function cancelThenDerivative(t){ var def = new dojo.Deferred(); var def2 = def.then(); try{ def2.cancel(); t.t(true); // Didn't throw an error }catch(e){ t.t(false); } }, function cancelPromiseValue(t){ var cancelledDef; var def = new dojo.Deferred(function(_def){ cancelledDef = _def; }); def.promise.cancel(); t.is(def, cancelledDef); }, function errorResult(t){ var def = new dojo.Deferred(); var result = new Error("rejected"); def.reject(result); t.is(def.fired, 1); t.is(def.results[1], result); }, function globalLeak(t){ var def = new dojo.Deferred(); def.then(function(){ return def; }); def.resolve(true); t.is(dojo.global.results, undefined, "results is leaking into global"); t.is(dojo.global.fired, undefined, "fired is leaking into global"); }, function backAndForthProcess(t){ var def = new dojo.Deferred(); var retval = "fail"; 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(function(){ retval = "succeed"; }); def.errback(""); t.assertEqual("succeed", retval); }, function backAndForthProcessThen(t){ var def = new dojo.Deferred; var retval = "fail"; 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(function(){ retval = "succeed"; }); def.reject(""); t.assertEqual("succeed", retval); }, function returnErrorObject(t){ var def = new dojo.Deferred(); var retval = "fail"; def.addCallback(function(){ return new Error("returning an error should work same as throwing"); }).addErrback(function(){ retval = "succeed"; }); def.callback(); t.assertEqual("succeed", retval); }, function returnErrorObjectThen(t){ var def = new dojo.Deferred(); var retval = "fail"; def.then(function(){ return new Error("returning an error should NOT work same as throwing"); }).then(function(){ retval = "succeed"; }); def.resolve(); t.assertEqual("succeed", retval); }, function errbackWithPromise(t){ var def = new dojo.Deferred(); var retval; def.addCallbacks(function(){}, function(err){ return err; }); def.promise.then( function(){ retval = "fail"; }, function(){ retval = "succeed"; }); def.errback(new Error); t.assertEqual("succeed", retval); }, function testDojoPromiseProgressBasic(t){ var a = new dojo.Deferred(); var b = new dojo.Deferred(); var called = false; a.then(function(){ b.then(function(){ if (!called){ console.log("Boo. ProgressBasic not called"); } }, function(){ console.log("Unexpected"); }, function(){ called = true; console.log("Yay. ProgressBasic called"); }); }); a.resolve(); b.progress(); b.resolve(); t.t(called); }, function testDojoPromiseProgressChain(t){ var a = new dojo.Deferred(); var b = new dojo.Deferred(); var called = false; a.then(function(){ return b; }).then(function(){ if (!called){ console.log("Boo. ProgressChain not called"); } }, function(){ console.log("Unexpected"); }, function(){ called = true; console.log("Yay. ProgressChain called"); }); a.resolve(); b.progress(); b.resolve(); t.t(called); } ] );