comparison Implab.Test/AsyncTests.cs @ 119:2573b562e328 v2

Promises rewritten, added improved version of AsyncQueue
author cin
date Sun, 11 Jan 2015 19:13:02 +0300
parents d4e38929ce36
children 62d2f1e98c4e
comparison
equal deleted inserted replaced
118:e046a94eecb1 119:2573b562e328
70 public void ContinueOnCancelTest() { 70 public void ContinueOnCancelTest() {
71 var p = new Promise<bool>(); 71 var p = new Promise<bool>();
72 p.Cancel(); 72 p.Cancel();
73 73
74 var p2 = p 74 var p2 = p
75 .Cancelled(() => { 75 .Cancelled<bool>(() => {
76 throw new ApplicationException("CANCELLED"); 76 throw new ApplicationException("CANCELLED");
77 }) 77 })
78 .Error(e => true); 78 .Error(e => true);
79 79
80 Assert.AreEqual(true, p2.Join()); 80 Assert.AreEqual(true, p2.Join());
193 for (int i = 0; i < iterations; i++) { 193 for (int i = 0; i < iterations; i++) {
194 pool 194 pool
195 .Invoke(() => 1) 195 .Invoke(() => 1)
196 .Then(x => Interlocked.Add(ref count, x)) 196 .Then(x => Interlocked.Add(ref count, x))
197 .Then(x => Math.Log10(x)) 197 .Then(x => Math.Log10(x))
198 .Anyway(() => { 198 .On(() => {
199 Interlocked.Decrement(ref pending); 199 Interlocked.Decrement(ref pending);
200 if (pending == 0) 200 if (pending == 0)
201 stop.Set(); 201 stop.Set();
202 }); 202 }, PromiseEventType.All);
203 } 203 }
204 204
205 stop.WaitOne(); 205 stop.WaitOne();
206 206
207 Assert.AreEqual(iterations, count); 207 Assert.AreEqual(iterations, count);
253 for (int ii = 0; ii < itemsPerWriter; ii++) { 253 for (int ii = 0; ii < itemsPerWriter; ii++) {
254 queue.Enqueue(1); 254 queue.Enqueue(1);
255 } 255 }
256 return 1; 256 return 1;
257 }) 257 })
258 .Anyway(() => Interlocked.Decrement(ref writers)); 258 .On(() => Interlocked.Decrement(ref writers), PromiseEventType.All);
259 } 259 }
260 260
261 for (int i = 0; i < 10; i++) { 261 for (int i = 0; i < 10; i++) {
262 Interlocked.Increment(ref readers); 262 Interlocked.Increment(ref readers);
263 AsyncPool 263 AsyncPool
267 while (queue.TryDequeue(out t)) 267 while (queue.TryDequeue(out t))
268 Interlocked.Add(ref total, t); 268 Interlocked.Add(ref total, t);
269 } while (writers > 0); 269 } while (writers > 0);
270 return 1; 270 return 1;
271 }) 271 })
272 .Anyway(() => { 272 .On(() => {
273 Interlocked.Decrement(ref readers); 273 Interlocked.Decrement(ref readers);
274 if (readers == 0) 274 if (readers == 0)
275 stop.Set(); 275 stop.Set();
276 }); 276 }, PromiseEventType.All);
277 }
278
279 stop.WaitOne();
280
281 Assert.AreEqual(100000, total);
282 }
283
284 [TestMethod]
285 public void AsyncQueueTest() {
286 var queue = new AsyncQueue<int>();
287 int res;
288
289 queue.Enqueue(10);
290 Assert.IsTrue(queue.TryDequeue(out res));
291 Assert.AreEqual(10, res);
292 Assert.IsFalse(queue.TryDequeue(out res));
293
294 for (int i = 0; i < 1000; i++)
295 queue.Enqueue(i);
296
297 for (int i = 0; i < 1000; i++) {
298 queue.TryDequeue(out res);
299 Assert.AreEqual(i, res);
300 }
301
302 int writers = 0;
303 int readers = 0;
304 var stop = new ManualResetEvent(false);
305 int total = 0;
306
307 const int itemsPerWriter = 10000;
308 const int writersCount = 10;
309
310 for (int i = 0; i < writersCount; i++) {
311 Interlocked.Increment(ref writers);
312 AsyncPool
313 .InvokeNewThread(() => {
314 for (int ii = 0; ii < itemsPerWriter; ii++) {
315 queue.Enqueue(1);
316 }
317 return 1;
318 })
319 .On(() => Interlocked.Decrement(ref writers), PromiseEventType.All);
320 }
321
322 for (int i = 0; i < 10; i++) {
323 Interlocked.Increment(ref readers);
324 AsyncPool
325 .InvokeNewThread(() => {
326 int t;
327 do {
328 while (queue.TryDequeue(out t))
329 Interlocked.Add(ref total, t);
330 } while (writers > 0);
331 return 1;
332 })
333 .On(() => {
334 Interlocked.Decrement(ref readers);
335 if (readers == 0)
336 stop.Set();
337 }, PromiseEventType.All);
277 } 338 }
278 339
279 stop.WaitOne(); 340 stop.WaitOne();
280 341
281 Assert.AreEqual(itemsPerWriter * writersCount, total); 342 Assert.AreEqual(itemsPerWriter * writersCount, total);
369 430
370 // op1 (aync 200ms) => op2 (async 200ms) => op3 (sync map) 431 // op1 (aync 200ms) => op2 (async 200ms) => op3 (sync map)
371 432
372 var step1 = PromiseHelper 433 var step1 = PromiseHelper
373 .Sleep(200, "Alan") 434 .Sleep(200, "Alan")
374 .Cancelled(() => flags[0] = true); 435 .On(() => flags[0] = true, PromiseEventType.Cancelled);
375 var p = step1 436 var p = step1
376 .Chain(x => 437 .Chain(x =>
377 PromiseHelper 438 PromiseHelper
378 .Sleep(200, "Hi, " + x) 439 .Sleep(200, "Hi, " + x)
379 .Then(y => y) 440 .Then(y => y)
380 .Cancelled(() => flags[1] = true) 441 .On(() => flags[1] = true, PromiseEventType.Cancelled)
381 ) 442 )
382 .Cancelled(() => flags[2] = true); 443 .On(() => flags[2] = true, PromiseEventType.Cancelled);
383 step1.Join(); 444 step1.Join();
384 p.Cancel(); 445 p.Cancel();
385 try { 446 try {
386 Assert.AreEqual(p.Join(), "Hi, Alan"); 447 Assert.AreEqual(p.Join(), "Hi, Alan");
387 Assert.Fail("Shouldn't get here"); 448 Assert.Fail("Shouldn't get here");