IntervalTest.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Linq;
  6. using System.Reactive.Linq;
  7. using System.Threading;
  8. using Microsoft.Reactive.Testing;
  9. using ReactiveTests.Dummies;
  10. using Xunit;
  11. namespace ReactiveTests.Tests
  12. {
  13. public class IntervalTest : ReactiveTest
  14. {
  15. [Fact]
  16. public void Interval_TimeSpan_ArgumentChecking()
  17. {
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Interval(TimeSpan.Zero, null));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Interval(TimeSpan.Zero, DummyScheduler.Instance).Subscribe(null));
  20. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Interval(TimeSpan.FromSeconds(-1)));
  21. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Interval(TimeSpan.FromSeconds(-1), DummyScheduler.Instance));
  22. }
  23. [Fact]
  24. public void Interval_TimeSpan_Basic()
  25. {
  26. var scheduler = new TestScheduler();
  27. var res = scheduler.Start(() =>
  28. Observable.Interval(TimeSpan.FromTicks(100), scheduler)
  29. );
  30. res.Messages.AssertEqual(
  31. OnNext(300, 0L),
  32. OnNext(400, 1L),
  33. OnNext(500, 2L),
  34. OnNext(600, 3L),
  35. OnNext(700, 4L),
  36. OnNext(800, 5L),
  37. OnNext(900, 6L)
  38. );
  39. }
  40. [Fact]
  41. public void Interval_TimeSpan_Zero()
  42. {
  43. var scheduler = new TestScheduler();
  44. var res = scheduler.Start(() =>
  45. Observable.Interval(TimeSpan.FromTicks(0), scheduler),
  46. 210
  47. );
  48. res.Messages.AssertEqual(
  49. OnNext(201, 0L),
  50. OnNext(202, 1L),
  51. OnNext(203, 2L),
  52. OnNext(204, 3L),
  53. OnNext(205, 4L),
  54. OnNext(206, 5L),
  55. OnNext(207, 6L),
  56. OnNext(208, 7L),
  57. OnNext(209, 8L)
  58. );
  59. }
  60. [Fact]
  61. public void Interval_TimeSpan_Zero_DefaultScheduler()
  62. {
  63. var scheduler = new TestScheduler();
  64. var observer = scheduler.CreateObserver<long>();
  65. var completed = new ManualResetEvent(false);
  66. Observable.Interval(TimeSpan.Zero).TakeWhile(i => i < 10).Subscribe(observer.OnNext, () => completed.Set());
  67. completed.WaitOne();
  68. Assert.Equal(10, observer.Messages.Count);
  69. }
  70. [Fact]
  71. public void Interval_TimeSpan_Disposed()
  72. {
  73. var scheduler = new TestScheduler();
  74. var res = scheduler.Start(
  75. () => Observable.Interval(TimeSpan.FromTicks(1000), scheduler)
  76. );
  77. res.Messages.AssertEqual(
  78. );
  79. }
  80. [Fact]
  81. public void Interval_TimeSpan_ObserverThrows()
  82. {
  83. var scheduler = new TestScheduler();
  84. var xs = Observable.Interval(TimeSpan.FromTicks(1), scheduler);
  85. xs.Subscribe(x => { throw new InvalidOperationException(); });
  86. ReactiveAssert.Throws<InvalidOperationException>(() => scheduler.Start());
  87. }
  88. [Fact]
  89. public void Interval_TimeSpan_DefaultScheduler()
  90. {
  91. Assert.True(Observable.Interval(TimeSpan.FromMilliseconds(1)).ToEnumerable().Take(3).SequenceEqual(new[] { 0L, 1L, 2L }));
  92. }
  93. }
  94. }