/LanguageExt.Tests/MapTests.cs

https://github.com/louthy/language-ext · C# · 583 lines · 469 code · 101 blank · 13 comment · 163 complexity · 202f7224969a12b06e7070865c639a5b MD5 · raw file

  1. using LanguageExt;
  2. using static LanguageExt.Prelude;
  3. using static LanguageExt.Map;
  4. using Xunit;
  5. using System;
  6. using System.Linq;
  7. using LanguageExt.ClassInstances;
  8. namespace LanguageExt.Tests
  9. {
  10. public class MapTests
  11. {
  12. [Fact]
  13. public void MapGeneratorTest()
  14. {
  15. var m1 = Map<int, string>();
  16. m1 = add(m1, 100, "hello");
  17. Assert.True(m1.Count == 1 && containsKey(m1,100));
  18. }
  19. [Fact]
  20. public void MapGeneratorAndMatchTest()
  21. {
  22. Map<int, string> m2 = ((1, "a"), (2, "b"), (3, "c"));
  23. m2 = add(m2, 100, "world");
  24. var res = match(
  25. m2, 100,
  26. v => v,
  27. () => "failed"
  28. );
  29. Assert.True(res == "world");
  30. }
  31. [Fact]
  32. public void MapSetTest()
  33. {
  34. var m1 = Map( Tuple(1, "a"),
  35. Tuple(2, "b"),
  36. Tuple(3, "c") );
  37. var m2 = setItem(m1, 1, "x");
  38. match(
  39. m1, 1,
  40. Some: v => Assert.True(v == "a"),
  41. None: () => Assert.False(true)
  42. );
  43. match(
  44. find(m2, 1),
  45. Some: v => Assert.True(v == "x"),
  46. None: () => Assert.False(true)
  47. );
  48. Assert.Throws<ArgumentException>(() => setItem(m1, 4, "y"));
  49. }
  50. [Fact]
  51. public void MapOrdSetTest()
  52. {
  53. var m1 = Map<OrdStringOrdinalIgnoreCase, string, int>(("one", 1), ("two",2), ("three", 3));
  54. var m2 = m1.SetItem("One", -1);
  55. Assert.Equal(3, m2.Count);
  56. Assert.Equal(-1, m2["one"]);
  57. Assert.DoesNotContain("one", m2.Keys); // make sure key got replaced, too
  58. Assert.Contains("One", m2.Keys); // make sure key got replaced, too
  59. Assert.Throws<ArgumentException>(() => m1.SetItem("four", identity));
  60. var m3 = m1.TrySetItem("four", 0).Add("five", 0).TrySetItem("Five", 5);
  61. Assert.Equal(5, m3["fiVe"]);
  62. Assert.DoesNotContain("four", m3.Keys);
  63. Assert.DoesNotContain("five", m3.Keys);
  64. Assert.Contains("Five", m3.Keys);
  65. }
  66. [Fact]
  67. public void MapAddInOrderTest()
  68. {
  69. var m = Map(Tuple(1, 1));
  70. m.Find(1).IfNone(() => failwith<int>("Broken"));
  71. m = Map(Tuple(1, 1), Tuple(2, 2));
  72. m.Find(1).IfNone(() => failwith<int>("Broken"));
  73. m.Find(2).IfNone(() => failwith<int>("Broken"));
  74. m = Map(Tuple(1, 1), Tuple(2, 2), Tuple(3, 3));
  75. m.Find(1).IfNone(() => failwith<int>("Broken"));
  76. m.Find(2).IfNone(() => failwith<int>("Broken"));
  77. m.Find(3).IfNone(() => failwith<int>("Broken"));
  78. m = Map(Tuple(1, 1), Tuple(2, 2), Tuple(3, 3), Tuple(4, 4));
  79. m.Find(1).IfNone(() => failwith<int>("Broken"));
  80. m.Find(2).IfNone(() => failwith<int>("Broken"));
  81. m.Find(3).IfNone(() => failwith<int>("Broken"));
  82. m.Find(4).IfNone(() => failwith<int>("Broken"));
  83. m = Map(Tuple(1, 1), Tuple(2, 2), Tuple(3, 3), Tuple(4, 4), Tuple(5, 5));
  84. m.Find(1).IfNone(() => failwith<int>("Broken"));
  85. m.Find(2).IfNone(() => failwith<int>("Broken"));
  86. m.Find(3).IfNone(() => failwith<int>("Broken"));
  87. m.Find(4).IfNone(() => failwith<int>("Broken"));
  88. m.Find(5).IfNone(() => failwith<int>("Broken"));
  89. }
  90. [Fact]
  91. public void MapAddInReverseOrderTest()
  92. {
  93. var m = Map(Tuple(2, 2), Tuple(1, 1));
  94. m.Find(1).IfNone(() => failwith<int>("Broken"));
  95. m.Find(2).IfNone(() => failwith<int>("Broken"));
  96. m = Map(Tuple(3, 3), Tuple(2, 2), Tuple(1, 1));
  97. m.Find(1).IfNone(() => failwith<int>("Broken"));
  98. m.Find(2).IfNone(() => failwith<int>("Broken"));
  99. m.Find(3).IfNone(() => failwith<int>("Broken"));
  100. m = Map(Tuple(4, 4), Tuple(3, 3), Tuple(2, 2), Tuple(1, 1));
  101. m.Find(1).IfNone(() => failwith<int>("Broken"));
  102. m.Find(2).IfNone(() => failwith<int>("Broken"));
  103. m.Find(3).IfNone(() => failwith<int>("Broken"));
  104. m.Find(4).IfNone(() => failwith<int>("Broken"));
  105. m = Map(Tuple(5, 5), Tuple(4, 4), Tuple(3, 3), Tuple(2, 2), Tuple(1, 1));
  106. m.Find(1).IfNone(() => failwith<int>("Broken"));
  107. m.Find(2).IfNone(() => failwith<int>("Broken"));
  108. m.Find(3).IfNone(() => failwith<int>("Broken"));
  109. m.Find(4).IfNone(() => failwith<int>("Broken"));
  110. m.Find(5).IfNone(() => failwith<int>("Broken"));
  111. }
  112. [Fact]
  113. public void MapAddInMixedOrderTest()
  114. {
  115. var m = Map(Tuple(5, 5), Tuple(1, 1), Tuple(3, 3), Tuple(2, 2), Tuple(4, 4));
  116. m.Find(1).IfNone(() => failwith<int>("Broken"));
  117. m.Find(2).IfNone(() => failwith<int>("Broken"));
  118. m.Find(3).IfNone(() => failwith<int>("Broken"));
  119. m.Find(4).IfNone(() => failwith<int>("Broken"));
  120. m.Find(5).IfNone(() => failwith<int>("Broken"));
  121. m = Map(Tuple(1, 1), Tuple(3, 3), Tuple(5, 5), Tuple(2, 2), Tuple(4, 4));
  122. m.Find(1).IfNone(() => failwith<int>("Broken"));
  123. m.Find(2).IfNone(() => failwith<int>("Broken"));
  124. m.Find(3).IfNone(() => failwith<int>("Broken"));
  125. m.Find(4).IfNone(() => failwith<int>("Broken"));
  126. m.Find(5).IfNone(() => failwith<int>("Broken"));
  127. }
  128. [Fact]
  129. public void MapRemoveTest()
  130. {
  131. var m = Map(Tuple(1, "a"),
  132. Tuple(2, "b"),
  133. Tuple(3, "c"),
  134. Tuple(4, "d"),
  135. Tuple(5, "e"));
  136. m.Find(1).IfNone(() => failwith<string>("Broken 1"));
  137. m.Find(2).IfNone(() => failwith<string>("Broken 2"));
  138. m.Find(3).IfNone(() => failwith<string>("Broken 3"));
  139. m.Find(4).IfNone(() => failwith<string>("Broken 4"));
  140. m.Find(5).IfNone(() => failwith<string>("Broken 5"));
  141. Assert.True(m.Count == 5);
  142. m = remove(m,4);
  143. Assert.True(m.Count == 4);
  144. Assert.True(m.Find(4).IsNone);
  145. m.Find(1).IfNone(() => failwith<string>("Broken 1"));
  146. m.Find(2).IfNone(() => failwith<string>("Broken 2"));
  147. m.Find(3).IfNone(() => failwith<string>("Broken 3"));
  148. m.Find(5).IfNone(() => failwith<string>("Broken 5"));
  149. m = remove(m, 1);
  150. Assert.True(m.Count == 3);
  151. Assert.True(m.Find(1).IsNone);
  152. m.Find(2).IfNone(() => failwith<string>("Broken 2"));
  153. m.Find(3).IfNone(() => failwith<string>("Broken 3"));
  154. m.Find(5).IfNone(() => failwith<string>("Broken 5"));
  155. m = remove(m, 2);
  156. Assert.True(m.Count == 2);
  157. Assert.True(m.Find(2).IsNone);
  158. m.Find(3).IfNone(() => failwith<string>("Broken 3"));
  159. m.Find(5).IfNone(() => failwith<string>("Broken 5"));
  160. m = remove(m, 3);
  161. Assert.True(m.Count == 1);
  162. Assert.True(m.Find(3).IsNone);
  163. m.Find(5).IfNone(() => failwith<string>("Broken 5"));
  164. m = remove(m, 5);
  165. Assert.True(m.Count == 0);
  166. Assert.True(m.Find(5).IsNone);
  167. }
  168. [Fact]
  169. public void MassAddRemoveTest()
  170. {
  171. int max = 100000;
  172. var items = LanguageExt.List.map(Range(1, max), _ => Tuple(Guid.NewGuid(), Guid.NewGuid()))
  173. .ToDictionary(kv => kv.Item1, kv => kv.Item2);
  174. var m = Map<Guid, Guid>().AddRange(items);
  175. Assert.True(m.Count == max);
  176. foreach (var item in items)
  177. {
  178. Assert.True(m.ContainsKey(item.Key));
  179. m = m.Remove(item.Key);
  180. Assert.False(m.ContainsKey(item.Key));
  181. max--;
  182. Assert.True(m.Count == max);
  183. }
  184. }
  185. [Fact]
  186. public void MapOptionTest()
  187. {
  188. var m = Map<Option<int>, Map<Option<int>, string>>();
  189. m = m.AddOrUpdate(Some(1), Some(1), "Some Some");
  190. m = m.AddOrUpdate(None, Some(1), "None Some");
  191. m = m.AddOrUpdate(Some(1), None, "Some None");
  192. m = m.AddOrUpdate(None, None, "None None");
  193. Assert.True(m[Some(1)][Some(1)] == "Some Some");
  194. Assert.True(m[None][Some(1)] == "None Some");
  195. Assert.True(m[Some(1)][None] == "Some None");
  196. Assert.True(m[None][None] == "None None");
  197. Assert.True(m.CountT() == 4);
  198. m = m.FilterT(v => v.EndsWith("None", StringComparison.Ordinal));
  199. Assert.True(m.CountT() == 2);
  200. }
  201. [Fact]
  202. public void MapValuesTest()
  203. {
  204. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5));
  205. var vs = Seq(m.Values);
  206. Assert.True(vs.Head == 1);
  207. Assert.True(vs.Tail.Head == 2);
  208. Assert.True(vs.Tail.Tail.Head == 3);
  209. Assert.True(vs.Tail.Tail.Tail.Head == 4);
  210. Assert.True(vs.Tail.Tail.Tail.Tail.Head == 5);
  211. Assert.True(vs.Count == 5);
  212. }
  213. [Fact]
  214. public void MapKeysTest()
  215. {
  216. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5));
  217. var vs = Seq(m.Keys);
  218. Assert.True(vs.Head == 1);
  219. Assert.True(vs.Tail.Head == 2);
  220. Assert.True(vs.Tail.Tail.Head == 3);
  221. Assert.True(vs.Tail.Tail.Tail.Head == 4);
  222. Assert.True(vs.Tail.Tail.Tail.Tail.Head == 5);
  223. Assert.True(vs.Count == 5);
  224. }
  225. [Fact]
  226. public void MapUnionTest1()
  227. {
  228. var x = Map((1, 1), (2, 2), (3, 3));
  229. var y = Map((1, 1), (2, 2), (3, 3));
  230. var z = union(x, y, (k, l, r) => l + r);
  231. Assert.True(z == Map((1, 2), (2, 4), (3, 6)));
  232. }
  233. [Fact]
  234. public void MapUnionTest2()
  235. {
  236. var x = Map((1, 1), (2, 2), (3, 3));
  237. var y = Map((4, 4), (5, 5), (6, 6));
  238. var z = union(x, y, (k, l, r) => l + r);
  239. Assert.True(z == Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)));
  240. }
  241. [Fact]
  242. public void MapIntesectTest1()
  243. {
  244. var x = Map( (2, 2), (3, 3));
  245. var y = Map((1, 1), (2, 2) );
  246. var z = intersect(x, y, (k, l, r) => l + r);
  247. Assert.True(z == Map((2, 4)));
  248. }
  249. [Fact]
  250. public void MapExceptTest()
  251. {
  252. var x = Map((1, 1), (2, 2), (3, 3));
  253. var y = Map((1, 1));
  254. var z = except(x, y);
  255. Assert.True(z == Map((2, 2), (3, 3)));
  256. }
  257. [Fact]
  258. public void MapSymmetricExceptTest()
  259. {
  260. var x = Map((1, 1), (2, 2), (3, 3));
  261. var y = Map((1, 1), (3, 3));
  262. var z = symmetricExcept(x, y);
  263. Assert.True(z == Map((2, 2)));
  264. }
  265. [Fact]
  266. public void EqualsTest()
  267. {
  268. var emp = Map<int, int>();
  269. Assert.True(emp.Equals(emp));
  270. Assert.False(Map((1, 2)).Equals(emp));
  271. Assert.False(emp.Equals(Map((1, 2))));
  272. Assert.True(Map((1, 2)).Equals(Map((1, 2))));
  273. Assert.False(Map((1, 2)).Equals(Map((1, 3))));
  274. Assert.False(Map((1, 2), (3, 4)).Equals(Map((1, 2))));
  275. Assert.False(Map((1, 2)).Equals(Map((1, 2), (3, 4))));
  276. Assert.True(Map((1, 2), (3, 4)).Equals(Map((1, 2), (3, 4))));
  277. Assert.True(Map((3, 4), (1, 2)).Equals(Map((1, 2), (3, 4))));
  278. Assert.True(Map((3, 4), (1, 2)).Equals(Map((3, 4), (1, 2))));
  279. }
  280. [Fact]
  281. public void SliceTest()
  282. {
  283. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5));
  284. var x = m.Slice(1, 2);
  285. Assert.True(x.Count == 2);
  286. Assert.True(x.ContainsKey(1));
  287. Assert.True(x.ContainsKey(2));
  288. var y = m.Slice(2, 4);
  289. Assert.True(y.Count == 3);
  290. Assert.True(y.ContainsKey(2));
  291. Assert.True(y.ContainsKey(3));
  292. Assert.True(y.ContainsKey(4));
  293. var z = m.Slice(4, 5);
  294. Assert.True(z.Count == 2);
  295. Assert.True(z.ContainsKey(4));
  296. Assert.True(z.ContainsKey(5));
  297. }
  298. [Fact]
  299. public void MinMaxTest()
  300. {
  301. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5));
  302. Assert.True(m.Min == (1, 1));
  303. Assert.True(m.Max == (5, 5));
  304. var me = Map<int, int>();
  305. Assert.True(me.Min == None);
  306. Assert.True(me.Max == None);
  307. }
  308. [Fact]
  309. public void FindPredecessorWhenKeyExistsTest()
  310. {
  311. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), (13, 13), (14, 14), (15, 15));
  312. Assert.True(m.FindPredecessor(1) == None);
  313. Assert.True(m.FindPredecessor(2) == (1, 1));
  314. Assert.True(m.FindPredecessor(3) == (2, 2));
  315. Assert.True(m.FindPredecessor(4) == (3, 3));
  316. Assert.True(m.FindPredecessor(5) == (4, 4));
  317. Assert.True(m.FindPredecessor(6) == (5, 5));
  318. Assert.True(m.FindPredecessor(7) == (6, 6));
  319. Assert.True(m.FindPredecessor(8) == (7, 7));
  320. Assert.True(m.FindPredecessor(9) == (8, 8));
  321. Assert.True(m.FindPredecessor(10) == (9, 9));
  322. Assert.True(m.FindPredecessor(11) == (10, 10));
  323. Assert.True(m.FindPredecessor(12) == (11, 11));
  324. Assert.True(m.FindPredecessor(13) == (12, 12));
  325. Assert.True(m.FindPredecessor(14) == (13, 13));
  326. Assert.True(m.FindPredecessor(15) == (14, 14));
  327. }
  328. [Fact]
  329. public void FindPredecessorWhenKeyNotExistsTest()
  330. {
  331. var m = Map((1, 1), (3, 3), (5, 5), (7, 7), (9, 9), (11, 11), (13, 13), (15, 15));
  332. Assert.True(m.FindPredecessor(1) == None);
  333. Assert.True(m.FindPredecessor(2) == (1, 1));
  334. Assert.True(m.FindPredecessor(3) == (1, 1));
  335. Assert.True(m.FindPredecessor(4) == (3, 3));
  336. Assert.True(m.FindPredecessor(5) == (3, 3));
  337. Assert.True(m.FindPredecessor(6) == (5, 5));
  338. Assert.True(m.FindPredecessor(7) == (5, 5));
  339. Assert.True(m.FindPredecessor(8) == (7, 7));
  340. Assert.True(m.FindPredecessor(9) == (7, 7));
  341. Assert.True(m.FindPredecessor(10) == (9, 9));
  342. Assert.True(m.FindPredecessor(11) == (9, 9));
  343. Assert.True(m.FindPredecessor(12) == (11, 11));
  344. Assert.True(m.FindPredecessor(13) == (11, 11));
  345. Assert.True(m.FindPredecessor(14) == (13, 13));
  346. Assert.True(m.FindPredecessor(15) == (13, 13));
  347. }
  348. [Fact]
  349. public void FindExactOrPredecessorWhenKeyExistsTest()
  350. {
  351. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), (13, 13), (14, 14), (15, 15));
  352. Assert.True(m.FindExactOrPredecessor(1) == (1, 1));
  353. Assert.True(m.FindExactOrPredecessor(2) == (2, 2));
  354. Assert.True(m.FindExactOrPredecessor(3) == (3, 3));
  355. Assert.True(m.FindExactOrPredecessor(4) == (4, 4));
  356. Assert.True(m.FindExactOrPredecessor(5) == (5, 5));
  357. Assert.True(m.FindExactOrPredecessor(6) == (6, 6));
  358. Assert.True(m.FindExactOrPredecessor(7) == (7, 7));
  359. Assert.True(m.FindExactOrPredecessor(8) == (8, 8));
  360. Assert.True(m.FindExactOrPredecessor(9) == (9, 9));
  361. Assert.True(m.FindExactOrPredecessor(10) == (10, 10));
  362. Assert.True(m.FindExactOrPredecessor(11) == (11, 11));
  363. Assert.True(m.FindExactOrPredecessor(12) == (12, 12));
  364. Assert.True(m.FindExactOrPredecessor(13) == (13, 13));
  365. Assert.True(m.FindExactOrPredecessor(14) == (14, 14));
  366. Assert.True(m.FindExactOrPredecessor(15) == (15, 15));
  367. }
  368. [Fact]
  369. public void FindExactOrPredecessorWhenKeySometimesExistsTest()
  370. {
  371. var m = Map((1, 1), (3, 3), (5, 5), (7, 7), (9, 9), (11, 11), (13, 13), (15, 15));
  372. Assert.True(m.FindExactOrPredecessor(1) == (1, 1));
  373. Assert.True(m.FindExactOrPredecessor(2) == (1, 1));
  374. Assert.True(m.FindExactOrPredecessor(3) == (3, 3));
  375. Assert.True(m.FindExactOrPredecessor(4) == (3, 3));
  376. Assert.True(m.FindExactOrPredecessor(5) == (5, 5));
  377. Assert.True(m.FindExactOrPredecessor(6) == (5, 5));
  378. Assert.True(m.FindExactOrPredecessor(7) == (7, 7));
  379. Assert.True(m.FindExactOrPredecessor(8) == (7, 7));
  380. Assert.True(m.FindExactOrPredecessor(9) == (9, 9));
  381. Assert.True(m.FindExactOrPredecessor(10) == (9, 9));
  382. Assert.True(m.FindExactOrPredecessor(11) == (11, 11));
  383. Assert.True(m.FindExactOrPredecessor(12) == (11, 11));
  384. Assert.True(m.FindExactOrPredecessor(13) == (13, 13));
  385. Assert.True(m.FindExactOrPredecessor(14) == (13, 13));
  386. Assert.True(m.FindExactOrPredecessor(15) == (15, 15));
  387. }
  388. [Fact]
  389. public void FindSuccessorWhenKeyExistsTest()
  390. {
  391. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), (13, 13), (14, 14), (15, 15));
  392. Assert.True(m.FindSuccessor(1) == (2, 2));
  393. Assert.True(m.FindSuccessor(2) == (3, 3));
  394. Assert.True(m.FindSuccessor(3) == (4, 4));
  395. Assert.True(m.FindSuccessor(4) == (5, 5));
  396. Assert.True(m.FindSuccessor(5) == (6, 6));
  397. Assert.True(m.FindSuccessor(6) == (7, 7));
  398. Assert.True(m.FindSuccessor(7) == (8, 8));
  399. Assert.True(m.FindSuccessor(8) == (9, 9));
  400. Assert.True(m.FindSuccessor(9) == (10, 10));
  401. Assert.True(m.FindSuccessor(10) == (11, 11));
  402. Assert.True(m.FindSuccessor(11) == (12, 12));
  403. Assert.True(m.FindSuccessor(12) == (13, 13));
  404. Assert.True(m.FindSuccessor(13) == (14, 14));
  405. Assert.True(m.FindSuccessor(14) == (15, 15));
  406. Assert.True(m.FindSuccessor(15) == None);
  407. }
  408. [Fact]
  409. public void FindSuccessorWhenKeyNotExistsTest()
  410. {
  411. var m = Map((1, 1), (3, 3), (5, 5), (7, 7), (9, 9), (11, 11), (13, 13), (15, 15));
  412. Assert.True(m.FindSuccessor(1) == (3, 3));
  413. Assert.True(m.FindSuccessor(2) == (3, 3));
  414. Assert.True(m.FindSuccessor(3) == (5, 5));
  415. Assert.True(m.FindSuccessor(4) == (5, 5));
  416. Assert.True(m.FindSuccessor(5) == (7, 7));
  417. Assert.True(m.FindSuccessor(6) == (7, 7));
  418. Assert.True(m.FindSuccessor(7) == (9, 9));
  419. Assert.True(m.FindSuccessor(8) == (9, 9));
  420. Assert.True(m.FindSuccessor(9) == (11, 11));
  421. Assert.True(m.FindSuccessor(10) == (11, 11));
  422. Assert.True(m.FindSuccessor(11) == (13, 13));
  423. Assert.True(m.FindSuccessor(12) == (13, 13));
  424. Assert.True(m.FindSuccessor(13) == (15, 15));
  425. Assert.True(m.FindSuccessor(14) == (15, 15));
  426. Assert.True(m.FindSuccessor(15) == None);
  427. }
  428. [Fact]
  429. public void FindExactOrSuccessorWhenKeyExistsTest()
  430. {
  431. var m = Map((1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), (13, 13), (14, 14), (15, 15));
  432. Assert.True(m.FindExactOrSuccessor(1) == (1, 1));
  433. Assert.True(m.FindExactOrSuccessor(2) == (2, 2));
  434. Assert.True(m.FindExactOrSuccessor(3) == (3, 3));
  435. Assert.True(m.FindExactOrSuccessor(4) == (4, 4));
  436. Assert.True(m.FindExactOrSuccessor(5) == (5, 5));
  437. Assert.True(m.FindExactOrSuccessor(6) == (6, 6));
  438. Assert.True(m.FindExactOrSuccessor(7) == (7, 7));
  439. Assert.True(m.FindExactOrSuccessor(8) == (8, 8));
  440. Assert.True(m.FindExactOrSuccessor(9) == (9, 9));
  441. Assert.True(m.FindExactOrSuccessor(10) == (10, 10));
  442. Assert.True(m.FindExactOrSuccessor(11) == (11, 11));
  443. Assert.True(m.FindExactOrSuccessor(12) == (12, 12));
  444. Assert.True(m.FindExactOrSuccessor(13) == (13, 13));
  445. Assert.True(m.FindExactOrSuccessor(14) == (14, 14));
  446. Assert.True(m.FindExactOrSuccessor(15) == (15, 15));
  447. }
  448. [Fact]
  449. public void FindExactOrSuccessorWhenKeySometimesExistsTest()
  450. {
  451. var m = Map((1, 1), (3, 3), (5, 5), (7, 7), (9, 9), (11, 11), (13, 13), (15, 15));
  452. Assert.True(m.FindExactOrSuccessor(1) == (1, 1));
  453. Assert.True(m.FindExactOrSuccessor(2) == (3, 3));
  454. Assert.True(m.FindExactOrSuccessor(3) == (3, 3));
  455. Assert.True(m.FindExactOrSuccessor(4) == (5, 5));
  456. Assert.True(m.FindExactOrSuccessor(5) == (5, 5));
  457. Assert.True(m.FindExactOrSuccessor(6) == (7, 7));
  458. Assert.True(m.FindExactOrSuccessor(7) == (7, 7));
  459. Assert.True(m.FindExactOrSuccessor(8) == (9, 9));
  460. Assert.True(m.FindExactOrSuccessor(9) == (9, 9));
  461. Assert.True(m.FindExactOrSuccessor(10) == (11, 11));
  462. Assert.True(m.FindExactOrSuccessor(11) == (11, 11));
  463. Assert.True(m.FindExactOrSuccessor(12) == (13, 13));
  464. Assert.True(m.FindExactOrSuccessor(13) == (13, 13));
  465. Assert.True(m.FindExactOrSuccessor(14) == (15, 15));
  466. Assert.True(m.FindExactOrSuccessor(15) == (15, 15));
  467. }
  468. // Exponential test - takes too long to run
  469. //[Fact]
  470. //public void Issue_454()
  471. //{
  472. // var tmp = "".PadLeft(30000, 'x'); // something big enough (one Referral object = 20-40kb)
  473. // var map = Map<int, string>();
  474. // for (int i = 0; i < 30000; i++) // for our real system it is only 3000 items, but with string it needs more
  475. // {
  476. // map = map.AddOrUpdate(i, tmp);
  477. // map = map.Filter(_ => true);
  478. // }
  479. // map.Filter(_ => false);
  480. //}
  481. }
  482. }