GetEnumeratorTest.cs 5.3 KB

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