IntervalTest.cs 3.8 KB

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