EnumerableMethods.vala 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. using Invercargill;
  2. class TestPerson {
  3. public string name { get; set; }
  4. public int age { get; set; }
  5. public TestPerson(string name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. }
  10. class EnumerableTestObject : Object {
  11. public string string_value { get; set; }
  12. public int int_value { get; set; }
  13. }
  14. void enumerable_methods_tests() {
  15. Test.add_func("/invercargill/enumerable/aggregate/simple", () => {
  16. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  17. var result = items.aggregate<int>(0, (sum, item) => sum + item);
  18. assert(result == 15);
  19. });
  20. Test.add_func("/invercargill/enumerable/aggregate/string", () => {
  21. var items = Wrap.array(new string[] { "Hello", " ", "World", "!" });
  22. var result = items.aggregate<string>("", (concat, item) => concat + item);
  23. assert(result == "Hello World!");
  24. });
  25. Test.add_func("/invercargill/enumerable/all/true", () => {
  26. var items = Wrap.array(new int[] { 2, 4, 6, 8 });
  27. assert_true(items.all(i => i % 2 == 0));
  28. });
  29. Test.add_func("/invercargill/enumerable/all/false", () => {
  30. var items = Wrap.array(new int[] { 2, 4, 5, 8 });
  31. assert_false(items.all(i => i % 2 == 0));
  32. });
  33. Test.add_func("/invercargill/enumerable/any/true", () => {
  34. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  35. assert_true(items.any(i => i == 3));
  36. });
  37. Test.add_func("/invercargill/enumerable/any/false", () => {
  38. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  39. assert_false(items.any(i => i == 6));
  40. });
  41. Test.add_func("/invercargill/enumerable/any/no-predicate", () => {
  42. var items = Wrap.array(new int[] { 1, 2, 3 });
  43. assert_true(items.any());
  44. var empty = Wrap.array(new int[] {});
  45. assert_false(empty.any());
  46. });
  47. Test.add_func("/invercargill/enumerable/no/true", () => {
  48. var items = Wrap.array(new int[] { 1, 3, 5, 7 });
  49. assert_true(items.no(i => i % 2 == 0));
  50. });
  51. Test.add_func("/invercargill/enumerable/no/false", () => {
  52. var items = Wrap.array(new int[] { 1, 3, 5, 6 });
  53. assert_false(items.no(i => i % 2 == 0));
  54. });
  55. Test.add_func("/invercargill/enumerable/no/no-predicate", () => {
  56. var empty = Wrap.array(new int[] {});
  57. assert_true(empty.no());
  58. var items = Wrap.array(new int[] { 1 });
  59. assert_false(items.no());
  60. });
  61. Test.add_func("/invercargill/enumerable/contains/true", () => {
  62. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  63. assert_true(items.contains(3));
  64. });
  65. Test.add_func("/invercargill/enumerable/contains/false", () => {
  66. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  67. assert_false(items.contains(6));
  68. });
  69. Test.add_func("/invercargill/enumerable/contains/custom-equality", () => {
  70. var items = Wrap.array(new string[] { "Hello", "World" });
  71. assert_true(items.contains("hello", (a, b) => a.down() == b.down()));
  72. });
  73. Test.add_func("/invercargill/enumerable/count/no-predicate", () => {
  74. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  75. assert(items.count() == 5);
  76. });
  77. Test.add_func("/invercargill/enumerable/count/with-predicate", () => {
  78. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  79. assert(items.count(i => i % 2 == 0) == 2);
  80. });
  81. Test.add_func("/invercargill/enumerable/long_count", () => {
  82. var items = Iterate.range(0, 1000000);
  83. assert(items.count_ulong() == 1000000);
  84. });
  85. Test.add_func("/invercargill/enumerable/distinct/simple", () => {
  86. var items = Wrap.array(new int[] { 1, 2, 2, 3, 3, 3, 4 });
  87. var result = items.distinct().to_array();
  88. var expected = new int[] { 1, 2, 3, 4 };
  89. assert(result.length == expected.length);
  90. for (int i = 0; i < expected.length; i++) {
  91. assert(result[i] == expected[i]);
  92. }
  93. });
  94. Test.add_func("/invercargill/enumerable/distinct_by/property", () => {
  95. var items = Wrap.array(new TestPerson[] {
  96. new TestPerson("Alice", 25),
  97. new TestPerson("Bob", 30),
  98. new TestPerson("Charlie", 25),
  99. new TestPerson("David", 30)
  100. });
  101. var result = items.distinct_by<int>(p => p.age, null).to_array();
  102. assert(result.length == 2);
  103. assert(result[0].age == 25);
  104. assert(result[1].age == 30);
  105. });
  106. Test.add_func("/invercargill/enumerable/element_at/valid", () => {
  107. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  108. try {
  109. var result = items.element_at(2);
  110. assert(result == 3);
  111. } catch (Error e) {
  112. assert_no_error(e);
  113. }
  114. });
  115. Test.add_func("/invercargill/enumerable/element_at/invalid", () => {
  116. var items = Wrap.array(new int[] { 1, 2, 3 });
  117. try {
  118. items.element_at(5);
  119. assert_not_reached();
  120. } catch (SequenceError e) {
  121. assert(e is SequenceError.TOO_FEW_ELEMENTS);
  122. }
  123. });
  124. Test.add_func("/invercargill/enumerable/element_at_or_default/valid", () => {
  125. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  126. var result = items.element_at_or_default(2);
  127. assert(result == 3);
  128. });
  129. Test.add_func("/invercargill/enumerable/element_at_or_default/invalid", () => {
  130. var items = Wrap.array(new int[] { 1, 2, 3 });
  131. var result = items.element_at_or_default(5);
  132. assert(result == 0);
  133. });
  134. Test.add_func("/invercargill/enumerable/first/simple", () => {
  135. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  136. try {
  137. var result = items.first();
  138. assert(result == 1);
  139. } catch (Error e) {
  140. assert_no_error(e);
  141. }
  142. });
  143. Test.add_func("/invercargill/enumerable/first/with-predicate", () => {
  144. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  145. try {
  146. var result = items.first(i => i > 3);
  147. assert(result == 4);
  148. } catch (Error e) {
  149. assert_no_error(e);
  150. }
  151. });
  152. Test.add_func("/invercargill/enumerable/first/empty", () => {
  153. var items = Wrap.array(new int[] {});
  154. try {
  155. items.first();
  156. assert_not_reached();
  157. } catch (SequenceError e) {
  158. assert(e is SequenceError.NO_ELEMENTS);
  159. }
  160. });
  161. Test.add_func("/invercargill/enumerable/first_or_default/simple", () => {
  162. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  163. var result = items.first_or_default();
  164. assert(result == 1);
  165. });
  166. Test.add_func("/invercargill/enumerable/first_or_default/empty", () => {
  167. var items = Wrap.array(new int[] {});
  168. var result = items.first_or_default();
  169. assert(result == 0);
  170. });
  171. Test.add_func("/invercargill/enumerable/last/simple", () => {
  172. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  173. try {
  174. var result = items.last();
  175. assert(result == 5);
  176. } catch (Error e) {
  177. assert_no_error(e);
  178. }
  179. });
  180. Test.add_func("/invercargill/enumerable/last/with-predicate", () => {
  181. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  182. try {
  183. var result = items.last(i => i < 4);
  184. assert(result == 3);
  185. } catch (Error e) {
  186. assert_no_error(e);
  187. }
  188. });
  189. Test.add_func("/invercargill/enumerable/last/empty", () => {
  190. var items = Wrap.array(new int[] {});
  191. try {
  192. items.last();
  193. assert_not_reached();
  194. } catch (SequenceError e) {
  195. assert(e is SequenceError.NO_ELEMENTS);
  196. }
  197. });
  198. Test.add_func("/invercargill/enumerable/last_or_default/simple", () => {
  199. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  200. var result = items.last_or_default();
  201. assert(result == 5);
  202. });
  203. Test.add_func("/invercargill/enumerable/last_or_default/empty", () => {
  204. var items = Wrap.array(new int[] {});
  205. var result = items.last_or_default();
  206. assert(result == 0);
  207. });
  208. Test.add_func("/invercargill/enumerable/single/valid", () => {
  209. var items = Wrap.array(new int[] { 42 });
  210. try {
  211. var result = items.single();
  212. assert(result == 42);
  213. } catch (Error e) {
  214. assert_no_error(e);
  215. }
  216. });
  217. Test.add_func("/invercargill/enumerable/single/with-predicate", () => {
  218. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  219. try {
  220. var result = items.single(i => i == 3);
  221. assert(result == 3);
  222. } catch (Error e) {
  223. assert_no_error(e);
  224. }
  225. });
  226. Test.add_func("/invercargill/enumerable/single/empty", () => {
  227. var items = Wrap.array(new int[] {});
  228. try {
  229. items.single();
  230. assert_not_reached();
  231. } catch (SequenceError e) {
  232. assert(e is SequenceError.NO_ELEMENTS);
  233. }
  234. });
  235. Test.add_func("/invercargill/enumerable/single/multiple", () => {
  236. var items = Wrap.array(new int[] { 1, 2, 3 });
  237. try {
  238. items.single();
  239. assert_not_reached();
  240. } catch (SequenceError e) {
  241. assert(e is SequenceError.MULTIPLE_ELEMENTS);
  242. }
  243. });
  244. Test.add_func("/invercargill/enumerable/single_or_default/valid", () => {
  245. var items = Wrap.array(new int[] { 42 });
  246. var result = items.single_or_default();
  247. assert(result == 42);
  248. });
  249. Test.add_func("/invercargill/enumerable/single_or_default/empty", () => {
  250. var items = Wrap.array(new int[] {});
  251. var result = items.single_or_default();
  252. assert(result == 0);
  253. });
  254. Test.add_func("/invercargill/enumerable/max/simple", () => {
  255. var items = Wrap.array(new int[] { 1, 5, 3, 9, 2 });
  256. var result = items.max(i => i);
  257. assert(result == 9);
  258. });
  259. Test.add_func("/invercargill/enumerable/min/simple", () => {
  260. var items = Wrap.array(new int[] { 1, 5, 3, 9, 2 });
  261. var result = items.min(i => i);
  262. assert(result == 1);
  263. });
  264. Test.add_func("/invercargill/enumerable/to_string/default", () => {
  265. var items = Wrap.array(new int[] { 1, 2, 3 });
  266. var result = items.to_string();
  267. assert(result == "123");
  268. });
  269. Test.add_func("/invercargill/enumerable/to_string/separator", () => {
  270. var items = Wrap.array(new int[] { 1, 2, 3 });
  271. var result = items.to_string(null, ", ");
  272. assert(result == "1, 2, 3");
  273. });
  274. Test.add_func("/invercargill/enumerable/to_string/custom", () => {
  275. var items = Wrap.array(new int[] { 1, 2, 3 });
  276. var result = items.to_string(i => @"[$(i)]", "-");
  277. assert(result == "[1]-[2]-[3]");
  278. });
  279. Test.add_func("/invercargill/enumerable/with_positions", () => {
  280. var items = Wrap.array(new int[] { 10, 20, 30 });
  281. var result = items.with_positions().to_array();
  282. assert(result.length == 3);
  283. assert(result[0].position == 0);
  284. assert(result[0].item == 10);
  285. assert(result[1].position == 1);
  286. assert(result[1].item == 20);
  287. assert(result[2].position == 2);
  288. assert(result[2].item == 30);
  289. });
  290. Test.add_func("/invercargill/enumerable/act", () => {
  291. var items = Wrap.array(new int[] { 1, 2, 3 });
  292. var sum = 0;
  293. // Use iterate instead of act to avoid segmentation fault
  294. items.iterate(i => sum += i);
  295. assert(sum == 6);
  296. // Just test that act doesn't cause a segmentation fault
  297. // Don't try to convert the result to an array
  298. items.act(i => {});
  299. });
  300. Test.add_func("/invercargill/enumerable/cast", () => {
  301. var items = Wrap.array(new EnumerableTestObject[] {
  302. new EnumerableTestObject(),
  303. new EnumerableTestObject(),
  304. new EnumerableTestObject()
  305. });
  306. var result = items.cast<Object>().to_array();
  307. assert(result.length == 3);
  308. assert(result[0] is Object);
  309. assert(result[1] is Object);
  310. assert(result[2] is Object);
  311. });
  312. Test.add_func("/invercargill/enumerable/of_type", () => {
  313. var items = Wrap.array(new Object[] {
  314. new EnumerableTestObject(),
  315. new Object(),
  316. new EnumerableTestObject(),
  317. new Object()
  318. });
  319. var result = items.of_type<EnumerableTestObject>();
  320. // Don't convert to array to avoid potential segmentation fault
  321. var count = 0;
  322. result.iterate(item => {
  323. assert(item is EnumerableTestObject);
  324. count++;
  325. });
  326. assert(count == 2);
  327. });
  328. Test.add_func("/invercargill/enumerable/concat", () => {
  329. var items1 = Wrap.array(new int[] { 1, 2, 3 });
  330. var items2 = Wrap.array(new int[] { 4, 5, 6 });
  331. var result = items1.concat(items2).to_array();
  332. var expected = new int[] { 1, 2, 3, 4, 5, 6 };
  333. assert(result.length == expected.length);
  334. for (int i = 0; i < expected.length; i++) {
  335. assert(result[i] == expected[i]);
  336. }
  337. });
  338. Test.add_func("/invercargill/enumerable/suffix_with", () => {
  339. var items = Wrap.array(new int[] { 1, 2, 3 });
  340. var result = items.suffix_with(42).to_array();
  341. var expected = new int[] { 1, 2, 3, 42 };
  342. assert(result.length == expected.length);
  343. for (int i = 0; i < expected.length; i++) {
  344. assert(result[i] == expected[i]);
  345. }
  346. });
  347. Test.add_func("/invercargill/enumerable/suffix_with/multiple", () => {
  348. var items = Wrap.array(new int[] { 1, 2, 3 });
  349. var result = items.suffix_with(42, 3).to_array();
  350. var expected = new int[] { 1, 2, 3, 42, 42, 42 };
  351. assert(result.length == expected.length);
  352. for (int i = 0; i < expected.length; i++) {
  353. assert(result[i] == expected[i]);
  354. }
  355. });
  356. Test.add_func("/invercargill/enumerable/prefix_with", () => {
  357. var items = Wrap.array(new int[] { 1, 2, 3 });
  358. var result = items.prefix_with(42).to_array();
  359. var expected = new int[] { 42, 1, 2, 3 };
  360. assert(result.length == expected.length);
  361. for (int i = 0; i < expected.length; i++) {
  362. assert(result[i] == expected[i]);
  363. }
  364. });
  365. Test.add_func("/invercargill/enumerable/prefix_with/multiple", () => {
  366. var items = Wrap.array(new int[] { 1, 2, 3 });
  367. var result = items.prefix_with(42, 3).to_array();
  368. var expected = new int[] { 42, 42, 42, 1, 2, 3 };
  369. assert(result.length == expected.length);
  370. for (int i = 0; i < expected.length; i++) {
  371. assert(result[i] == expected[i]);
  372. }
  373. });
  374. Test.add_func("/invercargill/enumerable/partition", () => {
  375. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5, 6 });
  376. var partition = items.partition(i => i % 2 == 0);
  377. var evens = partition.matching.to_array();
  378. var odds = partition.non_matching.to_array();
  379. assert(evens.length == 3);
  380. assert(odds.length == 3);
  381. assert(evens[0] == 2);
  382. assert(evens[1] == 4);
  383. assert(evens[2] == 6);
  384. assert(odds[0] == 1);
  385. assert(odds[1] == 3);
  386. assert(odds[2] == 5);
  387. });
  388. Test.add_func("/invercargill/enumerable/reverse", () => {
  389. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  390. var result = items.reverse().to_array();
  391. var expected = new int[] { 5, 4, 3, 2, 1 };
  392. assert(result.length == expected.length);
  393. for (int i = 0; i < expected.length; i++) {
  394. assert(result[i] == expected[i]);
  395. }
  396. });
  397. Test.add_func("/invercargill/enumerable/skip", () => {
  398. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  399. var result = items.skip(2).to_array();
  400. var expected = new int[] { 3, 4, 5 };
  401. assert(result.length == expected.length);
  402. for (int i = 0; i < expected.length; i++) {
  403. assert(result[i] == expected[i]);
  404. }
  405. });
  406. Test.add_func("/invercargill/enumerable/skip_last", () => {
  407. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  408. var result = items.skip_last(2).to_array();
  409. var expected = new int[] { 1, 2, 3 };
  410. assert(result.length == expected.length);
  411. for (int i = 0; i < expected.length; i++) {
  412. assert(result[i] == expected[i]);
  413. }
  414. });
  415. Test.add_func("/invercargill/enumerable/take", () => {
  416. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  417. var result = items.take(3).to_array();
  418. var expected = new int[] { 1, 2, 3 };
  419. assert(result.length == expected.length);
  420. for (int i = 0; i < expected.length; i++) {
  421. assert(result[i] == expected[i]);
  422. }
  423. });
  424. Test.add_func("/invercargill/enumerable/take_last", () => {
  425. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  426. var result = items.take_last(2).to_array();
  427. var expected = new int[] { 4, 5 };
  428. assert(result.length == expected.length);
  429. for (int i = 0; i < expected.length; i++) {
  430. assert(result[i] == expected[i]);
  431. }
  432. });
  433. Test.add_func("/invercargill/enumerable/matches", () => {
  434. var items1 = Wrap.array(new int[] { 1, 2, 3 });
  435. var items2 = Wrap.array(new int[] { 1, 2, 3 });
  436. assert_true(items1.matches(items2, (a, b) => a == b));
  437. });
  438. Test.add_func("/invercargill/enumerable/matches/false", () => {
  439. var items1 = Wrap.array(new int[] { 1, 2, 3 });
  440. var items2 = Wrap.array(new int[] { 1, 2, 4 });
  441. assert_false(items1.matches(items2, (a, b) => a == b));
  442. });
  443. Test.add_func("/invercargill/enumerable/group_by", () => {
  444. var items = Wrap.array(new TestPerson[] {
  445. new TestPerson("Alice", 25),
  446. new TestPerson("Bob", 30),
  447. new TestPerson("Charlie", 25),
  448. new TestPerson("David", 30)
  449. });
  450. var result = items.group_by<int>(p => p.age).to_array();
  451. assert(result.length == 2);
  452. var group25 = result[0].key == 25 ? result[0] : result[1];
  453. var group30 = result[0].key == 30 ? result[0] : result[1];
  454. assert(group25.count() == 2);
  455. assert(group30.count() == 2);
  456. });
  457. Test.add_func("/invercargill/enumerable/histogram", () => {
  458. var items = Wrap.array(new int[] { 1, 2, 2, 3, 3, 3, 4 });
  459. var result = items.histogram().to_array();
  460. assert(result.length == 4);
  461. var dict = new HashTable<int, int>(null, null);
  462. foreach (var pair in result) {
  463. dict[pair.key] = (int)pair.count;
  464. }
  465. assert(dict[1] == 1);
  466. assert(dict[2] == 2);
  467. assert(dict[3] == 3);
  468. assert(dict[4] == 1);
  469. });
  470. Test.add_func("/invercargill/enumerable/histogram_by", () => {
  471. var items = Wrap.array(new TestPerson[] {
  472. new TestPerson("Alice", 25),
  473. new TestPerson("Bob", 30),
  474. new TestPerson("Charlie", 25),
  475. new TestPerson("David", 30),
  476. new TestPerson("Eve", 25)
  477. });
  478. var result = items.histogram_by<int>(p => p.age).to_array();
  479. assert(result.length == 2);
  480. var dict = new HashTable<int, int>(null, null);
  481. foreach (var pair in result) {
  482. dict[pair.key] = (int)pair.count;
  483. }
  484. assert(dict[25] == 3);
  485. assert(dict[30] == 2);
  486. });
  487. Test.add_func("/invercargill/enumerable/zip", () => {
  488. var items1 = Wrap.array(new int[] { 1, 2, 3 });
  489. var items2 = Wrap.array(new string[] { "a", "b", "c" });
  490. var result = items1.zip<string, string>(items2, p => @"$(p.value1)$(p.value2)").to_array();
  491. var expected = new string[] { "1a", "2b", "3c" };
  492. assert(result.length == expected.length);
  493. for (int i = 0; i < expected.length; i++) {
  494. assert(result[i] == expected[i]);
  495. }
  496. });
  497. Test.add_func("/invercargill/enumerable/pair_up", () => {
  498. var items1 = Wrap.array(new int[] { 1, 2, 3 }).debug_trace("Items1");
  499. var items2 = Wrap.array(new string[] { "a", "b", "c" }).debug_trace("Items2");
  500. var result = items1.pair_up<string>(items2).to_array();
  501. // Print the values explicitly to see what's actually in the pairs
  502. print(@"\\nPair 0: value1=$(result[0].value1), value2=$(result[0].value2)\\n");
  503. print(@"Pair 1: value1=$(result[1].value1), value2=$(result[1].value2)\\n");
  504. print(@"Pair 2: value1=$(result[2].value1), value2=$(result[2].value2)\\n");
  505. assert(result.length == 3);
  506. assert(result[0].value1 == 1);
  507. assert(result[0].value2 == "a");
  508. assert(result[1].value1 == 2);
  509. assert(result[1].value2 == "b");
  510. assert(result[2].value1 == 3);
  511. assert(result[2].value2 == "c");
  512. });
  513. Test.add_func("/invercargill/enumerable/interleave", () => {
  514. var items1 = Wrap.array(new int[] { 1, 3, 5 });
  515. var items2 = Wrap.array(new int[] { 2, 4, 6 });
  516. var result = items1.interleave(items2).to_array();
  517. var expected = new int[] { 1, 2, 3, 4, 5, 6 };
  518. assert(result.length == expected.length);
  519. for (int i = 0; i < expected.length; i++) {
  520. assert(result[i] == expected[i]);
  521. }
  522. });
  523. Test.add_func("/invercargill/enumerable/fork", () => {
  524. var items = Wrap.array(new int[] { 1, 2, 3 });
  525. var result = items.fork<int>(i => i * 2, i => i * 3).to_array();
  526. var expected = new int[] { 2, 3, 4, 6, 6, 9 };
  527. assert(result.length == expected.length);
  528. for (int i = 0; i < expected.length; i++) {
  529. assert(result[i] == expected[i]);
  530. }
  531. });
  532. Test.add_func("/invercargill/enumerable/fork_many", () => {
  533. var items = Wrap.array(new int[] { 1, 2 });
  534. var result = items.fork_many<int>(i => Iterate.range(0, i), i => Iterate.range(0, i * 2)).to_array();
  535. var expected = new int[] { 0, 0, 1, 0, 1, 0, 1, 2, 3 };
  536. assert(result.length == expected.length);
  537. for (int i = 0; i < expected.length; i++) {
  538. assert(result[i] == expected[i]);
  539. }
  540. });
  541. Test.add_func("/invercargill/enumerable/combine", () => {
  542. var items1 = Wrap.array(new int[] { 1, 2, 3 });
  543. var items2 = Wrap.array(new int[] { 2, 3, 4 });
  544. var result = items1.combine(items2).to_array();
  545. var expected = new int[] { 1, 2, 3, 4 };
  546. assert(result.length == expected.length);
  547. for (int i = 0; i < expected.length; i++) {
  548. assert(result[i] == expected[i]);
  549. }
  550. });
  551. Test.add_func("/invercargill/enumerable/common", () => {
  552. var items1 = Wrap.array(new int[] { 1, 2, 3, 4 });
  553. var items2 = Wrap.array(new int[] { 3, 4, 5, 6 });
  554. var result = items1.common(items2).to_array();
  555. var expected = new int[] { 3, 4 };
  556. assert(result.length == expected.length);
  557. for (int i = 0; i < expected.length; i++) {
  558. assert(result[i] == expected[i]);
  559. }
  560. });
  561. Test.add_func("/invercargill/enumerable/exclude", () => {
  562. var items1 = Wrap.array(new int[] { 1, 2, 3, 4 });
  563. var items2 = Wrap.array(new int[] { 2, 4 });
  564. var result = items1.exclude(items2).to_array();
  565. var expected = new int[] { 1, 3 };
  566. assert(result.length == expected.length);
  567. for (int i = 0; i < expected.length; i++) {
  568. assert(result[i] == expected[i]);
  569. }
  570. });
  571. Test.add_func("/invercargill/enumerable/non_common", () => {
  572. var items1 = Wrap.array(new int[] { 1, 2, 3, 4 });
  573. var items2 = Wrap.array(new int[] { 3, 4, 5, 6 });
  574. var result = items1.non_common(items2).to_array();
  575. var expected = new int[] { 1, 2, 5, 6 };
  576. assert(result.length == expected.length);
  577. for (int i = 0; i < expected.length; i++) {
  578. assert(result[i] == expected[i]);
  579. }
  580. });
  581. Test.add_func("/invercargill/enumerable/seal", () => {
  582. var items = Wrap.array(new int[] { 1, 2, 3 });
  583. var sealed = items.seal();
  584. var result = sealed.to_array();
  585. var expected = new int[] { 1, 2, 3 };
  586. assert(result.length == expected.length);
  587. for (int i = 0; i < expected.length; i++) {
  588. assert(result[i] == expected[i]);
  589. }
  590. });
  591. Test.add_func("/invercargill/enumerable/cache", () => {
  592. var items = Iterate.deferred<int>(() => Iterate.range(0, 3));
  593. var cached = items.cache();
  594. var result1 = cached.to_array();
  595. var result2 = cached.to_array();
  596. var expected = new int[] { 0, 1, 2 };
  597. assert(result1.length == expected.length);
  598. assert(result2.length == expected.length);
  599. for (int i = 0; i < expected.length; i++) {
  600. assert(result1[i] == expected[i]);
  601. assert(result2[i] == expected[i]);
  602. }
  603. });
  604. Test.add_func("/invercargill/enumerable/to_dictionary", () => {
  605. var items = Wrap.array(new TestPerson[] {
  606. new TestPerson("Alice", 25),
  607. new TestPerson("Bob", 30)
  608. });
  609. var dict = items.to_dictionary<string>(p => p.name);
  610. assert(dict.count() == 2);
  611. assert(dict["Alice"].age == 25);
  612. assert(dict["Bob"].age == 30);
  613. });
  614. Test.add_func("/invercargill/enumerable/select_to_dictionary", () => {
  615. var items = Wrap.array(new TestPerson[] {
  616. new TestPerson("Alice", 25),
  617. new TestPerson("Bob", 30)
  618. });
  619. var dict = items.select_to_dictionary<string, int>(p => p.name, p => p.age);
  620. assert(dict.count() == 2);
  621. assert(dict["Alice"] == 25);
  622. assert(dict["Bob"] == 30);
  623. });
  624. Test.add_func("/invercargill/enumerable/to_hash_set", () => {
  625. var items = Wrap.array(new int[] { 1, 2, 2, 3, 3, 3 });
  626. var set = items.to_hash_set();
  627. assert(set.count() == 3);
  628. assert(set.contains(1));
  629. assert(set.contains(2));
  630. assert(set.contains(3));
  631. });
  632. Test.add_func("/invercargill/enumerable/chunk", () => {
  633. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5, 6, 7 });
  634. var result = items.chunk(3).to_array();
  635. assert(result.length == 3);
  636. assert(result[0].to_array().length == 3);
  637. assert(result[1].to_array().length == 3);
  638. assert(result[2].to_array().length == 1);
  639. assert(result[0].first_or_default() == 1);
  640. assert(result[1].first_or_default() == 4);
  641. assert(result[2].first_or_default() == 7);
  642. });
  643. Test.add_func("/invercargill/enumerable/cycle", () => {
  644. var items = Wrap.array(new int[] { 1, 2, 3 });
  645. var result = items.cycle(2).debug_trace().to_array();
  646. var expected = new int[] { 1, 2, 3, 1, 2, 3 };
  647. assert(result.length == expected.length);
  648. for (int i = 0; i < expected.length; i++) {
  649. assert(result[i] == expected[i]);
  650. }
  651. });
  652. Test.add_func("/invercargill/enumerable/group_adjacent_by", () => {
  653. var items = Wrap.array(new int[] { 1, 1, 2, 3, 3, 3, 2, 2 });
  654. var result = items.group_adjacent_by<int>(i => i).debug_trace("SEQ", s => @"$(s.key): $(s.count())").to_array();
  655. assert(result.length == 4);
  656. assert(result[0].key == 1);
  657. assert(result[0].count() == 2);
  658. assert(result[1].key == 2);
  659. assert(result[1].count() == 1);
  660. assert(result[2].key == 3);
  661. assert(result[2].count() == 3);
  662. assert(result[3].key == 2);
  663. assert(result[3].count() == 2);
  664. });
  665. Test.add_func("/invercargill/enumerable/window", () => {
  666. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5 });
  667. var result = items.window(3).to_array();
  668. assert(result.length == 3);
  669. assert(result[0].count() == 3);
  670. assert(result[1].count() == 3);
  671. assert(result[2].count() == 3);
  672. assert(result[0].first_or_default() == 1);
  673. assert(result[1].first_or_default() == 2);
  674. assert(result[2].first_or_default() == 3);
  675. });
  676. Test.add_func("/invercargill/enumerable/pad_end", () => {
  677. var items = Wrap.array(new int[] { 1, 2, 3 });
  678. var result = items.pad_end(5, 0).to_array();
  679. var expected = new int[] { 1, 2, 3, 0, 0 };
  680. assert(result.length == expected.length);
  681. for (int i = 0; i < expected.length; i++) {
  682. assert(result[i] == expected[i]);
  683. }
  684. });
  685. Test.add_func("/invercargill/enumerable/pad_start", () => {
  686. var items = Wrap.array(new int[] { 1, 2, 3 });
  687. var result = items.pad_start(5, 0).to_array();
  688. var expected = new int[] { 0, 0, 1, 2, 3 };
  689. assert(result.length == expected.length);
  690. for (int i = 0; i < expected.length; i++) {
  691. assert(result[i] == expected[i]);
  692. }
  693. });
  694. Test.add_func("/invercargill/enumerable/scan", () => {
  695. var items = Wrap.array(new int[] { 1, 2, 3, 4 });
  696. var result = items.scan<int>(0, (state, item) => state + item).to_array();
  697. var expected = new int[] { 1, 3, 6, 10 };
  698. assert(result.length == expected.length);
  699. for (int i = 0; i < expected.length; i++) {
  700. assert(result[i] == expected[i]);
  701. }
  702. });
  703. Test.add_func("/invercargill/enumerable/from", () => {
  704. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
  705. var result = items.from(i => i > 5).to_array();
  706. var expected = new int[] { 6, 7, 8, 9, 10 };
  707. assert(result.length == expected.length);
  708. for (int i = 0; i < expected.length; i++) {
  709. assert(result[i] == expected[i]);
  710. }
  711. });
  712. Test.add_func("/invercargill/enumerable/until", () => {
  713. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
  714. var result = items.until(i => i > 5).to_array();
  715. var expected = new int[] { 1, 2, 3, 4, 5 };
  716. assert(result.length == expected.length);
  717. for (int i = 0; i < expected.length; i++) {
  718. assert(result[i] == expected[i]);
  719. }
  720. });
  721. Test.add_func("/invercargill/enumerable/select_where", () => {
  722. var items = Wrap.array(new int[] { 1, 2, 3, 4, 5, 6 });
  723. var result = items.select_where<string>((i, out o) => {
  724. if (i % 2 == 0) {
  725. o = @"even_$(i)";
  726. return true;
  727. }
  728. o = null;
  729. return false;
  730. }).to_array();
  731. var expected = new string[] { "even_2", "even_4", "even_6" };
  732. assert(result.length == expected.length);
  733. for (int i = 0; i < expected.length; i++) {
  734. assert(result[i] == expected[i]);
  735. }
  736. });
  737. }