ChunkifyTest.cs 5.6 KB

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