ContainsTest.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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.Linq;
  8. using Microsoft.Reactive.Testing;
  9. using ReactiveTests.Dummies;
  10. using Xunit;
  11. namespace ReactiveTests.Tests
  12. {
  13. public class ContainsTest : ReactiveTest
  14. {
  15. [Fact]
  16. public void Contains_ArgumentChecking()
  17. {
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(default, 42));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(default, 42, EqualityComparer<int>.Default));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(DummyObservable<int>.Instance, 42, null));
  21. }
  22. [Fact]
  23. public void Contains_Empty()
  24. {
  25. var scheduler = new TestScheduler();
  26. var xs = scheduler.CreateHotObservable(
  27. OnNext(150, 1),
  28. OnCompleted<int>(250)
  29. );
  30. var res = scheduler.Start(() =>
  31. xs.Contains(42)
  32. );
  33. res.Messages.AssertEqual(
  34. OnNext(250, false),
  35. OnCompleted<bool>(250)
  36. );
  37. xs.Subscriptions.AssertEqual(
  38. Subscribe(200, 250)
  39. );
  40. }
  41. [Fact]
  42. public void Contains_ReturnPositive()
  43. {
  44. var scheduler = new TestScheduler();
  45. var xs = scheduler.CreateHotObservable(
  46. OnNext(150, 1),
  47. OnNext(210, 2),
  48. OnCompleted<int>(250)
  49. );
  50. var res = scheduler.Start(() =>
  51. xs.Contains(2)
  52. );
  53. res.Messages.AssertEqual(
  54. OnNext(210, true),
  55. OnCompleted<bool>(210)
  56. );
  57. xs.Subscriptions.AssertEqual(
  58. Subscribe(200, 210)
  59. );
  60. }
  61. [Fact]
  62. public void Contains_ReturnNegative()
  63. {
  64. var scheduler = new TestScheduler();
  65. var xs = scheduler.CreateHotObservable(
  66. OnNext(150, 1),
  67. OnNext(210, 2),
  68. OnCompleted<int>(250)
  69. );
  70. var res = scheduler.Start(() =>
  71. xs.Contains(-2)
  72. );
  73. res.Messages.AssertEqual(
  74. OnNext(250, false),
  75. OnCompleted<bool>(250)
  76. );
  77. xs.Subscriptions.AssertEqual(
  78. Subscribe(200, 250)
  79. );
  80. }
  81. [Fact]
  82. public void Contains_SomePositive()
  83. {
  84. var scheduler = new TestScheduler();
  85. var xs = scheduler.CreateHotObservable(
  86. OnNext(150, 1),
  87. OnNext(210, 2),
  88. OnNext(220, 3),
  89. OnNext(230, 4),
  90. OnCompleted<int>(250)
  91. );
  92. var res = scheduler.Start(() =>
  93. xs.Contains(3)
  94. );
  95. res.Messages.AssertEqual(
  96. OnNext(220, true),
  97. OnCompleted<bool>(220)
  98. );
  99. xs.Subscriptions.AssertEqual(
  100. Subscribe(200, 220)
  101. );
  102. }
  103. [Fact]
  104. public void Contains_SomeNegative()
  105. {
  106. var scheduler = new TestScheduler();
  107. var xs = scheduler.CreateHotObservable(
  108. OnNext(150, 1),
  109. OnNext(210, 2),
  110. OnNext(220, 3),
  111. OnNext(230, 4),
  112. OnCompleted<int>(250)
  113. );
  114. var res = scheduler.Start(() =>
  115. xs.Contains(-3)
  116. );
  117. res.Messages.AssertEqual(
  118. OnNext(250, false),
  119. OnCompleted<bool>(250)
  120. );
  121. xs.Subscriptions.AssertEqual(
  122. Subscribe(200, 250)
  123. );
  124. }
  125. [Fact]
  126. public void Contains_Throw()
  127. {
  128. var ex = new Exception();
  129. var scheduler = new TestScheduler();
  130. var xs = scheduler.CreateHotObservable(
  131. OnNext(150, 1),
  132. OnError<int>(210, ex)
  133. );
  134. var res = scheduler.Start(() =>
  135. xs.Contains(42)
  136. );
  137. res.Messages.AssertEqual(
  138. OnError<bool>(210, ex)
  139. );
  140. xs.Subscriptions.AssertEqual(
  141. Subscribe(200, 210)
  142. );
  143. }
  144. [Fact]
  145. public void Contains_Never()
  146. {
  147. var ex = new Exception();
  148. var scheduler = new TestScheduler();
  149. var xs = scheduler.CreateHotObservable(
  150. OnNext(150, 1)
  151. );
  152. var res = scheduler.Start(() =>
  153. xs.Contains(42)
  154. );
  155. res.Messages.AssertEqual(
  156. );
  157. xs.Subscriptions.AssertEqual(
  158. Subscribe(200, 1000)
  159. );
  160. }
  161. [Fact]
  162. public void Contains_ComparerThrows()
  163. {
  164. var ex = new Exception();
  165. var scheduler = new TestScheduler();
  166. var xs = scheduler.CreateHotObservable(
  167. OnNext(150, 1),
  168. OnNext(210, 2)
  169. );
  170. var res = scheduler.Start(() =>
  171. xs.Contains(42, new ContainsComparerThrows())
  172. );
  173. res.Messages.AssertEqual(
  174. OnError<bool>(210, e => e is NotImplementedException)
  175. );
  176. xs.Subscriptions.AssertEqual(
  177. Subscribe(200, 210)
  178. );
  179. }
  180. private class ContainsComparerThrows : IEqualityComparer<int>
  181. {
  182. public bool Equals(int x, int y)
  183. {
  184. throw new NotImplementedException();
  185. }
  186. public int GetHashCode(int obj)
  187. {
  188. throw new NotImplementedException();
  189. }
  190. }
  191. [Fact]
  192. public void Contains_ComparerContainsValue()
  193. {
  194. var ex = new Exception();
  195. var scheduler = new TestScheduler();
  196. var xs = scheduler.CreateHotObservable(
  197. OnNext(150, 1),
  198. OnNext(210, 3),
  199. OnNext(220, 4),
  200. OnNext(230, 8),
  201. OnCompleted<int>(250)
  202. );
  203. var res = scheduler.Start(() =>
  204. xs.Contains(42, new ContainsComparerMod2())
  205. );
  206. res.Messages.AssertEqual(
  207. OnNext(220, true),
  208. OnCompleted<bool>(220)
  209. );
  210. xs.Subscriptions.AssertEqual(
  211. Subscribe(200, 220)
  212. );
  213. }
  214. [Fact]
  215. public void Contains_ComparerDoesNotContainValue()
  216. {
  217. var ex = new Exception();
  218. var scheduler = new TestScheduler();
  219. var xs = scheduler.CreateHotObservable(
  220. OnNext(150, 1),
  221. OnNext(210, 2),
  222. OnNext(220, 4),
  223. OnNext(230, 8),
  224. OnCompleted<int>(250)
  225. );
  226. var res = scheduler.Start(() =>
  227. xs.Contains(21, new ContainsComparerMod2())
  228. );
  229. res.Messages.AssertEqual(
  230. OnNext(250, false),
  231. OnCompleted<bool>(250)
  232. );
  233. xs.Subscriptions.AssertEqual(
  234. Subscribe(200, 250)
  235. );
  236. }
  237. private class ContainsComparerMod2 : IEqualityComparer<int>
  238. {
  239. public bool Equals(int x, int y)
  240. {
  241. return x % 2 == y % 2;
  242. }
  243. public int GetHashCode(int obj)
  244. {
  245. return obj.GetHashCode();
  246. }
  247. }
  248. }
  249. }