DistinctUntilChangedTest.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  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.Reactive.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. namespace ReactiveTests.Tests
  10. {
  11. [TestClass]
  12. public class DistinctUntilChangedTest : ReactiveTest
  13. {
  14. [TestMethod]
  15. public void DistinctUntilChanged_ArgumentChecking()
  16. {
  17. var someObservable = Observable.Empty<int>();
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged<int>(null));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged(null, EqualityComparer<int>.Default));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged(someObservable, null));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged<int, int>(null, _ => _));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged<int, int>(someObservable, null));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged(someObservable, _ => _, null));
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged<int, int>(null, _ => _, EqualityComparer<int>.Default));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DistinctUntilChanged(someObservable, null, EqualityComparer<int>.Default));
  26. }
  27. [TestMethod]
  28. public void DistinctUntilChanged_Never()
  29. {
  30. var scheduler = new TestScheduler();
  31. var xs = Observable.Never<int>();
  32. var res = scheduler.Start(() =>
  33. xs.DistinctUntilChanged()
  34. );
  35. res.Messages.AssertEqual(
  36. );
  37. }
  38. [TestMethod]
  39. public void DistinctUntilChanged_Empty()
  40. {
  41. var scheduler = new TestScheduler();
  42. var xs = scheduler.CreateHotObservable(
  43. OnNext(150, 1),
  44. OnCompleted<int>(250)
  45. );
  46. var res = scheduler.Start(() =>
  47. xs.DistinctUntilChanged()
  48. );
  49. res.Messages.AssertEqual(
  50. OnCompleted<int>(250)
  51. );
  52. xs.Subscriptions.AssertEqual(
  53. Subscribe(200, 250)
  54. );
  55. }
  56. [TestMethod]
  57. public void DistinctUntilChanged_Return()
  58. {
  59. var scheduler = new TestScheduler();
  60. var xs = scheduler.CreateHotObservable(
  61. OnNext(150, 1),
  62. OnNext(220, 2),
  63. OnCompleted<int>(250)
  64. );
  65. var res = scheduler.Start(() =>
  66. xs.DistinctUntilChanged()
  67. );
  68. res.Messages.AssertEqual(
  69. OnNext(220, 2),
  70. OnCompleted<int>(250)
  71. );
  72. xs.Subscriptions.AssertEqual(
  73. Subscribe(200, 250)
  74. );
  75. }
  76. [TestMethod]
  77. public void DistinctUntilChanged_Throw()
  78. {
  79. var scheduler = new TestScheduler();
  80. var ex = new Exception();
  81. var xs = scheduler.CreateHotObservable(
  82. OnNext(150, 1),
  83. OnError<int>(250, ex)
  84. );
  85. var res = scheduler.Start(() =>
  86. xs.DistinctUntilChanged()
  87. );
  88. res.Messages.AssertEqual(
  89. OnError<int>(250, ex)
  90. );
  91. xs.Subscriptions.AssertEqual(
  92. Subscribe(200, 250)
  93. );
  94. }
  95. [TestMethod]
  96. public void DistinctUntilChanged_AllChanges()
  97. {
  98. var scheduler = new TestScheduler();
  99. var xs = scheduler.CreateHotObservable(
  100. OnNext(150, 1),
  101. OnNext(210, 2),
  102. OnNext(220, 3),
  103. OnNext(230, 4),
  104. OnNext(240, 5),
  105. OnCompleted<int>(250)
  106. );
  107. var res = scheduler.Start(() =>
  108. xs.DistinctUntilChanged()
  109. );
  110. res.Messages.AssertEqual(
  111. OnNext(210, 2),
  112. OnNext(220, 3),
  113. OnNext(230, 4),
  114. OnNext(240, 5),
  115. OnCompleted<int>(250)
  116. );
  117. xs.Subscriptions.AssertEqual(
  118. Subscribe(200, 250)
  119. );
  120. }
  121. [TestMethod]
  122. public void DistinctUntilChanged_AllSame()
  123. {
  124. var scheduler = new TestScheduler();
  125. var xs = scheduler.CreateHotObservable(
  126. OnNext(150, 1),
  127. OnNext(210, 2),
  128. OnNext(220, 2),
  129. OnNext(230, 2),
  130. OnNext(240, 2),
  131. OnCompleted<int>(250)
  132. );
  133. var res = scheduler.Start(() =>
  134. xs.DistinctUntilChanged()
  135. );
  136. res.Messages.AssertEqual(
  137. OnNext(210, 2),
  138. OnCompleted<int>(250)
  139. );
  140. xs.Subscriptions.AssertEqual(
  141. Subscribe(200, 250)
  142. );
  143. }
  144. [TestMethod]
  145. public void DistinctUntilChanged_SomeChanges()
  146. {
  147. var scheduler = new TestScheduler();
  148. var xs = scheduler.CreateHotObservable(
  149. OnNext(150, 1),
  150. OnNext(210, 2), //*
  151. OnNext(215, 3), //*
  152. OnNext(220, 3),
  153. OnNext(225, 2), //*
  154. OnNext(230, 2),
  155. OnNext(230, 1), //*
  156. OnNext(240, 2), //*
  157. OnCompleted<int>(250)
  158. );
  159. var res = scheduler.Start(() =>
  160. xs.DistinctUntilChanged()
  161. );
  162. res.Messages.AssertEqual(
  163. OnNext(210, 2),
  164. OnNext(215, 3),
  165. OnNext(225, 2),
  166. OnNext(230, 1),
  167. OnNext(240, 2),
  168. OnCompleted<int>(250)
  169. );
  170. xs.Subscriptions.AssertEqual(
  171. Subscribe(200, 250)
  172. );
  173. }
  174. [TestMethod]
  175. public void DistinctUntilChanged_Comparer_AllEqual()
  176. {
  177. var scheduler = new TestScheduler();
  178. var xs = scheduler.CreateHotObservable(
  179. OnNext(150, 1),
  180. OnNext(210, 2),
  181. OnNext(220, 3),
  182. OnNext(230, 4),
  183. OnNext(240, 5),
  184. OnCompleted<int>(250)
  185. );
  186. var res = scheduler.Start(() =>
  187. xs.DistinctUntilChanged(new FuncComparer<int>((x, y) => true))
  188. );
  189. res.Messages.AssertEqual(
  190. OnNext(210, 2),
  191. OnCompleted<int>(250)
  192. );
  193. xs.Subscriptions.AssertEqual(
  194. Subscribe(200, 250)
  195. );
  196. }
  197. [TestMethod]
  198. public void DistinctUntilChanged_Comparer_AllDifferent()
  199. {
  200. var scheduler = new TestScheduler();
  201. var xs = scheduler.CreateHotObservable(
  202. OnNext(150, 1),
  203. OnNext(210, 2),
  204. OnNext(220, 2),
  205. OnNext(230, 2),
  206. OnNext(240, 2),
  207. OnCompleted<int>(250)
  208. );
  209. var res = scheduler.Start(() =>
  210. xs.DistinctUntilChanged(new FuncComparer<int>((x, y) => false))
  211. );
  212. res.Messages.AssertEqual(
  213. OnNext(210, 2),
  214. OnNext(220, 2),
  215. OnNext(230, 2),
  216. OnNext(240, 2),
  217. OnCompleted<int>(250)
  218. );
  219. xs.Subscriptions.AssertEqual(
  220. Subscribe(200, 250)
  221. );
  222. }
  223. [TestMethod]
  224. public void DistinctUntilChanged_KeySelector_Div2()
  225. {
  226. var scheduler = new TestScheduler();
  227. var xs = scheduler.CreateHotObservable(
  228. OnNext(150, 1),
  229. OnNext(210, 2), //*
  230. OnNext(220, 4),
  231. OnNext(230, 3), //*
  232. OnNext(240, 5),
  233. OnCompleted<int>(250)
  234. );
  235. var res = scheduler.Start(() =>
  236. xs.DistinctUntilChanged(x => x % 2)
  237. );
  238. res.Messages.AssertEqual(
  239. OnNext(210, 2),
  240. OnNext(230, 3),
  241. OnCompleted<int>(250)
  242. );
  243. xs.Subscriptions.AssertEqual(
  244. Subscribe(200, 250)
  245. );
  246. }
  247. private class FuncComparer<T> : IEqualityComparer<T>
  248. {
  249. private readonly Func<T, T, bool> _equals;
  250. public FuncComparer(Func<T, T, bool> equals)
  251. {
  252. _equals = equals;
  253. }
  254. public bool Equals(T x, T y)
  255. {
  256. return _equals(x, y);
  257. }
  258. public int GetHashCode(T obj)
  259. {
  260. return 0;
  261. }
  262. }
  263. [TestMethod]
  264. public void DistinctUntilChanged_KeySelectorThrows()
  265. {
  266. var ex = new Exception();
  267. var scheduler = new TestScheduler();
  268. var xs = scheduler.CreateHotObservable(
  269. OnNext(150, 1),
  270. OnNext(210, 2),
  271. OnCompleted<int>(250)
  272. );
  273. var res = scheduler.Start(() =>
  274. xs.DistinctUntilChanged(new Func<int, int>(x => { throw ex; }))
  275. );
  276. res.Messages.AssertEqual(
  277. OnError<int>(210, ex)
  278. );
  279. }
  280. [TestMethod]
  281. public void DistinctUntilChanged_ComparerThrows()
  282. {
  283. var ex = new Exception();
  284. var scheduler = new TestScheduler();
  285. var xs = scheduler.CreateHotObservable(
  286. OnNext(150, 1),
  287. OnNext(210, 2),
  288. OnNext(220, 3),
  289. OnCompleted<int>(250)
  290. );
  291. var res = scheduler.Start(() =>
  292. xs.DistinctUntilChanged(new ThrowComparer<int>(ex))
  293. );
  294. res.Messages.AssertEqual(
  295. OnNext(210, 2),
  296. OnError<int>(220, ex)
  297. );
  298. }
  299. private class ThrowComparer<T> : IEqualityComparer<T>
  300. {
  301. private readonly Exception _ex;
  302. public ThrowComparer(Exception ex)
  303. {
  304. _ex = ex;
  305. }
  306. public bool Equals(T x, T y)
  307. {
  308. throw _ex;
  309. }
  310. public int GetHashCode(T obj)
  311. {
  312. return 0;
  313. }
  314. }
  315. [TestMethod]
  316. public void DistinctUntilChanged_KeySelector_Comparer()
  317. {
  318. var scheduler = new TestScheduler();
  319. var xs = scheduler.CreateHotObservable(
  320. OnNext(150, 1),
  321. OnNext(210, 2), // * key = 1 % 3 = 1
  322. OnNext(220, 8), // key = 4 % 3 = 1 same
  323. OnNext(230, 2), // key = 1 % 3 = 1 same
  324. OnNext(240, 5), // * key = 2 % 3 = 2
  325. OnCompleted<int>(250)
  326. );
  327. var res = scheduler.Start(() =>
  328. xs.DistinctUntilChanged(x => x / 2, new FuncComparer<int>((x, y) => x % 3 == y % 3))
  329. );
  330. res.Messages.AssertEqual(
  331. OnNext(210, 2),
  332. OnNext(240, 5),
  333. OnCompleted<int>(250)
  334. );
  335. xs.Subscriptions.AssertEqual(
  336. Subscribe(200, 250)
  337. );
  338. }
  339. }
  340. }