ListObservableTest.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  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. o[0] = -1;
  103. o.AssertEqual(-1, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  104. }
  105. [Fact]
  106. public void Change_Middle()
  107. {
  108. var o = new ListObservable<int>(Observable.Range(0, 10));
  109. o[5] = -1;
  110. o.AssertEqual(0, 1, 2, 3, 4, -1, 6, 7, 8, 9);
  111. }
  112. [Fact]
  113. public void Change_End()
  114. {
  115. var o = new ListObservable<int>(Observable.Range(0, 10));
  116. o[9] = -1;
  117. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, -1);
  118. }
  119. [Fact]
  120. public void Change_Error()
  121. {
  122. var o = new ListObservable<int>(Observable.Range(0, 10));
  123. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => o[100] = -1);
  124. }
  125. [Fact]
  126. public void Insert_End()
  127. {
  128. var o = new ListObservable<int>(Observable.Range(0, 10));
  129. o.Insert(10, -1);
  130. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1);
  131. }
  132. [Fact]
  133. public void Contains_None()
  134. {
  135. var o = new ListObservable<int>(Observable.Empty<int>());
  136. Assert.Equal(false, o.Contains(0));
  137. }
  138. [Fact]
  139. public void Contains_Some_NotFound()
  140. {
  141. var o = new ListObservable<int>(Observable.Range(0, 10));
  142. Assert.Equal(false, o.Contains(100));
  143. }
  144. [Fact]
  145. public void Contains_Some_Found()
  146. {
  147. var o = new ListObservable<int>(Observable.Range(0, 10));
  148. Assert.Equal(true, o.Contains(3));
  149. }
  150. [Fact]
  151. public void Clear()
  152. {
  153. var o = new ListObservable<int>(Observable.Range(0, 10));
  154. o.Clear();
  155. o.AssertEqual();
  156. }
  157. [Fact]
  158. public void IsReadOnly()
  159. {
  160. var o = new ListObservable<int>(Observable.Never<int>());
  161. Assert.Equal(false, o.IsReadOnly);
  162. }
  163. [Fact]
  164. public void This_None()
  165. {
  166. var o = new ListObservable<int>(Observable.Empty<int>());
  167. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => { var t = o[0]; });
  168. }
  169. [Fact]
  170. public void This_Some_NotFound()
  171. {
  172. var o = new ListObservable<int>(Observable.Range(0, 10));
  173. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => { var t = o[100]; });
  174. }
  175. [Fact]
  176. public void This_Some_Found()
  177. {
  178. var o = new ListObservable<int>(Observable.Range(0, 10));
  179. Assert.Equal(5, o[5]);
  180. }
  181. [Fact]
  182. public void CopyTo_RightSize()
  183. {
  184. var o = new ListObservable<int>(Observable.Range(0, 10));
  185. var array = new int[10];
  186. o.CopyTo(array, 0);
  187. array.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  188. }
  189. [Fact]
  190. public void CopyTo_RightSize_Offset()
  191. {
  192. var o = new ListObservable<int>(Observable.Range(0, 10));
  193. var array = new int[10];
  194. ReactiveAssert.Throws<ArgumentException>(() => o.CopyTo(array, 3));
  195. }
  196. [Fact]
  197. public void CopyTo_Bigger()
  198. {
  199. var o = new ListObservable<int>(Observable.Range(0, 10));
  200. var array = new int[15];
  201. o.CopyTo(array, 0);
  202. array.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0);
  203. }
  204. [Fact]
  205. public void CopyTo_Bigger_Offset()
  206. {
  207. var o = new ListObservable<int>(Observable.Range(0, 10));
  208. var array = new int[15];
  209. o.CopyTo(array, 3);
  210. array.AssertEqual(0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0);
  211. }
  212. [Fact]
  213. public void CopyTo_Smaller()
  214. {
  215. var o = new ListObservable<int>(Observable.Range(0, 10));
  216. var array = new int[5];
  217. ReactiveAssert.Throws<ArgumentException>(() => o.CopyTo(array, 0));
  218. }
  219. [Fact]
  220. public void CopyTo_Smaller_Offset()
  221. {
  222. var o = new ListObservable<int>(Observable.Range(0, 10));
  223. var array = new int[5];
  224. ReactiveAssert.Throws<ArgumentException>(() => o.CopyTo(array, 3));
  225. }
  226. [Fact]
  227. public void Add_Empty()
  228. {
  229. var o = new ListObservable<int>(Observable.Empty<int>());
  230. o.Add(100);
  231. o.AssertEqual(100);
  232. }
  233. [Fact]
  234. public void Add_Some()
  235. {
  236. var o = new ListObservable<int>(Observable.Return(200));
  237. o.Add(100);
  238. o.AssertEqual(200, 100);
  239. }
  240. [Fact]
  241. public void Remove_None()
  242. {
  243. var o = new ListObservable<int>(Observable.Empty<int>());
  244. Assert.Equal(false, o.Remove(0));
  245. o.AssertEqual();
  246. }
  247. [Fact]
  248. public void Remove_Some_NotFound()
  249. {
  250. var o = new ListObservable<int>(Observable.Range(0, 10));
  251. Assert.Equal(false, o.Remove(100));
  252. o.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  253. }
  254. [Fact]
  255. public void Remove_Some_Found()
  256. {
  257. var o = new ListObservable<int>(Observable.Range(0, 10));
  258. Assert.Equal(true, o.Remove(3));
  259. o.AssertEqual(0, 1, 2, 4, 5, 6, 7, 8, 9);
  260. }
  261. [Fact]
  262. public void ForEach()
  263. {
  264. var o = new ListObservable<int>(Observable.Range(0, 10));
  265. var l = new List<int>();
  266. foreach (var x in o)
  267. l.Add(x);
  268. l.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  269. }
  270. [Fact]
  271. public void ForEach_Old()
  272. {
  273. var o = new ListObservable<int>(Observable.Range(0, 10));
  274. var l = new List<int>();
  275. foreach (int x in (IEnumerable)o)
  276. l.Add(x);
  277. l.AssertEqual(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  278. }
  279. [Fact]
  280. public void Subscribe_Never()
  281. {
  282. var s = new TestScheduler();
  283. var xs = s.CreateHotObservable<int>(
  284. );
  285. var results = s.Start(() => new ListObservable<int>(xs));
  286. results.Messages.AssertEqual(
  287. );
  288. }
  289. [Fact]
  290. public void Subscribe_Infinite()
  291. {
  292. var s = new TestScheduler();
  293. var xs = s.CreateHotObservable<int>(
  294. OnNext(300, 1)
  295. );
  296. var results = s.Start(() => new ListObservable<int>(xs));
  297. results.Messages.AssertEqual(
  298. );
  299. }
  300. [Fact]
  301. public void Subscribe_Error()
  302. {
  303. var s = new TestScheduler();
  304. var ex = new Exception();
  305. var xs = s.CreateHotObservable<int>(
  306. OnNext(300, 1),
  307. OnError<int>(400, ex)
  308. );
  309. var results = s.Start(() => new ListObservable<int>(xs));
  310. results.Messages.AssertEqual(
  311. OnError<Object>(400, ex)
  312. );
  313. }
  314. [Fact]
  315. public void Subscribe_Completed()
  316. {
  317. var s = new TestScheduler();
  318. var xs = s.CreateHotObservable<int>(
  319. OnNext(300, 1),
  320. OnCompleted<int>(400)
  321. );
  322. var results = s.Start(() => new ListObservable<int>(xs));
  323. results.Messages.AssertEqual(
  324. OnCompleted<Object>(400)
  325. );
  326. }
  327. [Fact]
  328. public void Subscribe_Disposed()
  329. {
  330. var s = new TestScheduler();
  331. var xs = s.CreateHotObservable<int>(
  332. OnNext(300, 1),
  333. OnCompleted<int>(1100)
  334. );
  335. var results = s.Start(() => new ListObservable<int>(xs));
  336. results.Messages.AssertEqual(
  337. );
  338. }
  339. [Fact]
  340. public void Subscribe_Disposed_Multi()
  341. {
  342. var s = new TestScheduler();
  343. var xs = s.CreateHotObservable<int>(
  344. OnNext(300, 1),
  345. OnCompleted<int>(400)
  346. );
  347. var o = new ListObservable<int>(xs);
  348. var results1 = s.CreateObserver<object>();
  349. var results2 = s.CreateObserver<object>();
  350. var d1 = o.Subscribe(results1);
  351. var d2 = o.Subscribe(results2);
  352. s.ScheduleAbsolute(350, () => d1.Dispose());
  353. s.ScheduleAbsolute(500, () => d2.Dispose());
  354. s.Start();
  355. results1.Messages.AssertEqual(
  356. );
  357. results2.Messages.AssertEqual(
  358. );
  359. }
  360. }
  361. }