PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/System.Reactive.Tests/System.Reactive.Concurrency/CurrentThreadSchedulerTest.cs

https://github.com/gshackles/mono-reactive
C# | 71 lines | 64 code | 6 blank | 1 comment | 4 complexity | 2d641804f20daa352b40afeaf731207c MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Reactive;
  5. using System.Reactive.Concurrency;
  6. using System.Reactive.Linq;
  7. using System.Threading;
  8. using NUnit.Framework;
  9. namespace System.Reactive.Concurrency.Tests
  10. {
  11. [TestFixture]
  12. public class CurrentThreadSchedulerTest
  13. {
  14. [Test]
  15. public void CancellationWontWork ()
  16. {
  17. bool raised = false;
  18. var dis = Scheduler.CurrentThread.Schedule<object> (null, TimeSpan.FromMilliseconds (100), (sch, stat) => raised = true);
  19. dis.Dispose (); // immediately, to not raise event.
  20. Thread.Sleep (200);
  21. Assert.IsTrue (raised, "#1"); // Since dispose runs *after* the action run, there is no way to cancel it.
  22. }
  23. [Test]
  24. public void DueTime ()
  25. {
  26. DateTime start = DateTime.Now;
  27. TimeSpan span = TimeSpan.FromMilliseconds (100);
  28. var dis = Scheduler.CurrentThread.Schedule<object> (null, span, (sch, stat) => {});
  29. Assert.IsFalse (Scheduler.CurrentThread.ScheduleRequired, "#0"); // premise
  30. Assert.IsTrue (DateTime.Now - start >= span, "#1");
  31. dis.Dispose ();
  32. }
  33. [Test]
  34. public void Concurrency ()
  35. {
  36. // this is to test some race condition in scheduling (which used to fail)
  37. for (int i = 0; i < 500; i++)
  38. RunConcurrencyTest ();
  39. }
  40. void RunConcurrencyTest ()
  41. {
  42. var stream = Observable.Range (0, 9).Do (TextWriter.Null.WriteLine); // ... is done on CurrentThreadScheduler.
  43. var source = stream.ObserveOn (Scheduler.ThreadPool);
  44. bool done = false;
  45. var dis = source.Subscribe (TextWriter.Null.WriteLine, () => done = true);
  46. SpinWait.SpinUntil (() => done == true, 1000);
  47. dis.Dispose ();
  48. }
  49. [Test]
  50. public void Concurrency2 ()
  51. {
  52. for (int i = 0; i < 100; i++)
  53. RunConcurrencyTest2 ();
  54. }
  55. void RunConcurrencyTest2 ()
  56. {
  57. var stream = Observable.Range (0, 9).Do (TextWriter.Null.WriteLine); // ... is done on CurrentThreadScheduler.
  58. var source = stream.ObserveOn (Scheduler.CurrentThread); // Unlike another one, this test runs totally on CurrentThread.
  59. bool done = false;
  60. var dis = source.Subscribe (TextWriter.Null.WriteLine, () => done = true);
  61. SpinWait.SpinUntil (() => done == true, 1000);
  62. dis.Dispose ();
  63. }
  64. }
  65. }