GetEnumeratorTest.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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.Reactive.Disposables;
  17. namespace ReactiveTests.Tests
  18. {
  19. public class GetEnumeratorTest : ReactiveTest
  20. {
  21. [Fact]
  22. public void GetEnumerator_ArgumentChecking()
  23. {
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GetEnumerator(default(IObservable<int>)));
  25. }
  26. [Fact]
  27. public void GetEnumerator_Regular1()
  28. {
  29. var scheduler = new TestScheduler();
  30. var xs = scheduler.CreateColdObservable<int>(
  31. OnNext(10, 2),
  32. OnNext(20, 3),
  33. OnNext(30, 5),
  34. OnNext(40, 7),
  35. OnCompleted<int>(50)
  36. );
  37. var res = default(IEnumerator<int>);
  38. scheduler.ScheduleAbsolute(default(object), 100, (self, _) => { res = xs.GetEnumerator(); return Disposable.Empty; });
  39. var hasNext = new List<bool>();
  40. var vals = new List<Tuple<long, int>>();
  41. for (long i = 200; i <= 250; i += 10)
  42. {
  43. var t = i;
  44. scheduler.ScheduleAbsolute(default(object), t, (self, _) =>
  45. {
  46. var b = res.MoveNext();
  47. hasNext.Add(b);
  48. if (b)
  49. vals.Add(new Tuple<long, int>(scheduler.Clock, res.Current));
  50. return Disposable.Empty;
  51. });
  52. }
  53. scheduler.Start();
  54. xs.Subscriptions.AssertEqual(
  55. Subscribe(100, 150)
  56. );
  57. Assert.Equal(6, hasNext.Count);
  58. Assert.True(hasNext.Take(4).All(_ => _));
  59. Assert.True(hasNext.Skip(4).All(_ => !_));
  60. Assert.Equal(4, vals.Count);
  61. Assert.True(vals[0].Item1 == 200 && vals[0].Item2 == 2);
  62. Assert.True(vals[1].Item1 == 210 && vals[1].Item2 == 3);
  63. Assert.True(vals[2].Item1 == 220 && vals[2].Item2 == 5);
  64. Assert.True(vals[3].Item1 == 230 && vals[3].Item2 == 7);
  65. }
  66. [Fact]
  67. public void GetEnumerator_Regular2()
  68. {
  69. var scheduler = new TestScheduler();
  70. var xs = scheduler.CreateColdObservable<int>(
  71. OnNext(10, 2),
  72. OnNext(30, 3),
  73. OnNext(50, 5),
  74. OnNext(70, 7),
  75. OnCompleted<int>(90)
  76. );
  77. var res = default(IEnumerator<int>);
  78. scheduler.ScheduleAbsolute(default(object), 100, (self, _) => { res = xs.GetEnumerator(); return Disposable.Empty; });
  79. var hasNext = new List<bool>();
  80. var vals = new List<Tuple<long, int>>();
  81. for (long i = 120; i <= 220; i += 20)
  82. {
  83. var t = i;
  84. scheduler.ScheduleAbsolute(default(object), t, (self, _) =>
  85. {
  86. var b = res.MoveNext();
  87. hasNext.Add(b);
  88. if (b)
  89. vals.Add(new Tuple<long, int>(scheduler.Clock, res.Current));
  90. return Disposable.Empty;
  91. });
  92. }
  93. scheduler.Start();
  94. xs.Subscriptions.AssertEqual(
  95. Subscribe(100, 190)
  96. );
  97. Assert.Equal(6, hasNext.Count);
  98. Assert.True(hasNext.Take(4).All(_ => _));
  99. Assert.True(hasNext.Skip(4).All(_ => !_));
  100. Assert.Equal(4, vals.Count);
  101. Assert.True(vals[0].Item1 == 120 && vals[0].Item2 == 2);
  102. Assert.True(vals[1].Item1 == 140 && vals[1].Item2 == 3);
  103. Assert.True(vals[2].Item1 == 160 && vals[2].Item2 == 5);
  104. Assert.True(vals[3].Item1 == 180 && vals[3].Item2 == 7);
  105. }
  106. [Fact]
  107. public void GetEnumerator_Dispose()
  108. {
  109. var scheduler = new TestScheduler();
  110. var xs = scheduler.CreateColdObservable<int>(
  111. OnNext(10, 2),
  112. OnNext(30, 3),
  113. OnNext(50, 5),
  114. OnNext(70, 7),
  115. OnCompleted<int>(90)
  116. );
  117. var res = default(IEnumerator<int>);
  118. scheduler.ScheduleAbsolute(default(object), 100, (self, _) => { res = xs.GetEnumerator(); return Disposable.Empty; });
  119. scheduler.ScheduleAbsolute(default(object), 140, (self, _) =>
  120. {
  121. Assert.True(res.MoveNext());
  122. Assert.Equal(2, res.Current);
  123. Assert.True(res.MoveNext());
  124. Assert.Equal(3, res.Current);
  125. res.Dispose();
  126. return Disposable.Empty;
  127. });
  128. scheduler.ScheduleAbsolute(default(object), 160, (self, _) =>
  129. {
  130. ReactiveAssert.Throws<ObjectDisposedException>(() => res.MoveNext());
  131. return Disposable.Empty;
  132. });
  133. scheduler.Start();
  134. xs.Subscriptions.AssertEqual(
  135. Subscribe(100, 140)
  136. );
  137. }
  138. }
  139. }