PageRenderTime 96ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 1ms

/System.Reactive.Tests/System.Reactive.Concurrency/HistoricalSchedulerTest.cs

https://github.com/gshackles/mono-reactive
C# | 81 lines | 71 code | 6 blank | 4 comment | 0 complexity | 9dae96ce84b7dd2f434f00fc936f59ea MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reactive;
  6. using System.Reactive.Concurrency;
  7. using System.Reactive.Disposables;
  8. using System.Reactive.Linq;
  9. using System.Threading;
  10. using NUnit.Framework;
  11. namespace System.Reactive.Concurrency.Tests
  12. {
  13. [TestFixture]
  14. public class HistoricalSchedulerTest
  15. {
  16. class MyHistoricalScheduler : HistoricalScheduler
  17. {
  18. public DateTimeOffset PublicAdd (TimeSpan time)
  19. {
  20. return Add (Clock, time);
  21. }
  22. public TimeSpan PublicToRelative (TimeSpan time)
  23. {
  24. return ToRelative (time);
  25. }
  26. public IScheduledItem<DateTimeOffset> PublicGetNext ()
  27. {
  28. return GetNext ();
  29. }
  30. }
  31. [Test]
  32. public void Clock ()
  33. {
  34. var scheduler = new HistoricalScheduler ();
  35. Assert.AreEqual (DateTimeOffset.MinValue, scheduler.Clock, "#1"); // default
  36. scheduler.AdvanceBy (TimeSpan.FromDays (1));
  37. Assert.AreEqual (DateTimeOffset.MinValue.AddDays (1), scheduler.Clock, "#2");
  38. scheduler.AdvanceTo (new DateTimeOffset (2012, 1, 1, 0, 0, 0, TimeSpan.Zero));
  39. Assert.AreEqual (2012, scheduler.Clock.Year, "#3");
  40. }
  41. [Test]
  42. public void AdvanceByRaisesEvent ()
  43. {
  44. var scheduler = new MyHistoricalScheduler ();
  45. Assert.AreEqual (DateTimeOffset.MinValue.AddDays (1), scheduler.PublicAdd (TimeSpan.FromDays (1)), "#0");
  46. Assert.AreEqual (TimeSpan.FromDays (1), scheduler.PublicToRelative (TimeSpan.FromDays (1)), "#0-2");
  47. var source = Observable.Interval (TimeSpan.FromDays (1), scheduler);
  48. int x = 0;
  49. var dis = source.Subscribe (v => x++);
  50. Assert.IsNotNull (scheduler.PublicGetNext (), "#1");
  51. Assert.AreEqual (0, x, "#2");
  52. scheduler.AdvanceBy (TimeSpan.FromHours (1));
  53. Assert.AreEqual (0, x, "#3");
  54. scheduler.AdvanceBy (TimeSpan.FromDays (1));
  55. var item = scheduler.PublicGetNext ();
  56. Assert.IsNotNull (item, "#5");
  57. Assert.AreEqual (1, x, "#5");
  58. dis.Dispose ();
  59. }
  60. [Test]
  61. public void AdvanceByRaisesEvent2 ()
  62. {
  63. // This is actually very complicated pattern of error, caused by all of:
  64. // - Concat() when it internally uses SerialDisposable instead of CompositeDisposable.
  65. // - Delay() with non-zero duration.
  66. // - Delay() with non-CurrentThreadScheduler.
  67. var scheduler = new HistoricalScheduler ();
  68. var o = Observable.Empty<int> (scheduler).Delay (TimeSpan.FromSeconds (1), scheduler);
  69. bool done = false;
  70. Observable.Range (0, 3).Concat (o).Subscribe (v => {}, () => done = true);
  71. scheduler.AdvanceBy (TimeSpan.FromSeconds (2));
  72. Assert.IsTrue (done, "#1");
  73. }
  74. }
  75. }