ChunkifyTest.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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.Concurrency;
  8. using System.Reactive.Linq;
  9. using Microsoft.Reactive.Testing;
  10. using Microsoft.VisualStudio.TestTools.UnitTesting;
  11. using Assert = Xunit.Assert;
  12. namespace ReactiveTests.Tests
  13. {
  14. [TestClass]
  15. public class ChunkifyTest : ReactiveTest
  16. {
  17. [TestMethod]
  18. public void Chunkify_ArgumentChecking()
  19. {
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Chunkify(default(IObservable<int>)));
  21. }
  22. [TestMethod]
  23. public void Chunkify_Regular1()
  24. {
  25. var scheduler = new TestScheduler();
  26. var xs = scheduler.CreateHotObservable(
  27. OnNext(100, 1),
  28. OnNext(200, 2),
  29. OnNext(300, 3),
  30. OnNext(400, 4),
  31. OnNext(500, 5),
  32. OnNext(600, 6),
  33. OnNext(700, 7),
  34. OnNext(800, 8),
  35. OnCompleted<int>(900)
  36. );
  37. var ys = xs.Chunkify();
  38. var e = default(IEnumerator<IList<int>>);
  39. var res = new List<IList<int>>();
  40. var log = new Action(() =>
  41. {
  42. Assert.True(e.MoveNext());
  43. res.Add(e.Current);
  44. });
  45. scheduler.ScheduleAbsolute(250, () => { e = ys.GetEnumerator(); });
  46. scheduler.ScheduleAbsolute(270, log);
  47. scheduler.ScheduleAbsolute(310, log);
  48. scheduler.ScheduleAbsolute(450, log);
  49. scheduler.ScheduleAbsolute(470, log);
  50. scheduler.ScheduleAbsolute(750, log);
  51. scheduler.ScheduleAbsolute(850, log);
  52. scheduler.ScheduleAbsolute(950, log);
  53. scheduler.ScheduleAbsolute(980, () => Assert.False(e.MoveNext()));
  54. scheduler.Start();
  55. xs.Subscriptions.AssertEqual(
  56. Subscribe(250, 900)
  57. );
  58. Assert.Equal(7, res.Count);
  59. Assert.True(res[0].SequenceEqual(new int[] { }));
  60. Assert.True(res[1].SequenceEqual(new int[] { 3 }));
  61. Assert.True(res[2].SequenceEqual(new int[] { 4 }));
  62. Assert.True(res[3].SequenceEqual(new int[] { }));
  63. Assert.True(res[4].SequenceEqual(new int[] { 5, 6, 7 }));
  64. Assert.True(res[5].SequenceEqual(new int[] { 8 }));
  65. Assert.True(res[6].SequenceEqual(new int[] { }));
  66. }
  67. [TestMethod]
  68. public void Chunkify_Regular2()
  69. {
  70. var scheduler = new TestScheduler();
  71. var xs = scheduler.CreateHotObservable(
  72. OnNext(100, 1),
  73. OnNext(200, 2),
  74. OnNext(300, 3),
  75. OnNext(400, 4),
  76. OnNext(500, 5),
  77. OnNext(600, 6),
  78. OnNext(700, 7),
  79. OnNext(800, 8),
  80. OnCompleted<int>(900)
  81. );
  82. var ys = xs.Chunkify();
  83. var e = default(IEnumerator<IList<int>>);
  84. var res = new List<IList<int>>();
  85. var log = new Action(() =>
  86. {
  87. Assert.True(e.MoveNext());
  88. res.Add(e.Current);
  89. });
  90. scheduler.ScheduleAbsolute(250, () => { e = ys.GetEnumerator(); });
  91. scheduler.ScheduleAbsolute(550, log);
  92. scheduler.ScheduleAbsolute(950, log);
  93. scheduler.ScheduleAbsolute(980, () => Assert.False(e.MoveNext()));
  94. scheduler.Start();
  95. xs.Subscriptions.AssertEqual(
  96. Subscribe(250, 900)
  97. );
  98. Assert.Equal(2, res.Count);
  99. Assert.True(res[0].SequenceEqual(new int[] { 3, 4, 5 }));
  100. Assert.True(res[1].SequenceEqual(new int[] { 6, 7, 8 }));
  101. }
  102. [TestMethod]
  103. public void Chunkify_Error()
  104. {
  105. var ex = new Exception();
  106. var scheduler = new TestScheduler();
  107. var xs = scheduler.CreateHotObservable(
  108. OnNext(100, 1),
  109. OnNext(200, 2),
  110. OnNext(300, 3),
  111. OnNext(400, 4),
  112. OnNext(500, 5),
  113. OnNext(600, 6),
  114. OnError<int>(700, ex)
  115. );
  116. var ys = xs.Chunkify();
  117. var e = default(IEnumerator<IList<int>>);
  118. var res = new List<IList<int>>();
  119. var log = new Action(() =>
  120. {
  121. Assert.True(e.MoveNext());
  122. res.Add(e.Current);
  123. });
  124. scheduler.ScheduleAbsolute(250, () => { e = ys.GetEnumerator(); });
  125. scheduler.ScheduleAbsolute(270, log);
  126. scheduler.ScheduleAbsolute(310, log);
  127. scheduler.ScheduleAbsolute(450, log);
  128. scheduler.ScheduleAbsolute(470, log);
  129. scheduler.ScheduleAbsolute(750, () =>
  130. {
  131. try
  132. {
  133. e.MoveNext();
  134. Assert.True(false);
  135. }
  136. catch (Exception error)
  137. {
  138. Assert.Same(ex, error);
  139. }
  140. });
  141. scheduler.Start();
  142. xs.Subscriptions.AssertEqual(
  143. Subscribe(250, 700)
  144. );
  145. Assert.Equal(4, res.Count);
  146. Assert.True(res[0].SequenceEqual(new int[] { }));
  147. Assert.True(res[1].SequenceEqual(new int[] { 3 }));
  148. Assert.True(res[2].SequenceEqual(new int[] { 4 }));
  149. Assert.True(res[3].SequenceEqual(new int[] { }));
  150. }
  151. }
  152. }