1 | dojo.provide("dojox.lang.tests.async"); |
---|
2 | |
---|
3 | dojo.require("dojox.lang.async"); |
---|
4 | dojo.require("dojox.lang.async.timeout"); |
---|
5 | dojo.require("dojox.lang.async.topic"); |
---|
6 | |
---|
7 | (function(){ |
---|
8 | var async = dojox.lang.async, |
---|
9 | wait = async.timeout.from, |
---|
10 | QUANT = 50, // ms |
---|
11 | MAX_TICKS = 5; |
---|
12 | |
---|
13 | function randomTimes(n){ |
---|
14 | var a = []; |
---|
15 | for(var i = 0; i < n; ++i){ |
---|
16 | a.push((Math.floor(Math.random() * MAX_TICKS) + 1) * QUANT); |
---|
17 | } |
---|
18 | return a; |
---|
19 | } |
---|
20 | |
---|
21 | function getMin(a){ |
---|
22 | return Math.min.apply(Math, a); |
---|
23 | } |
---|
24 | |
---|
25 | function getMax(a){ |
---|
26 | return Math.max.apply(Math, a); |
---|
27 | } |
---|
28 | |
---|
29 | function waitAndExpect(expected, ms){ |
---|
30 | return function(value){ |
---|
31 | console.log("waitAndExpect: ", value, ", expected: ", expected); |
---|
32 | if(expected !== value){ |
---|
33 | console.log("ERROR: unexpected value"); |
---|
34 | throw new Error("Unexpected value"); |
---|
35 | } |
---|
36 | return wait(ms)(); |
---|
37 | } |
---|
38 | } |
---|
39 | |
---|
40 | function identity(x){ |
---|
41 | return x; |
---|
42 | } |
---|
43 | |
---|
44 | function is(a, b, visited){ |
---|
45 | if(a === b){ |
---|
46 | return true; |
---|
47 | } |
---|
48 | if(typeof a != typeof b){ |
---|
49 | return false; |
---|
50 | } |
---|
51 | if(Object.prototype.toString.call(a) != Object.prototype.toString.call(b)){ |
---|
52 | return false; |
---|
53 | } |
---|
54 | if(Object.prototype.toString.call(a) == "[object Function]"){ |
---|
55 | return false; |
---|
56 | } |
---|
57 | if(Object.prototype.toString.call(a) == "[object Array]"){ |
---|
58 | if(a.length !== b.length){ |
---|
59 | return false; |
---|
60 | } |
---|
61 | for(var i = 0; i < a.length; ++i){ |
---|
62 | if(!is(a[i], b[i], visited)){ |
---|
63 | return false; |
---|
64 | } |
---|
65 | return true; |
---|
66 | } |
---|
67 | } |
---|
68 | if(typeof a == "object"){ |
---|
69 | if(visited){ |
---|
70 | for(var i = 0; i < visited.length; ++i){ |
---|
71 | if(visited[i] === a || visited[i] === b){ |
---|
72 | return true; |
---|
73 | } |
---|
74 | } |
---|
75 | visited.push(a, b); |
---|
76 | }else{ |
---|
77 | visited = [a, b]; |
---|
78 | } |
---|
79 | var akeys = []; |
---|
80 | for(var i in a){ |
---|
81 | akeys.push(i); |
---|
82 | } |
---|
83 | var bkeys = []; |
---|
84 | for(var i in b){ |
---|
85 | bkeys.push(i); |
---|
86 | } |
---|
87 | akeys.sort(); |
---|
88 | bkeys.sort(); |
---|
89 | if(!is(akeys, bkeys)){ |
---|
90 | return false; |
---|
91 | } |
---|
92 | for(var i = 0; i < akeys.length; ++i){ |
---|
93 | if(!is(a[akeys[i]], b[bkeys[i]])){ |
---|
94 | return false; |
---|
95 | } |
---|
96 | } |
---|
97 | return true; |
---|
98 | } |
---|
99 | return false; |
---|
100 | } |
---|
101 | |
---|
102 | var waitFor0 = waitAndExpect(0, 20), |
---|
103 | waitFor1 = waitAndExpect(1, 20), |
---|
104 | waitFor2 = waitAndExpect(2, 20); |
---|
105 | |
---|
106 | tests.register("dojox.lang.tests.async", [ |
---|
107 | function smokeTest(){ |
---|
108 | var a = randomTimes(1), |
---|
109 | r = new dojo.Deferred(); |
---|
110 | wait(a[0])().addCallback(function(x){ |
---|
111 | if(r == a[0]){ |
---|
112 | console.log("ERROR: smokeTest: wrong result"); |
---|
113 | throw new Error("smokeTest: wrong result"); |
---|
114 | } |
---|
115 | r.callback(); |
---|
116 | }); |
---|
117 | return r; |
---|
118 | }, |
---|
119 | function testSeq(){ |
---|
120 | var a = randomTimes(5), |
---|
121 | fs = dojo.map(a, function(ms, i){ |
---|
122 | return waitAndExpect(i && a[i - 1], ms); |
---|
123 | }); |
---|
124 | return async.seq(fs)(0).addCallback(function(value){ |
---|
125 | if(a[a.length - 1] !== value){ |
---|
126 | console.log("ERROR: testSeq: wrong time"); |
---|
127 | throw new Error("testSeq: wrong time"); |
---|
128 | } |
---|
129 | }); |
---|
130 | }, |
---|
131 | function testPar(){ |
---|
132 | var a = randomTimes(5), |
---|
133 | fs = dojo.map(a, function(ms){ |
---|
134 | return waitAndExpect(0, ms); |
---|
135 | }); |
---|
136 | return async.par(fs)(0).addCallback(function(value){ |
---|
137 | console.log(a, " - ", value); |
---|
138 | if(!is(a, value)){ |
---|
139 | console.log("ERROR: testPar: wrong time"); |
---|
140 | throw new Error("testPar: wrong time"); |
---|
141 | } |
---|
142 | }); |
---|
143 | }, |
---|
144 | function testAny(){ |
---|
145 | var a = randomTimes(5), |
---|
146 | min = getMin(a), |
---|
147 | fs = dojo.map(a, function(ms){ |
---|
148 | return waitAndExpect(0, ms); |
---|
149 | }); |
---|
150 | return async.any(fs)(0).addCallback(function(value){ |
---|
151 | console.log(min, " - ", value); |
---|
152 | if(min !== value){ |
---|
153 | console.log("ERROR: testAny: wrong time"); |
---|
154 | throw new Error("testAny: wrong time"); |
---|
155 | } |
---|
156 | }); |
---|
157 | }, |
---|
158 | function testSelect0(){ |
---|
159 | return async.select( |
---|
160 | identity, |
---|
161 | waitFor0, |
---|
162 | waitFor1, |
---|
163 | waitFor2 |
---|
164 | )(0); |
---|
165 | }, |
---|
166 | function testSelect1(){ |
---|
167 | return async.select( |
---|
168 | identity, |
---|
169 | waitFor0, |
---|
170 | waitFor1, |
---|
171 | waitFor2 |
---|
172 | )(1); |
---|
173 | }, |
---|
174 | function testSelect2(){ |
---|
175 | return async.select( |
---|
176 | identity, |
---|
177 | waitFor0, |
---|
178 | waitFor1, |
---|
179 | waitFor2 |
---|
180 | )(2); |
---|
181 | }, |
---|
182 | function testIfThenT(){ |
---|
183 | return async.ifThen( |
---|
184 | identity, |
---|
185 | waitFor1, |
---|
186 | waitFor0 |
---|
187 | )(1); |
---|
188 | }, |
---|
189 | function testIfThenF(){ |
---|
190 | return async.ifThen( |
---|
191 | identity, |
---|
192 | waitFor1, |
---|
193 | waitFor0 |
---|
194 | )(0); |
---|
195 | }, |
---|
196 | function testLoop(){ |
---|
197 | var counter = 0; |
---|
198 | return async.seq( |
---|
199 | async.loop( |
---|
200 | identity, |
---|
201 | function(ms){ |
---|
202 | ++counter; |
---|
203 | return wait(ms - 10)(); |
---|
204 | } |
---|
205 | ), |
---|
206 | function(){ |
---|
207 | console.log(counter, " - ", 3); |
---|
208 | if(counter !== 3){ |
---|
209 | console.log("ERROR: testLoop: wrong number of iterations"); |
---|
210 | throw new Error("testLoop: wrong number of iterations"); |
---|
211 | } |
---|
212 | } |
---|
213 | )(30); |
---|
214 | } |
---|
215 | ]); |
---|
216 | })(); |
---|