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

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

Added Dojo 1.9.3 release.

File size: 13.5 KB
Line 
1define([
2        "doh/main",
3        "dojo/Deferred",
4        "dojo/promise/Promise",
5        "dojo/errors/CancelError"
6], function(doh, Deferred, Promise, CancelError){
7        var tests = {
8                "deferred receives result after resolving": function(t){
9                        var obj = {};
10                        var received;
11                        this.deferred.then(function(result){ received = result; });
12                        this.deferred.resolve(obj);
13                        t.t(received === obj);
14                },
15
16                "promise receives result after resolving": function(t){
17                        var obj = {};
18                        var received;
19                        this.deferred.promise.then(function(result){ received = obj; });
20                        this.deferred.resolve(obj);
21                        t.t(received === obj);
22                },
23
24                "resolve() returns promise": function(t){
25                        var obj = {};
26                        var returnedPromise = this.deferred.resolve(obj);
27                        t.t(returnedPromise instanceof Promise);
28                        t.t(returnedPromise === this.deferred.promise);
29                },
30
31                "isResolved() returns true after resolving": function(t){
32                        t.f(this.deferred.isResolved());
33                        this.deferred.resolve();
34                        t.t(this.deferred.isResolved());
35                },
36
37                "isFulfilled() returns true after resolving": function(t){
38                        t.f(this.deferred.isFulfilled());
39                        this.deferred.resolve();
40                        t.t(this.deferred.isFulfilled());
41                },
42
43                "resolve() is ignored after having been fulfilled": function(t){
44                        this.deferred.resolve();
45                        this.deferred.resolve();
46                },
47
48                "resolve() throws error after having been fulfilled and strict": function(t){
49                        this.deferred.resolve();
50                        t.e(Error, this.deferred, "resolve", [{}, true]);
51                },
52
53                "resolve() results are cached": function(t){
54                        var obj = {};
55                        var received;
56                        this.deferred.resolve(obj);
57                        this.deferred.then(function(result){ received = result; });
58                        t.t(received === obj);
59                },
60
61                "resolve() is already bound to the deferred": function(t){
62                        var obj = {};
63                        var received;
64                        this.deferred.then(function(result){ received = result; });
65                        var resolve = this.deferred.resolve;
66                        resolve(obj);
67                        t.t(received === obj);
68                },
69
70                "deferred receives result after rejecting": function(t){
71                        var obj = {};
72                        var received;
73                        this.deferred.then(null, function(result){ received = result; });
74                        this.deferred.reject(obj);
75                        t.t(received === obj);
76                },
77
78                "promise receives result after rejecting": function(t){
79                        var obj = {};
80                        var received;
81                        this.deferred.promise.then(null, function(result){ received = result; });
82                        this.deferred.reject(obj);
83                        t.t(received === obj);
84                },
85
86                "reject() returns promise": function(t){
87                        var obj = {};
88                        var returnedPromise = this.deferred.reject(obj);
89                        t.t(returnedPromise instanceof Promise);
90                        t.t(returnedPromise === this.deferred.promise);
91                },
92
93                "isRejected() returns true after rejecting": function(t){
94                        t.f(this.deferred.isRejected());
95                        this.deferred.reject();
96                        t.t(this.deferred.isRejected());
97                },
98
99                "isFulfilled() returns true after rejecting": function(t){
100                        t.f(this.deferred.isFulfilled());
101                        this.deferred.reject();
102                        t.t(this.deferred.isFulfilled());
103                },
104
105                "reject() is ignored after having been fulfilled": function(t){
106                        this.deferred.reject();
107                        this.deferred.reject();
108                },
109
110                "reject() throws error after having been fulfilled and strict": function(t){
111                        this.deferred.reject();
112                        t.e(Error, this.deferred, "reject", [{}, true]);
113                },
114
115                "reject() results are cached": function(t){
116                        var obj = {};
117                        var received;
118                        this.deferred.reject(obj);
119                        this.deferred.then(null, function(result){ received = result; });
120                        t.t(received === obj);
121                },
122
123                "reject() is already bound to the deferred": function(t){
124                        var obj = {};
125                        var received;
126                        this.deferred.then(null, function(result){ received = result; });
127                        var reject = this.deferred.reject;
128                        reject(obj);
129                        t.t(received === obj);
130                },
131
132                "deferred receives result after progress": function(t){
133                        var obj = {};
134                        var received;
135                        this.deferred.then(null, null, function(result){ received = result; });
136                        this.deferred.progress(obj);
137                        t.t(received === obj);
138                },
139
140                "promise receives result after progres": function(t){
141                        var obj = {};
142                        var received;
143                        this.deferred.promise.then(null, null, function(result){ received = result; });
144                        this.deferred.progress(obj);
145                        t.t(received === obj);
146                },
147
148                "progress() returns promise": function(t){
149                        var obj = {};
150                        var returnedPromise = this.deferred.progress(obj);
151                        t.t(returnedPromise instanceof Promise);
152                        t.t(returnedPromise === this.deferred.promise);
153                },
154
155                "isResolved() returns false after progress": function(t){
156                        t.f(this.deferred.isResolved());
157                        this.deferred.progress();
158                        t.f(this.deferred.isResolved());
159                },
160
161                "isRejected() returns false after progress": function(t){
162                        t.f(this.deferred.isRejected());
163                        this.deferred.progress();
164                        t.f(this.deferred.isRejected());
165                },
166
167                "isFulfilled() returns false after progress": function(t){
168                        t.f(this.deferred.isFulfilled());
169                        this.deferred.progress();
170                        t.f(this.deferred.isFulfilled());
171                },
172
173                "progress() is ignored after having been fulfilled": function(t){
174                        this.deferred.resolve();
175                        this.deferred.resolve();
176                },
177
178                "progress() throws error after having been fulfilled and strict": function(t){
179                        this.deferred.resolve();
180                        t.e(Error, this.deferred, "progress", [{}, true]);
181                },
182
183                "progress() results are not cached": function(t){
184                        var obj1 = {}, obj2 = {};
185                        var received = [];
186                        this.deferred.progress(obj1);
187                        this.deferred.then(null, null, function(result){ received.push(result); });
188                        this.deferred.progress(obj2);
189                        t.t(received[0] === obj2);
190                        t.is(1, received.length);
191                },
192
193                "progress() with chaining": function(t){
194                        var obj = {};
195                        var inner = new Deferred();
196                        var received;
197                        this.deferred.then(function(){ return inner; }).then(null, null, function(result){ received = result; });
198                        this.deferred.resolve();
199                        inner.progress(obj);
200                        t.t(received === obj);
201                },
202
203                "after progress(), the progback return value is emitted on the returned promise": function(t){
204                        var received;
205                        var promise = this.deferred.then(null, null, function(n){ return n * n; });
206                        promise.then(null, null, function(n){ received = n; });
207                        this.deferred.progress(2);
208                        t.is(4, received);
209                },
210
211                "progress() is already bound to the deferred": function(t){
212                        var obj = {};
213                        var received;
214                        this.deferred.then(null, null, function(result){ received = result; });
215                        var progress = this.deferred.progress;
216                        progress(obj);
217                        t.t(received === obj);
218                },
219
220                "cancel() invokes a canceler": function(t){
221                        var invoked;
222                        this.canceler = function(){ invoked = true; };
223                        this.deferred.cancel();
224                        t.t(invoked);
225                },
226
227                "isCanceled() returns true after canceling": function(t){
228                        t.f(this.deferred.isCanceled());
229                        this.deferred.cancel();
230                        t.t(this.deferred.isCanceled());
231                },
232
233                "isResolved() returns false after canceling": function(t){
234                        t.f(this.deferred.isResolved());
235                        this.deferred.cancel();
236                        t.f(this.deferred.isResolved());
237                },
238
239                "isRejected() returns true after canceling": function(t){
240                        t.f(this.deferred.isRejected());
241                        this.deferred.cancel();
242                        t.t(this.deferred.isRejected());
243                },
244
245                "isFulfilled() returns true after canceling": function(t){
246                        t.f(this.deferred.isFulfilled());
247                        this.deferred.cancel();
248                        t.t(this.deferred.isFulfilled());
249                },
250
251                "cancel() is ignored after having been fulfilled": function(t){
252                        var canceled = false;
253                        this.canceler = function(){ canceled = true; };
254                        this.deferred.resolve();
255                        this.deferred.cancel();
256                        t.f(canceled);
257                },
258
259                "cancel() throws error after having been fulfilled and strict": function(t){
260                        this.deferred.resolve();
261                        t.e(Error, this.deferred, "cancel", [null, true]);
262                },
263
264                "cancel() without reason results in CancelError": function(t){
265                        var reason = this.deferred.cancel();
266                        var received;
267                        this.deferred.then(null, function(result){ received = result; });
268                        t.t(received, reason);
269                },
270
271                "cancel() returns default reason": function(t){
272                        var reason = this.deferred.cancel();
273                        t.t(reason instanceof CancelError);
274                },
275
276                "reason is passed to canceler": function(t){
277                        var obj = {};
278                        var received;
279                        this.canceler = function(reason){ received = reason; };
280                        this.deferred.cancel(obj);
281                        t.t(received === obj);
282                },
283
284                "cancels with reason returned from canceler": function(t){
285                        var obj = {};
286                        var received;
287                        this.canceler = function(){ return obj; };
288                        var reason = this.deferred.cancel();
289                        this.deferred.then(null, function(reason){ received = reason; });
290                        t.t(received === obj);
291                },
292
293                "cancel() returns reason from canceler": function(t){
294                        var obj = {};
295                        this.canceler = function(){ return obj; };
296                        var reason = this.deferred.cancel();
297                        t.t(reason === obj);
298                },
299
300                "cancel() returns reason from canceler, if canceler rejects with reason": function(t){
301                        var obj = {};
302                        var deferred = this.deferred;
303                        this.canceler = function(){ deferred.reject(obj); return obj; };
304                        var reason = this.deferred.cancel();
305                        t.t(reason === obj);
306                },
307
308                "with canceler not returning anything, returns default CancelError": function(t){
309                        this.canceler = function(){};
310                        var reason = this.deferred.cancel();
311                        var received;
312                        this.deferred.then(null, function(result){ received = result; });
313                        t.t(received === reason);
314                },
315
316                "with canceler not returning anything, still returns passed reason": function(t){
317                        var obj = {};
318                        var received;
319                        this.canceler = function(){};
320                        var reason = this.deferred.cancel(obj);
321                        t.t(reason === obj);
322                        this.deferred.then(null, function(result){ received = result; });
323                        t.t(received === reason);
324                },
325
326                "cancel() doesn't reject promise if canceler resolves deferred": function(t){
327                        var deferred = this.deferred;
328                        var obj = {};
329                        var received;
330                        this.canceler = function(){ deferred.resolve(obj); };
331                        this.deferred.cancel();
332                        this.deferred.then(function(result){ received = result; });
333                        t.t(received === obj);
334                },
335
336                "cancel() doesn't reject promise if canceler resolves a chain of promises": function(t){
337                        var deferred = this.deferred;
338                        var obj = {};
339                        var received;
340                        this.canceler = function(){ deferred.resolve(obj); };
341                        var last = this.deferred.then().then().then();
342                        last.cancel();
343                        last.then(function(result){ received = result; });
344                        t.t(received === obj);
345                        t.t(this.deferred.isCanceled());
346                        t.t(last.isCanceled());
347                },
348
349                "cancel() returns undefined if canceler resolves deferred": function(t){
350                        var deferred = this.deferred;
351                        var obj = {};
352                        this.canceler = function(){ deferred.resolve(obj); };
353                        var result = this.deferred.cancel();
354                        t.t(typeof result === "undefined");
355                },
356
357                "cancel() doesn't change rejection value if canceler rejects deferred": function(t){
358                        var deferred = this.deferred;
359                        var obj = {};
360                        var received;
361                        this.canceler = function(){ deferred.reject(obj); };
362                        this.deferred.cancel();
363                        this.deferred.then(null, function(result){ received = result; });
364                        t.t(received === obj);
365                },
366
367                "cancel() doesn't change rejection value if canceler rejects a chain of promises": function(t){
368                        var deferred = this.deferred;
369                        var obj = {};
370                        var received;
371                        this.canceler = function(){ deferred.reject(obj); };
372                        var last = this.deferred.then().then().then();
373                        last.cancel();
374                        last.then(null, function(result){ received = result; });
375                        t.t(received === obj);
376                        t.t(this.deferred.isCanceled());
377                        t.t(last.isCanceled());
378                },
379
380                "cancel() returns undefined if canceler rejects deferred": function(t){
381                        var deferred = this.deferred;
382                        var obj = {};
383                        this.canceler = function(){ deferred.reject(obj); };
384                        var result = this.deferred.cancel();
385                        t.t(typeof result === "undefined");
386                },
387
388                "cancel() a promise chain": function(t){
389                        var obj = {};
390                        var received;
391                        this.canceler = function(reason){ received = reason; };
392                        this.deferred.then().then().then().cancel(obj);
393                        t.t(received === obj);
394                },
395
396                "cancel() a returned promise": function(t){
397                        var obj = {};
398                        var received;
399                        var inner = new Deferred(function(reason){ received = reason; });
400                        var chain = this.deferred.then(function(){
401                                return inner;
402                        });
403                        this.deferred.resolve();
404                        chain.cancel(obj, true);
405                        t.t(received === obj);
406                },
407
408                "cancel() is already bound to the deferred": function(t){
409                        var received;
410                        this.deferred.then(null, function(result){ received = result; });
411                        var cancel = this.deferred.cancel;
412                        cancel();
413                        t.t(received instanceof CancelError);
414                },
415
416                "chained then()": function(t){
417                        function square(n){ return n * n; }
418
419                        var result;
420                        this.deferred.then(square).then(square).then(function(n){
421                                result = n;
422                        });
423                        this.deferred.resolve(2);
424                        t.is(result, 16);
425                },
426
427                "asynchronously chained then()": function(t){
428                        function asyncSquare(n){
429                                var inner = new Deferred();
430                                setTimeout(function(){ inner.resolve(n * n); }, 0);
431                                return inner.promise;
432                        }
433
434                        var td = new doh.Deferred();
435                        this.deferred.then(asyncSquare).then(asyncSquare).then(function(n){
436                                t.is(n, 16);
437                                td.callback(true);
438                        });
439                        this.deferred.resolve(2);
440                        return td;
441                },
442
443                "then() is already bound to the deferred": function(t){
444                        var obj = {};
445                        var then = this.deferred.then;
446                        var received;
447                        then(function(result){ received = result; });
448                        this.deferred.resolve(obj);
449                        t.t(received === obj);
450                },
451
452                "then() with progback: returned promise is not fulfilled when progress is emitted": function(t){
453                        var progressed = false;
454                        var promise = this.deferred.then(null, null, function(){ progressed = true; });
455                        this.deferred.progress();
456                        t.t(progressed, "Progress was received.");
457                        t.f(promise.isFulfilled(), "Promise is not fulfilled.");
458                }
459        };
460
461        var wrapped = [];
462        for(var name in tests){
463                wrapped.push({
464                        name: name,
465                        setUp: setUp,
466                        runTest: tests[name]
467                });
468        }
469
470        function setUp(){
471                var self = this;
472                this.canceler = function(reason){};
473                this.deferred = new Deferred(function(reason){ return self.canceler(reason); });
474        }
475
476        doh.register("tests.Deferred", wrapped);
477});
Note: See TracBrowser for help on using the repository browser.