Mercurial > pub > ImplabNet
comparison Implab.Test/AsyncTests.cs @ 76:c761fc982e1d v2
Refactoring of the IPromise<T> interface
Added tests
author | cin |
---|---|
date | Wed, 10 Sep 2014 17:53:05 +0400 |
parents | 3b8393be3441 |
children | 91362ffbecf8 |
comparison
equal
deleted
inserted
replaced
75:4439140706d0 | 76:c761fc982e1d |
---|---|
36 Assert.AreEqual(err.Message, "error"); | 36 Assert.AreEqual(err.Message, "error"); |
37 | 37 |
38 } | 38 } |
39 | 39 |
40 [TestMethod] | 40 [TestMethod] |
41 public void CancelExceptionTest() { | |
42 var p = new Promise<bool>(); | |
43 p.Cancel(); | |
44 | |
45 var p2 = p.Cancelled(() => { | |
46 throw new ApplicationException("CANCELLED"); | |
47 }); | |
48 | |
49 try { | |
50 p2.Join(); | |
51 Assert.Fail(); | |
52 } catch (ApplicationException err) { | |
53 Assert.AreEqual("CANCELLED", err.InnerException.Message); | |
54 } | |
55 | |
56 } | |
57 | |
58 [TestMethod] | |
59 public void ContinueOnCancelTest() { | |
60 var p = new Promise<bool>(); | |
61 p.Cancel(); | |
62 | |
63 var p2 = p | |
64 .Cancelled(() => { | |
65 throw new ApplicationException("CANCELLED"); | |
66 }) | |
67 .Error(e => true); | |
68 | |
69 Assert.AreEqual(true, p2.Join()); | |
70 } | |
71 | |
72 [TestMethod] | |
41 public void JoinSuccessTest() { | 73 public void JoinSuccessTest() { |
42 var p = new Promise<int>(); | 74 var p = new Promise<int>(); |
43 p.Resolve(100); | 75 p.Resolve(100); |
44 Assert.AreEqual(p.Join(), 100); | 76 Assert.AreEqual(p.Join(), 100); |
45 } | 77 } |
61 | 93 |
62 [TestMethod] | 94 [TestMethod] |
63 public void MapTest() { | 95 public void MapTest() { |
64 var p = new Promise<int>(); | 96 var p = new Promise<int>(); |
65 | 97 |
66 var p2 = p.Map(x => x.ToString()); | 98 var p2 = p.Then(x => x.ToString()); |
67 p.Resolve(100); | 99 p.Resolve(100); |
68 | 100 |
69 Assert.AreEqual(p2.Join(), "100"); | 101 Assert.AreEqual(p2.Join(), "100"); |
70 } | 102 } |
71 | 103 |
183 int writers = 0; | 215 int writers = 0; |
184 int readers = 0; | 216 int readers = 0; |
185 var stop = new ManualResetEvent(false); | 217 var stop = new ManualResetEvent(false); |
186 int total = 0; | 218 int total = 0; |
187 | 219 |
188 int itemsPerWriter = 1000; | 220 int itemsPerWriter = 10000; |
189 int writersCount = 3; | 221 int writersCount = 10; |
190 | 222 |
191 for (int i = 0; i < writersCount; i++) { | 223 for (int i = 0; i < writersCount; i++) { |
192 Interlocked.Increment(ref writers); | 224 Interlocked.Increment(ref writers); |
193 var wn = i; | 225 var wn = i; |
194 AsyncPool | 226 AsyncPool |
316 .Sleep(200, "Alan") | 348 .Sleep(200, "Alan") |
317 .Cancelled(() => flags[0] = true) | 349 .Cancelled(() => flags[0] = true) |
318 .Chain(x => | 350 .Chain(x => |
319 PromiseHelper | 351 PromiseHelper |
320 .Sleep(200, "Hi, " + x) | 352 .Sleep(200, "Hi, " + x) |
321 .Map(y => y) | 353 .Then(y => y) |
322 .Cancelled(() => flags[1] = true) | 354 .Cancelled(() => flags[1] = true) |
323 ) | 355 ) |
324 .Cancelled(() => flags[2] = true); | 356 .Cancelled(() => flags[2] = true); |
325 Thread.Sleep(300); | 357 Thread.Sleep(300); |
326 p.Cancel(); | 358 p.Cancel(); |
339 public void ChainedCancel1Test() { | 371 public void ChainedCancel1Test() { |
340 // при отмене сцепленной асинхронной операции все обещание должно | 372 // при отмене сцепленной асинхронной операции все обещание должно |
341 // завершаться ошибкой OperationCanceledException | 373 // завершаться ошибкой OperationCanceledException |
342 var p = PromiseHelper | 374 var p = PromiseHelper |
343 .Sleep(1, "Hi, HAL!") | 375 .Sleep(1, "Hi, HAL!") |
344 .Chain(x => { | 376 .Then(x => { |
345 // запускаем две асинхронные операции | 377 // запускаем две асинхронные операции |
346 var result = PromiseHelper.Sleep(1000, "HEM ENABLED!!!"); | 378 var result = PromiseHelper.Sleep(1000, "HEM ENABLED!!!"); |
347 // вторая операция отменяет первую до завершения | 379 // вторая операция отменяет первую до завершения |
348 PromiseHelper | 380 PromiseHelper |
349 .Sleep(100, "HAL, STOP!") | 381 .Sleep(100, "HAL, STOP!") |
358 } | 390 } |
359 | 391 |
360 [TestMethod] | 392 [TestMethod] |
361 public void ChainedCancel2Test() { | 393 public void ChainedCancel2Test() { |
362 // при отмене цепочки обещаний, вложенные операции также должны отменяться | 394 // при отмене цепочки обещаний, вложенные операции также должны отменяться |
363 IPromise p = null; | |
364 var pSurvive = new Promise<bool>(); | 395 var pSurvive = new Promise<bool>(); |
365 var hemStarted = new ManualResetEvent(false); | 396 var hemStarted = new ManualResetEvent(false); |
366 p = PromiseHelper | 397 var p = PromiseHelper |
367 .Sleep(1, "Hi, HAL!") | 398 .Sleep(1, "Hi, HAL!") |
368 .Chain(x => { | 399 .Chain(x => { |
369 hemStarted.Set(); | 400 hemStarted.Set(); |
370 // запускаем две асинхронные операции | 401 // запускаем две асинхронные операции |
371 var result = PromiseHelper | 402 var result = PromiseHelper |
372 .Sleep(1000, "HEM ENABLED!!!") | 403 .Sleep(10000, "HEM ENABLED!!!") |
373 .Then(s => pSurvive.Resolve(false)); | 404 .Then(s => pSurvive.Resolve(false)); |
374 | 405 |
375 result | 406 result |
376 .Cancelled(() => pSurvive.Resolve(true)); | 407 .Cancelled(() => pSurvive.Resolve(true)); |
377 | 408 |