/mcs/class/System/Test/System.Collections.Generic/SortedSetTest.cs

https://github.com/iainlane/mono · C# · 518 lines · 420 code · 70 blank · 28 comment · 13 complexity · 5fc8394809c09e017e2b0748d3dd1149 MD5 · raw file

  1. //
  2. // SortedSetTest.cs
  3. //
  4. // Author:
  5. // Jb Evain <jbevain@novell.com>
  6. //
  7. // Copyright (C) 2010 Novell, Inc (http://www.novell.com)
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. #if NET_4_0
  29. using System;
  30. using System.Collections;
  31. using System.Collections.Generic;
  32. using System.Linq;
  33. using System.Runtime.Serialization;
  34. using NUnit.Framework;
  35. namespace MonoTests.System.Collections.Generic
  36. {
  37. [TestFixture]
  38. public class SortedSetTest
  39. {
  40. [Test]
  41. public void CtorNullComparer ()
  42. {
  43. var set = new SortedSet<int> ((IComparer<int>) null);
  44. Assert.AreEqual (Comparer<int>.Default, set.Comparer);
  45. }
  46. [Test]
  47. [ExpectedException (typeof (ArgumentNullException))]
  48. public void CtorNullCollection ()
  49. {
  50. new SortedSet<int> (null as IEnumerable<int>);
  51. }
  52. [Test]
  53. public void CtorDefault ()
  54. {
  55. var set = new SortedSet<int> ();
  56. Assert.IsNotNull (set.Comparer);
  57. }
  58. [Test]
  59. public void Add ()
  60. {
  61. var set = new SortedSet<int> ();
  62. Assert.AreEqual (0, set.Count);
  63. Assert.IsTrue (set.Add (2));
  64. Assert.IsTrue (set.Add (4));
  65. Assert.IsTrue (set.Add (3));
  66. Assert.AreEqual (3, set.Count);
  67. Assert.IsFalse (set.Add (2));
  68. }
  69. [Test]
  70. public void Remove ()
  71. {
  72. var set = new SortedSet<int> ();
  73. Assert.IsTrue (set.Add (2));
  74. Assert.IsTrue (set.Add (4));
  75. Assert.AreEqual (2, set.Count);
  76. Assert.IsTrue (set.Remove (4));
  77. Assert.IsTrue (set.Remove (2));
  78. Assert.AreEqual (0, set.Count);
  79. Assert.IsFalse (set.Remove (4));
  80. Assert.IsFalse (set.Remove (2));
  81. }
  82. [Test]
  83. public void Clear ()
  84. {
  85. var set = new SortedSet<int> { 2, 3, 4, 5 };
  86. Assert.AreEqual (4, set.Count);
  87. set.Clear ();
  88. Assert.AreEqual (0, set.Count);
  89. }
  90. [Test]
  91. public void Contains ()
  92. {
  93. var set = new SortedSet<int> { 2, 3, 4, 5 };
  94. Assert.IsTrue (set.Contains (4));
  95. Assert.IsFalse (set.Contains (7));
  96. }
  97. [Test]
  98. public void GetEnumerator ()
  99. {
  100. var set = new SortedSet<int> { 5, 3, 1, 2, 6, 4 };
  101. Assert.IsTrue (set.SequenceEqual (new [] { 1, 2, 3, 4, 5, 6 }));
  102. }
  103. [Test]
  104. public void Reverse ()
  105. {
  106. var set = new SortedSet<int> { 5, 3, 1, 2, 6, 4 };
  107. var reversed = set.Reverse ();
  108. Assert.IsTrue (reversed.SequenceEqual (new [] { 6, 5, 4, 3, 2, 1 }));
  109. }
  110. [Test]
  111. public void RemoveWhere ()
  112. {
  113. var set = new SortedSet<int> { 1, 2, 3, 4, 5, 6 };
  114. Assert.AreEqual (3, set.RemoveWhere (i => i % 2 == 0));
  115. Assert.AreEqual (3, set.Count);
  116. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 5 }));
  117. }
  118. [Test]
  119. public void Max ()
  120. {
  121. var set = new SortedSet<int> { 1, 3, 12, 9 };
  122. Assert.AreEqual (12, set.Max);
  123. }
  124. [Test]
  125. public void Min ()
  126. {
  127. var set = new SortedSet<int> { 2, 3, 1, 9 };
  128. Assert.AreEqual (1, set.Min);
  129. }
  130. [Test]
  131. [ExpectedException (typeof (ArgumentException))]
  132. public void GetViewBetweenLowerBiggerThanUpper ()
  133. {
  134. var set = new SortedSet<int> { 1, 2, 3, 4, 5, 6 };
  135. set.GetViewBetween (4, 2);
  136. }
  137. [Test]
  138. public void GetView ()
  139. {
  140. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  141. var view = set.GetViewBetween (3, 7);
  142. Assert.IsTrue (view.SequenceEqual (new [] { 3, 5, 7 }));
  143. }
  144. [Test]
  145. public void ViewAdd ()
  146. {
  147. var set = new SortedSet<int> { 1, 3, 5, 7 };
  148. var view = set.GetViewBetween (3, 5);
  149. Assert.IsTrue (view.Add (4));
  150. Assert.IsTrue (view.Contains (4));
  151. Assert.IsTrue (set.Contains (4));
  152. Assert.IsFalse (view.Add (5));
  153. }
  154. [Test]
  155. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  156. public void ViewAddOutOfRange ()
  157. {
  158. var set = new SortedSet<int> { 1, 3, 5, 7 };
  159. var view = set.GetViewBetween (3, 5);
  160. view.Add (7);
  161. }
  162. [Test]
  163. public void ViewContains ()
  164. {
  165. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  166. var view = set.GetViewBetween (3, 7);
  167. Assert.IsFalse (view.Contains (4));
  168. Assert.IsTrue (view.Contains (3));
  169. Assert.IsTrue (view.Contains (5));
  170. }
  171. [Test]
  172. public void ViewRemove ()
  173. {
  174. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  175. var view = set.GetViewBetween (3, 7);
  176. Assert.IsTrue (view.Remove (3));
  177. Assert.IsFalse (view.Contains (3));
  178. Assert.IsFalse (set.Contains (3));
  179. Assert.IsFalse (view.Remove (9));
  180. Assert.IsTrue (set.Contains (9));
  181. }
  182. [Test]
  183. public void ViewClear ()
  184. {
  185. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  186. var view = set.GetViewBetween (3, 7);
  187. view.Clear ();
  188. Assert.AreEqual (0, view.Count);
  189. Assert.IsTrue (set.SequenceEqual (new [] { 1, 9 }));
  190. }
  191. [Test]
  192. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  193. public void ViewGetViewLowerOutOfRange ()
  194. {
  195. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  196. var view = set.GetViewBetween (3, 7);
  197. view.GetViewBetween (2, 5);
  198. }
  199. [Test]
  200. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  201. public void ViewGetViewUpperOutOfRange ()
  202. {
  203. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  204. var view = set.GetViewBetween (3, 7);
  205. view.GetViewBetween (5, 9);
  206. }
  207. [Test]
  208. public void ViewGetView ()
  209. {
  210. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  211. var view = set.GetViewBetween (3, 7);
  212. view = view.GetViewBetween (4, 6);
  213. Assert.IsTrue (view.SequenceEqual (new [] { 5 }));
  214. }
  215. void EmptySubView (SortedSet<int> set)
  216. {
  217. var view = set.GetViewBetween (-20, -15);
  218. Assert.AreEqual (0, view.Count);
  219. Assert.AreEqual (0, view.Min);
  220. Assert.AreEqual (0, view.Max);
  221. view = set.GetViewBetween (15, 20);
  222. Assert.AreEqual (0, view.Count);
  223. Assert.AreEqual (0, view.Min);
  224. Assert.AreEqual (0, view.Max);
  225. }
  226. [Test]
  227. public void EmptySubView ()
  228. {
  229. EmptySubView (new SortedSet<int> ());
  230. EmptySubView (new SortedSet<int> { 1, 3, 5, 7, 9 });
  231. EmptySubView (new SortedSet<int> { -40, 40 });
  232. EmptySubView (new SortedSet<int> { -40, -10, 10, 40 });
  233. }
  234. [Test]
  235. public void ViewMin ()
  236. {
  237. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  238. var view = set.GetViewBetween (4, 8);
  239. Assert.AreEqual (5, view.Min);
  240. view = set.GetViewBetween (-2, 4);
  241. Assert.AreEqual (1, view.Min);
  242. view = set.GetViewBetween (1, 9);
  243. Assert.AreEqual (1, view.Min);
  244. }
  245. [Test]
  246. public void ViewMax ()
  247. {
  248. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  249. var view = set.GetViewBetween (4, 8);
  250. Assert.AreEqual (7, view.Max);
  251. view = set.GetViewBetween (4, 55);
  252. Assert.AreEqual (9, view.Max);
  253. view = set.GetViewBetween (1, 9);
  254. Assert.AreEqual (9, view.Max);
  255. }
  256. [Test]
  257. public void ViewCount ()
  258. {
  259. var set = new SortedSet<int> { 1, 3, 4, 5, 6, 7, 8, 9 };
  260. var view = set.GetViewBetween (4, 8);
  261. Assert.AreEqual (5, view.Count);
  262. set.Remove (5);
  263. Assert.AreEqual (4, view.Count);
  264. set.Add (10);
  265. Assert.AreEqual (4, view.Count);
  266. set.Add (6);
  267. Assert.AreEqual (4, view.Count);
  268. set.Add (5);
  269. Assert.AreEqual (5, view.Count);
  270. }
  271. [Test, ExpectedException (typeof (ArgumentNullException))]
  272. public void IntersectWith_Null ()
  273. {
  274. var set = new SortedSet<int> ();
  275. set.IntersectWith (null);
  276. }
  277. [Test]
  278. public void IntersectWith ()
  279. {
  280. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  281. set.IntersectWith (new [] { 5, 7, 3, 7, 11, 7, 5, 2 });
  282. Assert.IsTrue (set.SequenceEqual (new [] { 3, 5, 7 }));
  283. }
  284. [Test]
  285. public void ViewIntersectWith ()
  286. {
  287. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  288. var view = set.GetViewBetween (4, 8);
  289. view.IntersectWith (new [] { 1, 5, 9 });
  290. Assert.IsTrue (view.SequenceEqual (new [] { 5 }));
  291. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 5, 9 }));
  292. view.IntersectWith (new [] { 1, 2 });
  293. Assert.IsTrue (view.SequenceEqual (new int [] {}));
  294. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 9 }));
  295. }
  296. [Test, ExpectedException (typeof (ArgumentNullException))]
  297. public void UnionWith_Null ()
  298. {
  299. var set = new SortedSet<int> ();
  300. set.UnionWith (null);
  301. }
  302. [Test]
  303. public void UnionWith ()
  304. {
  305. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  306. set.UnionWith (new [] { 5, 7, 3, 7, 11, 7, 5, 2 });
  307. Assert.IsTrue (set.SequenceEqual (new [] { 1, 2, 3, 5, 7, 9, 11 }));
  308. }
  309. [Test]
  310. public void ViewUnionWith ()
  311. {
  312. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  313. var view = set.GetViewBetween (4, 8);
  314. view.UnionWith (new [] { 4, 5, 6, 6, 4 });
  315. Assert.IsTrue (view.SequenceEqual (new [] { 4, 5, 6, 7 }));
  316. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 4, 5, 6, 7, 9 }));
  317. }
  318. [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
  319. public void ViewUnionWith_oor ()
  320. {
  321. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  322. var view = set.GetViewBetween (4, 8);
  323. view.UnionWith (new [] {1});
  324. }
  325. [Test, ExpectedException (typeof (ArgumentNullException))]
  326. public void ExceptWith_Null ()
  327. {
  328. var set = new SortedSet<int> ();
  329. set.ExceptWith (null);
  330. }
  331. [Test]
  332. public void ExceptWith ()
  333. {
  334. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  335. set.ExceptWith (new [] { 5, 7, 3, 7, 11, 7, 5, 2 });
  336. Assert.IsTrue (set.SequenceEqual (new [] { 1, 9 }));
  337. }
  338. [Test]
  339. public void ViewExceptWith ()
  340. {
  341. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  342. var view = set.GetViewBetween (4, 8);
  343. view.ExceptWith (new [] { 4, 5, 6, 6, 4 });
  344. Assert.IsTrue (view.SequenceEqual (new [] { 7 }));
  345. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 7, 9 }));
  346. view.ExceptWith (new [] { 1, 2 });
  347. Assert.IsTrue (view.SequenceEqual (new [] { 7 }));
  348. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 7, 9 }));
  349. }
  350. [Test, ExpectedException (typeof (ArgumentNullException))]
  351. public void SymmetricExceptWith_Null ()
  352. {
  353. var set = new SortedSet<int> ();
  354. set.SymmetricExceptWith (null);
  355. }
  356. [Test]
  357. public void SymmetricExceptWith ()
  358. {
  359. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  360. set.SymmetricExceptWith (new [] { 5, 7, 3, 7, 11, 7, 5, 2 });
  361. Assert.IsTrue (set.SequenceEqual (new [] { 1, 2, 9, 11 }));
  362. }
  363. [Test]
  364. public void ViewSymmetricExceptWith ()
  365. {
  366. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  367. var view = set.GetViewBetween (4, 8);
  368. view.SymmetricExceptWith (new [] { 4, 5, 6, 6, 4 });
  369. Assert.IsTrue (view.SequenceEqual (new [] { 4, 6, 7 }));
  370. Assert.IsTrue (set.SequenceEqual (new [] { 1, 3, 4, 6, 7, 9 }));
  371. }
  372. [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
  373. public void ViewSymmetricExceptWith_oor ()
  374. {
  375. var set = new SortedSet<int> { 1, 3, 5, 7, 9 };
  376. var view = set.GetViewBetween (4, 8);
  377. view.SymmetricExceptWith (new [] {2});
  378. }
  379. void do_test_e (SortedSet<int> s1, IEnumerable<int> s2, bool o, bool se = false, bool psb = false, bool psu = false)
  380. {
  381. bool sb = false, su = false;
  382. if (se)
  383. sb = su = true;
  384. if (psb)
  385. sb = true;
  386. if (psu)
  387. su = true;
  388. Assert.IsTrue (!su || !psb);
  389. Assert.IsTrue (!sb || !psu);
  390. // actual tests
  391. Assert.AreEqual (o, s1.Overlaps (s2));
  392. Assert.AreEqual (se, s1.SetEquals (s2));
  393. Assert.AreEqual (sb, s1.IsSubsetOf (s2));
  394. Assert.AreEqual (su, s1.IsSupersetOf (s2));
  395. Assert.AreEqual (psb, s1.IsProperSubsetOf (s2));
  396. Assert.AreEqual (psu, s1.IsProperSupersetOf (s2));
  397. }
  398. void do_test (SortedSet<int> s1, SortedSet<int> s2, bool o = false, bool se = false, bool psb = false, bool psu = false)
  399. {
  400. if (s1.Count != 0 && s2.Count != 0 && (se || psb || psu))
  401. o = true;
  402. do_test_e (s1, s2, o, se, psb, psu);
  403. do_test_e (s2, s1, o, se, psu, psb);
  404. }
  405. [Test]
  406. public void TestSetCompares ()
  407. {
  408. var empty = new SortedSet<int> ();
  409. var zero = new SortedSet<int> { 0 };
  410. var one = new SortedSet<int> { 1 };
  411. var two = new SortedSet<int> { 2 };
  412. var bit = new SortedSet<int> { 0, 1 };
  413. var trit = new SortedSet<int> { 0, 1, 2 };
  414. var odds = new SortedSet<int> { 1, 3, 5, 7, 9 };
  415. var evens = new SortedSet<int> { 2, 4, 6, 8 };
  416. var digits = new SortedSet<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  417. var squares = new SortedSet<int> { 0, 1, 4, 9 };
  418. var non_prime_odd_digit = odds.GetViewBetween (8, 42);
  419. var non_trit = digits.GetViewBetween (3, 42);
  420. do_test (empty, empty, se: true);
  421. do_test (empty, zero, psb: true);
  422. do_test (empty, digits, psb: true);
  423. do_test (zero, zero, se: true);
  424. do_test (zero, one);
  425. do_test (zero, bit, psb: true);
  426. do_test (zero, trit, psb: true);
  427. do_test (one, bit, psb: true);
  428. do_test (one, trit, psb: true);
  429. do_test (two, bit);
  430. do_test (two, trit, psb: true);
  431. do_test (odds, squares, o: true);
  432. do_test (evens, squares, o: true);
  433. do_test (odds, digits, psb: true);
  434. do_test (evens, digits, psb: true);
  435. do_test (squares, digits, psb: true);
  436. do_test (digits, digits, se: true);
  437. do_test_e (digits, squares.Concat (evens.Concat (odds)), o: true, se: true);
  438. do_test (non_prime_odd_digit, digits, psb: true);
  439. do_test_e (non_prime_odd_digit, new [] { 9 }, o: true, se: true);
  440. do_test (non_trit, digits, psb: true);
  441. do_test (trit, non_trit);
  442. do_test_e (digits, trit.Concat (non_trit), o: true, se: true);
  443. do_test_e (non_trit, new [] { 3, 4, 5, 6, 7, 8, 9 }, o: true, se: true);
  444. do_test (digits.GetViewBetween (0, 2), trit, se: true);
  445. }
  446. }
  447. }
  448. #endif