GetEnumeratorTest.cs 5.4 KB

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