TestVector.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/DeprecatedString.h>
  8. #include <AK/NonnullOwnPtrVector.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/ReverseIterator.h>
  11. #include <AK/Vector.h>
  12. TEST_CASE(construct)
  13. {
  14. EXPECT(Vector<int>().is_empty());
  15. EXPECT(Vector<int>().size() == 0);
  16. }
  17. TEST_CASE(ints)
  18. {
  19. Vector<int> ints;
  20. ints.append(1);
  21. ints.append(2);
  22. ints.append(3);
  23. EXPECT_EQ(ints.size(), 3u);
  24. EXPECT_EQ(ints.take_last(), 3);
  25. EXPECT_EQ(ints.size(), 2u);
  26. EXPECT_EQ(ints.take_last(), 2);
  27. EXPECT_EQ(ints.size(), 1u);
  28. EXPECT_EQ(ints.take_last(), 1);
  29. EXPECT_EQ(ints.size(), 0u);
  30. ints.clear();
  31. EXPECT_EQ(ints.size(), 0u);
  32. }
  33. TEST_CASE(strings)
  34. {
  35. Vector<DeprecatedString> strings;
  36. strings.append("ABC");
  37. strings.append("DEF");
  38. int loop_counter = 0;
  39. for (DeprecatedString const& string : strings) {
  40. EXPECT(!string.is_null());
  41. EXPECT(!string.is_empty());
  42. ++loop_counter;
  43. }
  44. loop_counter = 0;
  45. for (auto& string : (const_cast<Vector<DeprecatedString> const&>(strings))) {
  46. EXPECT(!string.is_null());
  47. EXPECT(!string.is_empty());
  48. ++loop_counter;
  49. }
  50. EXPECT_EQ(loop_counter, 2);
  51. }
  52. TEST_CASE(strings_insert_ordered)
  53. {
  54. Vector<DeprecatedString> strings;
  55. strings.append("abc");
  56. strings.append("def");
  57. strings.append("ghi");
  58. strings.insert_before_matching("f-g"sv, [](auto& entry) {
  59. return "f-g"sv < entry;
  60. });
  61. EXPECT_EQ(strings[0], "abc");
  62. EXPECT_EQ(strings[1], "def");
  63. EXPECT_EQ(strings[2], "f-g");
  64. EXPECT_EQ(strings[3], "ghi");
  65. }
  66. TEST_CASE(prepend_vector)
  67. {
  68. Vector<int> ints;
  69. ints.append(1);
  70. ints.append(2);
  71. ints.append(3);
  72. Vector<int> more_ints;
  73. more_ints.append(4);
  74. more_ints.append(5);
  75. more_ints.append(6);
  76. ints.prepend(move(more_ints));
  77. EXPECT_EQ(ints.size(), 6u);
  78. EXPECT_EQ(more_ints.size(), 0u);
  79. EXPECT_EQ(ints[0], 4);
  80. EXPECT_EQ(ints[1], 5);
  81. EXPECT_EQ(ints[2], 6);
  82. EXPECT_EQ(ints[3], 1);
  83. EXPECT_EQ(ints[4], 2);
  84. EXPECT_EQ(ints[5], 3);
  85. ints.prepend(move(more_ints));
  86. EXPECT_EQ(ints.size(), 6u);
  87. EXPECT_EQ(more_ints.size(), 0u);
  88. more_ints.prepend(move(ints));
  89. EXPECT_EQ(more_ints.size(), 6u);
  90. EXPECT_EQ(ints.size(), 0u);
  91. }
  92. TEST_CASE(prepend_vector_object)
  93. {
  94. struct SubObject {
  95. SubObject(int v)
  96. : value(v)
  97. {
  98. }
  99. int value { 0 };
  100. };
  101. struct Object {
  102. Object(NonnullOwnPtr<SubObject>&& a_subobject)
  103. : subobject(move(a_subobject))
  104. {
  105. }
  106. OwnPtr<SubObject> subobject;
  107. };
  108. Vector<Object> objects;
  109. objects.empend(make<SubObject>(1));
  110. objects.empend(make<SubObject>(2));
  111. objects.empend(make<SubObject>(3));
  112. EXPECT_EQ(objects.size(), 3u);
  113. Vector<Object> more_objects;
  114. more_objects.empend(make<SubObject>(4));
  115. more_objects.empend(make<SubObject>(5));
  116. more_objects.empend(make<SubObject>(6));
  117. EXPECT_EQ(more_objects.size(), 3u);
  118. objects.prepend(move(more_objects));
  119. EXPECT_EQ(more_objects.size(), 0u);
  120. EXPECT_EQ(objects.size(), 6u);
  121. EXPECT_EQ(objects[0].subobject->value, 4);
  122. EXPECT_EQ(objects[1].subobject->value, 5);
  123. EXPECT_EQ(objects[2].subobject->value, 6);
  124. EXPECT_EQ(objects[3].subobject->value, 1);
  125. EXPECT_EQ(objects[4].subobject->value, 2);
  126. EXPECT_EQ(objects[5].subobject->value, 3);
  127. }
  128. TEST_CASE(vector_compare)
  129. {
  130. Vector<int> ints;
  131. Vector<int> same_ints;
  132. for (int i = 0; i < 1000; ++i) {
  133. ints.append(i);
  134. same_ints.append(i);
  135. }
  136. EXPECT_EQ(ints.size(), 1000u);
  137. EXPECT_EQ(ints, same_ints);
  138. Vector<DeprecatedString> strings;
  139. Vector<DeprecatedString> same_strings;
  140. for (int i = 0; i < 1000; ++i) {
  141. strings.append(DeprecatedString::number(i));
  142. same_strings.append(DeprecatedString::number(i));
  143. }
  144. EXPECT_EQ(strings.size(), 1000u);
  145. EXPECT_EQ(strings, same_strings);
  146. }
  147. TEST_CASE(grow_past_inline_capacity)
  148. {
  149. auto make_vector = [] {
  150. Vector<DeprecatedString, 16> strings;
  151. for (int i = 0; i < 32; ++i) {
  152. strings.append(DeprecatedString::number(i));
  153. }
  154. return strings;
  155. };
  156. auto strings = make_vector();
  157. EXPECT_EQ(strings.size(), 32u);
  158. EXPECT_EQ(strings[31], "31");
  159. strings.clear();
  160. EXPECT_EQ(strings.size(), 0u);
  161. EXPECT_EQ(strings.capacity(), 16u);
  162. strings = make_vector();
  163. strings.clear_with_capacity();
  164. EXPECT_EQ(strings.size(), 0u);
  165. EXPECT(strings.capacity() >= 32u);
  166. }
  167. BENCHMARK_CASE(vector_append_trivial)
  168. {
  169. // This should be super fast thanks to Vector using memmove.
  170. Vector<int> ints;
  171. for (int i = 0; i < 1000000; ++i) {
  172. ints.append(i);
  173. }
  174. for (int i = 0; i < 100; ++i) {
  175. Vector<int> tmp;
  176. tmp.extend(ints);
  177. EXPECT_EQ(tmp.size(), 1000000u);
  178. }
  179. }
  180. BENCHMARK_CASE(vector_remove_trivial)
  181. {
  182. // This should be super fast thanks to Vector using memmove.
  183. Vector<int> ints;
  184. for (int i = 0; i < 10000; ++i) {
  185. ints.append(i);
  186. }
  187. while (!ints.is_empty()) {
  188. ints.remove(0);
  189. }
  190. EXPECT_EQ(ints.size(), 0u);
  191. }
  192. TEST_CASE(vector_remove)
  193. {
  194. Vector<int> ints;
  195. ints.append(1);
  196. ints.append(2);
  197. ints.append(3);
  198. ints.append(4);
  199. ints.append(5);
  200. ints.remove(1);
  201. EXPECT_EQ(ints.size(), 4u);
  202. EXPECT_EQ(ints[0], 1);
  203. EXPECT_EQ(ints[1], 3);
  204. EXPECT_EQ(ints[2], 4);
  205. EXPECT_EQ(ints[3], 5);
  206. ints.remove(0);
  207. EXPECT_EQ(ints.size(), 3u);
  208. EXPECT_EQ(ints[0], 3);
  209. EXPECT_EQ(ints[1], 4);
  210. EXPECT_EQ(ints[2], 5);
  211. ints.take_last();
  212. EXPECT_EQ(ints.size(), 2u);
  213. EXPECT_EQ(ints[0], 3);
  214. EXPECT_EQ(ints[1], 4);
  215. ints.take_first();
  216. EXPECT_EQ(ints.size(), 1u);
  217. EXPECT_EQ(ints[0], 4);
  218. }
  219. TEST_CASE(remove_all_matching)
  220. {
  221. Vector<int> ints;
  222. ints.append(1);
  223. ints.append(2);
  224. ints.append(3);
  225. ints.append(4);
  226. EXPECT_EQ(ints.size(), 4u);
  227. EXPECT_EQ(ints.remove_all_matching([&](int value) { return value > 2; }), true);
  228. EXPECT_EQ(ints.remove_all_matching([&](int) { return false; }), false);
  229. EXPECT_EQ(ints.size(), 2u);
  230. EXPECT_EQ(ints.remove_all_matching([&](int) { return true; }), true);
  231. EXPECT(ints.is_empty());
  232. EXPECT_EQ(ints.remove_all_matching([&](int) { return true; }), false);
  233. }
  234. TEST_CASE(nonnullownptrvector)
  235. {
  236. struct Object {
  237. DeprecatedString string;
  238. };
  239. Vector<NonnullOwnPtr<Object>> objects;
  240. objects.append(make<Object>());
  241. EXPECT_EQ(objects.size(), 1u);
  242. OwnPtr<Object> o = make<Object>();
  243. objects.append(o.release_nonnull());
  244. EXPECT(o == nullptr);
  245. EXPECT_EQ(objects.size(), 2u);
  246. }
  247. TEST_CASE(insert_trivial)
  248. {
  249. Vector<int> ints;
  250. ints.append(0);
  251. ints.append(10);
  252. ints.append(20);
  253. ints.append(30);
  254. ints.append(40);
  255. ints.insert(2, 15);
  256. EXPECT_EQ(ints.size(), 6u);
  257. EXPECT_EQ(ints[0], 0);
  258. EXPECT_EQ(ints[1], 10);
  259. EXPECT_EQ(ints[2], 15);
  260. EXPECT_EQ(ints[3], 20);
  261. EXPECT_EQ(ints[4], 30);
  262. EXPECT_EQ(ints[5], 40);
  263. }
  264. TEST_CASE(resize_initializes)
  265. {
  266. struct A {
  267. A() { initialized = true; }
  268. bool initialized { false };
  269. };
  270. Vector<A> ints;
  271. ints.resize(32);
  272. for (size_t idx = 0; idx < 32; ++idx)
  273. EXPECT(ints[idx].initialized);
  274. }
  275. TEST_CASE(should_compare_vectors_of_same_type)
  276. {
  277. Vector<int> a {};
  278. Vector<int> b {};
  279. EXPECT(a == b);
  280. EXPECT(!(a != b));
  281. a.append(1);
  282. EXPECT(!(a == b));
  283. EXPECT(a != b);
  284. b.append(1);
  285. EXPECT(a == b);
  286. EXPECT(!(a != b));
  287. a.append(42);
  288. b.append(17);
  289. EXPECT(!(a == b));
  290. EXPECT(a != b);
  291. }
  292. TEST_CASE(should_compare_vectors_of_different_inline_capacity)
  293. {
  294. Vector<int, 1> a {};
  295. Vector<int, 64> b {};
  296. EXPECT(a == b);
  297. EXPECT(!(a != b));
  298. a.append(1);
  299. EXPECT(!(a == b));
  300. EXPECT(a != b);
  301. b.append(1);
  302. EXPECT(a == b);
  303. EXPECT(!(a != b));
  304. a.append(42);
  305. b.append(17);
  306. EXPECT(!(a == b));
  307. EXPECT(a != b);
  308. }
  309. TEST_CASE(should_compare_vectors_of_different_sizes)
  310. {
  311. Vector<int, 0> a {};
  312. Vector<int, 0> b {};
  313. EXPECT(a == b);
  314. EXPECT(!(a != b));
  315. // A is longer
  316. a.append(1);
  317. EXPECT(!(a == b));
  318. EXPECT(a != b);
  319. b.append(1);
  320. EXPECT(a == b);
  321. EXPECT(!(a != b));
  322. // B is longer
  323. b.append(42);
  324. EXPECT(!(a == b));
  325. EXPECT(a != b);
  326. }
  327. TEST_CASE(should_find_value)
  328. {
  329. Vector<int> v { 1, 2, 3, 4, 0, 6, 7, 8, 0, 0 };
  330. auto const expected = v.begin() + 4;
  331. EXPECT_EQ(expected, v.find(0));
  332. }
  333. TEST_CASE(should_find_predicate)
  334. {
  335. Vector<int> v { 1, 2, 3, 4, 0, 6, 7, 8, 0, 0 };
  336. auto const expected = v.begin() + 4;
  337. EXPECT_EQ(expected, v.find_if([](auto const v) { return v == 0; }));
  338. }
  339. TEST_CASE(should_find_index)
  340. {
  341. Vector<int> v { 1, 2, 3, 4, 0, 6, 7, 8, 0, 0 };
  342. EXPECT_EQ(4u, v.find_first_index(0).value());
  343. EXPECT(!v.find_first_index(42).has_value());
  344. }
  345. TEST_CASE(should_contain_start)
  346. {
  347. // Tests whether value is found if at the start of the range.
  348. Vector<int> v { 1, 2, 3, 4, 5 };
  349. EXPECT(v.contains_in_range(1, 0, 4));
  350. }
  351. TEST_CASE(should_contain_end)
  352. {
  353. // Tests whether value is found if at the end of the range.
  354. Vector<int> v { 1, 2, 3, 4, 5 };
  355. EXPECT(v.contains_in_range(5, 0, 4));
  356. }
  357. TEST_CASE(should_contain_range)
  358. {
  359. // Tests whether value is found within a range.
  360. Vector<int> v { 1, 2, 3, 4, 5 };
  361. EXPECT(v.contains_in_range(3, 0, 4));
  362. }
  363. TEST_CASE(should_not_contain_not_present)
  364. {
  365. // Tests whether a value that is not present is not found, as expected.
  366. Vector<int> v { 1, 2, 3, 4, 5 };
  367. EXPECT(!v.contains_in_range(6, 0, 4));
  368. }
  369. TEST_CASE(should_not_contain_present_not_in_range)
  370. {
  371. // Tests whether a value that is present, but not in range, is not found.
  372. Vector<int> v { 1, 2, 3, 4, 5 };
  373. EXPECT(!v.contains_in_range(2, 2, 4));
  374. }
  375. TEST_CASE(can_store_references)
  376. {
  377. int my_integer = 42;
  378. Vector<int&> references;
  379. references.append(my_integer);
  380. references.prepend(my_integer);
  381. EXPECT_EQ(&references.first(), &references.last());
  382. {
  383. Vector<int&> other_references;
  384. other_references.extend(references);
  385. EXPECT_EQ(&other_references.first(), &my_integer);
  386. }
  387. {
  388. Vector<int&> other_references;
  389. other_references = references;
  390. EXPECT_EQ(&other_references.first(), &my_integer);
  391. }
  392. {
  393. auto it = references.find(my_integer);
  394. EXPECT(!it.is_end());
  395. EXPECT_EQ(*it, my_integer);
  396. }
  397. {
  398. int other_integer = 42;
  399. auto index = references.find_first_index(other_integer);
  400. EXPECT(index.has_value());
  401. EXPECT_EQ(index.value_or(99999u), 0u);
  402. }
  403. {
  404. auto integer = 42;
  405. EXPECT(references.contains_slow(integer));
  406. }
  407. {
  408. references.remove(0);
  409. references.ensure_capacity(10);
  410. EXPECT_EQ(&references.take_first(), &my_integer);
  411. }
  412. }
  413. TEST_CASE(reference_deletion_should_not_affect_object)
  414. {
  415. size_t times_deleted = 0;
  416. struct DeleteCounter {
  417. explicit DeleteCounter(size_t& deleted)
  418. : deleted(deleted)
  419. {
  420. }
  421. ~DeleteCounter()
  422. {
  423. ++deleted;
  424. }
  425. size_t& deleted;
  426. };
  427. {
  428. DeleteCounter counter { times_deleted };
  429. Vector<DeleteCounter&> references;
  430. for (size_t i = 0; i < 16; ++i)
  431. references.append(counter);
  432. }
  433. EXPECT_EQ(times_deleted, 1u);
  434. }
  435. TEST_CASE(rbegin)
  436. {
  437. Vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 0 };
  438. auto const expected = v.begin() + 4;
  439. auto const expected_in_reverse = v.rbegin() + 4;
  440. EXPECT_EQ(*expected, *expected_in_reverse);
  441. }
  442. TEST_CASE(rend)
  443. {
  444. Vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 0 };
  445. auto const expected = v.end() - 5;
  446. auto const expected_in_reverse = v.rend() - 5;
  447. EXPECT_EQ(*expected, *expected_in_reverse);
  448. }
  449. TEST_CASE(reverse_iterator_for_loop)
  450. {
  451. Vector<int> v { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  452. int index = 9;
  453. for (auto rev = v.rbegin(); rev != v.rend(); ++rev)
  454. EXPECT_EQ(*rev, index--);
  455. }
  456. TEST_CASE(reverse_range_for_loop)
  457. {
  458. Vector<int> v { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  459. int index = 9;
  460. for (auto item : AK::ReverseWrapper::in_reverse(v))
  461. EXPECT_EQ(item, index--);
  462. index = 9;
  463. for (auto item : v.in_reverse())
  464. EXPECT_EQ(item, index--);
  465. }
  466. static bool is_inline_element(auto& el, auto& vector)
  467. {
  468. uintptr_t vector_ptr = (uintptr_t)&vector;
  469. uintptr_t element_ptr = (uintptr_t)&el;
  470. return (element_ptr >= vector_ptr && element_ptr < (vector_ptr + sizeof(vector)));
  471. }
  472. TEST_CASE(uses_inline_capacity_when_appended_to)
  473. {
  474. Vector<int, 10> v;
  475. v.unchecked_append(1);
  476. v.unchecked_append(123);
  477. v.unchecked_append(50);
  478. v.unchecked_append(43);
  479. for (auto& el : v)
  480. EXPECT(is_inline_element(el, v));
  481. }
  482. TEST_CASE(uses_inline_capacity_when_constructed_from_initializer_list)
  483. {
  484. Vector<int, 10> v { 10, 9, 3, 1, 3 };
  485. for (auto& el : v)
  486. EXPECT(is_inline_element(el, v));
  487. }
  488. TEST_CASE(uses_inline_capacity_when_constructed_from_other_vector)
  489. {
  490. Vector other { 4, 3, 2, 1 };
  491. Vector<int, 10> v(other);
  492. for (auto& el : v)
  493. EXPECT(is_inline_element(el, v));
  494. }
  495. TEST_CASE(uses_inline_capacity_when_constructed_from_span)
  496. {
  497. Array array { "f00", "bar", "baz" };
  498. Vector<char const*, 10> v(array.span());
  499. for (auto& el : v)
  500. EXPECT(is_inline_element(el, v));
  501. }