ListObservableTest.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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;
  6. using System.Collections.Generic;
  7. using System.Reactive;
  8. using System.Reactive.Concurrency;
  9. using System.Reactive.Linq;
  10. using Microsoft.Reactive.Testing;
  11. using Xunit;
  12. namespace ReactiveTests.Tests
  13. {
  14. public partial class ListObservableTest : ReactiveTest
  15. {
  16. [Fact]
  17. public void Ctor_ArgumentChecking()
  18. {
  19. ReactiveAssert.Throws<ArgumentNullException>(() => new ListObservable<int>(null));
  20. }
  21. [Fact]
  22. public void Subscribe_ArgumentChecking()
  23. {
  24. ReactiveAssert.Throws<ArgumentNullException>(() => new ListObservable<int>(Observable.Never<int>()).Subscribe(null));
  25. }
  26. [Fact]
  27. public void Value_None()
  28. {
  29. var o = new ListObservable<int>(Observable.Empty<int>());
  30. ReactiveAssert.Throws<InvalidOperationException>(() => { var t = o.Value; });
  31. }
  32. [Fact]
  33. public void Value_Some()
  34. {
  35. var o = new ListObservable<int>(Observable.Range(0, 10));
  36. Assert.Equal(9, o.Value);
  37. }
  38. [Fact]
  39. public void IndexOf_None()
  40. {
  41. var o = new ListObservable<int>(Observable.Empty<int>());
  42. Assert.Equal(-1, o.IndexOf(0));
  43. }
  44. [Fact]
  45. public void IndexOf_Some_NotFound()
  46. {
  47. var o = new ListObservable<int>(Observable.Range(0, 10));
  48. Assert.Equal(-1, o.IndexOf(100));
  49. }
  50. [Fact]
  51. public void IndexOf_Some_Found()
  52. {
  53. var o = new ListObservable<int>(Observable.Range(0, 10));
  54. Assert.Equal(3, o.IndexOf(3));
  55. }
  56. [Fact]
  57. public void RemoveAt_Some_NotFound()
  58. {
  59. var o = new ListObservable<int>(Observable.Range(0, 10));
  60. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => o.RemoveAt(100));
  61. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  62. }
  63. [Fact]
  64. public void RemoveAt_Some_Found()
  65. {
  66. var o = new ListObservable<int>(Observable.Range(0, 10));
  67. o.RemoveAt(3);
  68. o.AssertEqual(0, 1, 2, 4, 5, 6, 7, 8, 9);
  69. }
  70. [Fact]
  71. public void Insert_Invalid()
  72. {
  73. var o = new ListObservable<int>(Observable.Range(0, 10));
  74. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => o.Insert(100, 100));
  75. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  76. }
  77. [Fact]
  78. public void Insert_Invalid_2()
  79. {
  80. var o = new ListObservable<int>(Observable.Range(0, 10));
  81. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => o.Insert(-1, 100));
  82. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  83. }
  84. [Fact]
  85. public void Insert_Beginning()
  86. {
  87. var o = new ListObservable<int>(Observable.Range(0, 10));
  88. o.Insert(0, -1);
  89. o.AssertEqual(-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  90. }
  91. [Fact]
  92. public void Insert_Middle()
  93. {
  94. var o = new ListObservable<int>(Observable.Range(0, 10));
  95. o.Insert(3, -1);
  96. o.AssertEqual(0, 1, 2, -1, 3, 4, 5, 6, 7, 8, 9);
  97. }
  98. [Fact]
  99. public void Change_Beginning()
  100. {
  101. var o = new ListObservable<int>(Observable.Range(0, 10))
  102. {
  103. [0] = -1
  104. };
  105. o.AssertEqual(-1, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  106. }
  107. [Fact]
  108. public void Change_Middle()
  109. {
  110. var o = new ListObservable<int>(Observable.Range(0, 10))
  111. {
  112. [5] = -1
  113. };
  114. o.AssertEqual(0, 1, 2, 3, 4, -1, 6, 7, 8, 9);
  115. }
  116. [Fact]
  117. public void Change_End()
  118. {
  119. var o = new ListObservable<int>(Observable.Range(0, 10))
  120. {
  121. [9] = -1
  122. };
  123. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, -1);
  124. }
  125. [Fact]
  126. public void Change_Error()
  127. {
  128. var o = new ListObservable<int>(Observable.Range(0, 10));
  129. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => o[100] = -1);
  130. }
  131. [Fact]
  132. public void Insert_End()
  133. {
  134. var o = new ListObservable<int>(Observable.Range(0, 10));
  135. o.Insert(10, -1);
  136. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1);
  137. }
  138. [Fact]
  139. public void Contains_None()
  140. {
  141. var o = new ListObservable<int>(Observable.Empty<int>());
  142. Assert.Equal(false, o.Contains(0));
  143. }
  144. [Fact]
  145. public void Contains_Some_NotFound()
  146. {
  147. var o = new ListObservable<int>(Observable.Range(0, 10));
  148. Assert.Equal(false, o.Contains(100));
  149. }
  150. [Fact]
  151. public void Contains_Some_Found()
  152. {
  153. var o = new ListObservable<int>(Observable.Range(0, 10));
  154. Assert.Equal(true, o.Contains(3));
  155. }
  156. [Fact]
  157. public void Clear()
  158. {
  159. var o = new ListObservable<int>(Observable.Range(0, 10));
  160. o.Clear();
  161. o.AssertEqual();
  162. }
  163. [Fact]
  164. public void IsReadOnly()
  165. {
  166. var o = new ListObservable<int>(Observable.Never<int>());
  167. Assert.Equal(false, o.IsReadOnly);
  168. }
  169. [Fact]
  170. public void This_None()
  171. {
  172. var o = new ListObservable<int>(Observable.Empty<int>());
  173. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => { var t = o[0]; });
  174. }
  175. [Fact]
  176. public void This_Some_NotFound()
  177. {
  178. var o = new ListObservable<int>(Observable.Range(0, 10));
  179. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => { var t = o[100]; });
  180. }
  181. [Fact]
  182. public void This_Some_Found()
  183. {
  184. var o = new ListObservable<int>(Observable.Range(0, 10));
  185. Assert.Equal(5, o[5]);
  186. }
  187. [Fact]
  188. public void CopyTo_RightSize()
  189. {
  190. var o = new ListObservable<int>(Observable.Range(0, 10));
  191. var array = new int[10];
  192. o.CopyTo(array, 0);
  193. array.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  194. }
  195. [Fact]
  196. public void CopyTo_RightSize_Offset()
  197. {
  198. var o = new ListObservable<int>(Observable.Range(0, 10));
  199. var array = new int[10];
  200. ReactiveAssert.Throws<ArgumentException>(() => o.CopyTo(array, 3));
  201. }
  202. [Fact]
  203. public void CopyTo_Bigger()
  204. {
  205. var o = new ListObservable<int>(Observable.Range(0, 10));
  206. var array = new int[15];
  207. o.CopyTo(array, 0);
  208. array.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0);
  209. }
  210. [Fact]
  211. public void CopyTo_Bigger_Offset()
  212. {
  213. var o = new ListObservable<int>(Observable.Range(0, 10));
  214. var array = new int[15];
  215. o.CopyTo(array, 3);
  216. array.AssertEqual(0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0);
  217. }
  218. [Fact]
  219. public void CopyTo_Smaller()
  220. {
  221. var o = new ListObservable<int>(Observable.Range(0, 10));
  222. var array = new int[5];
  223. ReactiveAssert.Throws<ArgumentException>(() => o.CopyTo(array, 0));
  224. }
  225. [Fact]
  226. public void CopyTo_Smaller_Offset()
  227. {
  228. var o = new ListObservable<int>(Observable.Range(0, 10));
  229. var array = new int[5];
  230. ReactiveAssert.Throws<ArgumentException>(() => o.CopyTo(array, 3));
  231. }
  232. [Fact]
  233. public void Add_Empty()
  234. {
  235. var o = new ListObservable<int>(Observable.Empty<int>())
  236. {
  237. 100
  238. };
  239. o.AssertEqual(100);
  240. }
  241. [Fact]
  242. public void Add_Some()
  243. {
  244. var o = new ListObservable<int>(Observable.Return(200))
  245. {
  246. 100
  247. };
  248. o.AssertEqual(200, 100);
  249. }
  250. [Fact]
  251. public void Remove_None()
  252. {
  253. var o = new ListObservable<int>(Observable.Empty<int>());
  254. Assert.Equal(false, o.Remove(0));
  255. o.AssertEqual();
  256. }
  257. [Fact]
  258. public void Remove_Some_NotFound()
  259. {
  260. var o = new ListObservable<int>(Observable.Range(0, 10));
  261. Assert.Equal(false, o.Remove(100));
  262. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  263. }
  264. [Fact]
  265. public void Remove_Some_Found()
  266. {
  267. var o = new ListObservable<int>(Observable.Range(0, 10));
  268. Assert.Equal(true, o.Remove(3));
  269. o.AssertEqual(0, 1, 2, 4, 5, 6, 7, 8, 9);
  270. }
  271. [Fact]
  272. public void ForEach()
  273. {
  274. var o = new ListObservable<int>(Observable.Range(0, 10));
  275. var l = new List<int>();
  276. foreach (var x in o)
  277. {
  278. l.Add(x);
  279. }
  280. l.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  281. }
  282. [Fact]
  283. public void ForEach_Old()
  284. {
  285. var o = new ListObservable<int>(Observable.Range(0, 10));
  286. var l = new List<int>();
  287. foreach (int x in (IEnumerable)o)
  288. {
  289. l.Add(x);
  290. }
  291. l.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  292. }
  293. [Fact]
  294. public void Subscribe_Never()
  295. {
  296. var s = new TestScheduler();
  297. var xs = s.CreateHotObservable<int>(
  298. );
  299. var results = s.Start(() => new ListObservable<int>(xs));
  300. results.Messages.AssertEqual(
  301. );
  302. }
  303. [Fact]
  304. public void Subscribe_Infinite()
  305. {
  306. var s = new TestScheduler();
  307. var xs = s.CreateHotObservable(
  308. OnNext(300, 1)
  309. );
  310. var results = s.Start(() => new ListObservable<int>(xs));
  311. results.Messages.AssertEqual(
  312. );
  313. }
  314. [Fact]
  315. public void Subscribe_Error()
  316. {
  317. var s = new TestScheduler();
  318. var ex = new Exception();
  319. var xs = s.CreateHotObservable(
  320. OnNext(300, 1),
  321. OnError<int>(400, ex)
  322. );
  323. var results = s.Start(() => new ListObservable<int>(xs));
  324. results.Messages.AssertEqual(
  325. OnError<object>(400, ex)
  326. );
  327. }
  328. [Fact]
  329. public void Subscribe_Completed()
  330. {
  331. var s = new TestScheduler();
  332. var xs = s.CreateHotObservable(
  333. OnNext(300, 1),
  334. OnCompleted<int>(400)
  335. );
  336. var results = s.Start(() => new ListObservable<int>(xs));
  337. results.Messages.AssertEqual(
  338. OnCompleted<object>(400)
  339. );
  340. }
  341. [Fact]
  342. public void Subscribe_Disposed()
  343. {
  344. var s = new TestScheduler();
  345. var xs = s.CreateHotObservable(
  346. OnNext(300, 1),
  347. OnCompleted<int>(1100)
  348. );
  349. var results = s.Start(() => new ListObservable<int>(xs));
  350. results.Messages.AssertEqual(
  351. );
  352. }
  353. [Fact]
  354. public void Subscribe_Disposed_Multi()
  355. {
  356. var s = new TestScheduler();
  357. var xs = s.CreateHotObservable(
  358. OnNext(300, 1),
  359. OnCompleted<int>(400)
  360. );
  361. var o = new ListObservable<int>(xs);
  362. var results1 = s.CreateObserver<object>();
  363. var results2 = s.CreateObserver<object>();
  364. var d1 = o.Subscribe(results1);
  365. var d2 = o.Subscribe(results2);
  366. s.ScheduleAbsolute(350, () => d1.Dispose());
  367. s.ScheduleAbsolute(500, () => d2.Dispose());
  368. s.Start();
  369. results1.Messages.AssertEqual(
  370. );
  371. results2.Messages.AssertEqual(
  372. );
  373. }
  374. }
  375. }