source: Dev/trunk/src/client/dojo/tests/_base/Deferred.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 6.4 KB
Line 
1dojo.provide("dojo.tests._base.Deferred");
2
3var delay = function(ms){
4        var d = new dojo.Deferred();
5        ms = ms || 20;
6        if(this.setTimeout){
7                setTimeout(function(){
8                        d.progress(0.5);
9                },ms/2);
10                setTimeout(function(){
11                        d.resolve();
12                },ms);
13        }else{
14                d.progress(0.5);
15                d.resolve();
16        }
17        return d.promise;
18};
19doh.register("tests._base.Deferred",
20        [
21
22                function callback(t){
23                        var nd = new dojo.Deferred();
24                        var cnt = 0;
25                        nd.addCallback(function(res){
26                                doh.debug("debug from dojo.Deferred callback");
27                                return res;
28                        });
29                        nd.addCallback(function(res){
30                                // t.debug("val:", res);
31                                cnt+=res;
32                                return cnt;
33                        });
34                        nd.callback(5);
35                        // t.debug("cnt:", cnt);
36                        t.assertEqual(cnt, 5);
37                },
38
39                function callback_extra_args(t){
40                        var nd = new dojo.Deferred();
41                        var cnt = 0;
42                        nd.addCallback(dojo.global, function(base, res){ cnt+=base; cnt+=res; return cnt; }, 30);
43                        nd.callback(5);
44                        t.assertEqual(cnt, 35);
45                },
46
47                function errback(t){
48                        var nd = new dojo.Deferred();
49                        var cnt = 0;
50                        nd.addErrback(function(val){
51                                return ++cnt;
52                        });
53                        nd.errback();
54                        t.assertEqual(cnt, 1);
55                },
56
57                function callbackTwice(t){
58                        var nd = new dojo.Deferred();
59                        var cnt = 0;
60                        nd.addCallback(function(res){
61                                return ++cnt;
62                        });
63                        nd.callback();
64                        t.assertEqual(cnt, 1);
65                        var thrown = false;
66                        try{
67                                nd.callback();
68                        }catch(e){
69                                thrown = true;
70                        }
71                        t.assertTrue(thrown);
72                },
73
74                function addBoth(t){
75                        var nd = new dojo.Deferred();
76                        var cnt = 0;
77                        nd.addBoth(function(res){
78                                return ++cnt;
79                        });
80                        nd.callback();
81                        t.assertEqual(cnt, 1);
82
83                        // nd.callback();
84                        // t.debug(cnt);
85                        // t.assertEqual(cnt, 1);
86                },
87
88                function callbackNested(t){
89                        var nd = new dojo.Deferred();
90                        var nestedReturn = "yellow";
91                        nd.addCallback(function(res){
92                                nd.addCallback(function(res2){
93                                        nestedReturn = res2;
94                                });
95                                return "blue";
96                        });
97                        nd.callback("red");
98                        t.assertEqual("blue", nestedReturn);
99                },
100                function simpleThen(t){
101                        var td = new doh.Deferred();
102                        delay().then(function(){
103                                td.callback(true);
104                        });
105                        return td;
106                },
107                function thenChaining(t){
108                        var td = new doh.Deferred();
109                        var p = delay();
110                        var p2 = p.then(function(){
111                                return 1;
112                        });
113                        p3 = p2.then(function(){
114                                return 2;
115                        });
116                        p3.then(function(){
117                                p2.then(function(v){
118                                        t.assertEqual(v, 1);
119                                        p3.then(function(v){
120                                                t.assertEqual(v, 2);
121                                                td.callback(true);
122                                        });
123                                });
124                        });
125                        return td;
126                },
127                function simpleWhen(t){
128                        var td = new doh.Deferred();
129                        dojo.when(delay(), function(){
130                                td.callback(true);
131                        });
132                        return td;
133                },
134                function progress(t){
135                        if(dojo.isBrowser){
136                                var td = new doh.Deferred();
137                                var percentDone;
138                                dojo.when(delay(), function(){
139                                        t.is(percentDone, 0.5);
140                                        td.callback(true);
141                                },function(){},
142                                function(completed){
143                                        percentDone = completed;
144                                });
145                                return td;
146                        }
147                        return null;
148                },
149                function cancelThenDerivative(t){
150                        var def = new dojo.Deferred();
151                        var def2 = def.then();
152                        try{
153                                def2.cancel();
154                                t.t(true); // Didn't throw an error
155                        }catch(e){
156                                t.t(false);
157                        }
158                },
159                function cancelPromiseValue(t){
160                        var cancelledDef;
161                        var def = new dojo.Deferred(function(_def){ cancelledDef = _def; });
162                        def.promise.cancel();
163                        t.is(def, cancelledDef);
164                },
165                function errorResult(t){
166                        var def = new dojo.Deferred();
167                        var result = new Error("rejected");
168                        def.reject(result);
169                        t.is(def.fired, 1);
170                        t.is(def.results[1], result);
171                },
172                function globalLeak(t){
173                        var def = new dojo.Deferred();
174                        def.then(function(){ return def; });
175                        def.resolve(true);
176                        t.is(dojo.global.results, undefined, "results is leaking into global");
177                        t.is(dojo.global.fired, undefined, "fired is leaking into global");
178                },
179                function backAndForthProcess(t){
180                        var def = new dojo.Deferred();
181                        var retval = "fail";
182
183                        def.addErrback(function(){
184                                return "ignore error and throw this good string";
185                        }).addCallback(function(){
186                                throw new Error("error1");
187                        }).addErrback(function(){
188                                return "ignore second error and make it good again";
189                        }).addCallback(function(){
190                                retval = "succeed";
191                        });
192
193                        def.errback("");
194
195                        t.assertEqual("succeed", retval);
196                },
197                function backAndForthProcessThen(t){
198                        var def = new dojo.Deferred;
199                        var retval = "fail";
200
201                        def.then(null, function(){
202                                return "ignore error and throw this good string";
203                        }).then(function(){
204                                throw "error1";
205                        }).then(null, function(){
206                                return "ignore second error and make it good again";
207                        }).then(function(){
208                                retval = "succeed";
209                        });
210
211                        def.reject("");
212
213                        t.assertEqual("succeed", retval);
214                },
215                function returnErrorObject(t){
216                        var def = new dojo.Deferred();
217                        var retval = "fail";
218
219                        def.addCallback(function(){
220                                return new Error("returning an error should work same as throwing");
221                        }).addErrback(function(){
222                                retval = "succeed";
223                        });
224
225                        def.callback();
226
227                        t.assertEqual("succeed", retval);
228                },
229                function returnErrorObjectThen(t){
230                        var def = new dojo.Deferred();
231                        var retval = "fail";
232
233                        def.then(function(){
234                                return new Error("returning an error should NOT work same as throwing");
235                        }).then(function(){
236                                retval = "succeed";
237                        });
238
239                        def.resolve();
240
241                        t.assertEqual("succeed", retval);
242                },
243                function errbackWithPromise(t){
244                        var def = new dojo.Deferred();
245                        var retval;
246
247                        def.addCallbacks(function(){}, function(err){
248                                return err;
249                        });
250                        def.promise.then(
251                                        function(){ retval = "fail"; },
252                                        function(){ retval = "succeed"; });
253                        def.errback(new Error);
254
255                        t.assertEqual("succeed", retval);
256                },
257                function testDojoPromiseProgressBasic(t){
258                        var a = new dojo.Deferred();
259                        var b = new dojo.Deferred();
260                        var called = false;
261                       
262                        a.then(function(){
263                                b.then(function(){
264                                        if (!called){
265                                                console.log("Boo. ProgressBasic not called");
266                                        }
267                                }, function(){
268                                        console.log("Unexpected");
269                                }, function(){
270                                        called = true;
271                                        console.log("Yay. ProgressBasic called");
272                                });
273                        });
274                       
275                        a.resolve();
276                        b.progress();
277                        b.resolve();
278                        t.t(called);
279                },
280               
281                function testDojoPromiseProgressChain(t){
282                        var a = new dojo.Deferred();
283                        var b = new dojo.Deferred();
284                        var called = false;
285                       
286                        a.then(function(){
287                                return b;
288                        }).then(function(){
289                                if (!called){
290                                        console.log("Boo. ProgressChain not called");
291                                }
292                        }, function(){
293                                console.log("Unexpected");
294                        }, function(){
295                                called = true;
296                                console.log("Yay. ProgressChain called");
297                        });
298                       
299                        a.resolve();
300                        b.progress();
301                        b.resolve();
302                        t.t(called);
303                }
304 ]
305);
Note: See TracBrowser for help on using the repository browser.