aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd/tests/src/vector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd/tests/src/vector.cpp')
-rw-r--r--libs/kstd/tests/src/vector.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/libs/kstd/tests/src/vector.cpp b/libs/kstd/tests/src/vector.cpp
index d4c5e4f..0735c9a 100644
--- a/libs/kstd/tests/src/vector.cpp
+++ b/libs/kstd/tests/src/vector.cpp
@@ -462,6 +462,19 @@ SCENARIO("Vector modifiers", "[vector]")
REQUIRE(v[1] == 20);
}
}
+
+ WHEN("inserting an element")
+ {
+ auto it = v.insert(v.cbegin(), 42);
+
+ THEN("the size and capacity increase and the element is inserted")
+ {
+ REQUIRE(v.size() == 1);
+ REQUIRE(v.capacity() >= 1);
+ REQUIRE(v[0] == 42);
+ REQUIRE(it == v.begin());
+ }
+ }
}
GIVEN("A populated vector")
@@ -538,6 +551,104 @@ SCENARIO("Vector modifiers", "[vector]")
REQUIRE(v.capacity() == initial_capacity);
}
}
+
+ WHEN("inserting at the beginning")
+ {
+ auto it = v.insert(v.cbegin(), 5);
+
+ THEN("the element is inserted at the front")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0] == 5);
+ REQUIRE(v[1] == 10);
+ REQUIRE(v[2] == 20);
+ REQUIRE(v[3] == 30);
+ REQUIRE(it == v.begin());
+ }
+ }
+
+ WHEN("inserting in the middle")
+ {
+ auto it = v.insert(v.cbegin() + 1, 15);
+
+ THEN("the element is inserted in the middle")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0] == 10);
+ REQUIRE(v[1] == 15);
+ REQUIRE(v[2] == 20);
+ REQUIRE(v[3] == 30);
+ REQUIRE(it == v.begin() + 1);
+ }
+ }
+
+ WHEN("inserting at the end")
+ {
+ auto it = v.insert(v.cend(), 40);
+
+ THEN("the element is inserted at the back")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0] == 10);
+ REQUIRE(v[1] == 20);
+ REQUIRE(v[2] == 30);
+ REQUIRE(v[3] == 40);
+ REQUIRE(it == v.begin() + 3);
+ }
+ }
+
+ WHEN("inserting when capacity is sufficient")
+ {
+ v.reserve(10);
+ auto const capacity = v.capacity();
+
+ auto it = v.insert(v.cbegin() + 1, 15);
+
+ THEN("the element is added without reallocation")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v.capacity() == capacity);
+ REQUIRE(v[0] == 10);
+ REQUIRE(v[1] == 15);
+ REQUIRE(v[2] == 20);
+ REQUIRE(v[3] == 30);
+ REQUIRE(it == v.begin() + 1);
+ }
+ }
+
+ WHEN("inserting a reference to an existing element with reallocation")
+ {
+ v.shrink_to_fit();
+ REQUIRE(v.capacity() == v.size());
+ auto it = v.insert(v.cbegin() + 1, v[2]);
+
+ THEN("the element is correctly copied and inserted")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0] == 10);
+ REQUIRE(v[1] == 30);
+ REQUIRE(v[2] == 20);
+ REQUIRE(v[3] == 30);
+ REQUIRE(it == v.begin() + 1);
+ }
+ }
+
+ WHEN("inserting a reference to an existing element without reallocation")
+ {
+ v.reserve(10);
+ REQUIRE(v.capacity() > v.size());
+ auto it = v.insert(v.cbegin() + 1, v[2]);
+
+ THEN("the element is correctly copied and inserted")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0] == 10);
+ REQUIRE(v[1] == 30);
+ REQUIRE(v[2] == 20);
+ REQUIRE(v[3] == 30);
+ REQUIRE(it == v.begin() + 1);
+ }
+ }
}
}
@@ -709,6 +820,55 @@ SCENARIO("Vector modifier move semantics", "[vector]")
}
}
}
+
+ GIVEN("A populated vector of move trackers")
+ {
+ auto v = kstd::vector<kstd::tests::move_tracker>{};
+ v.reserve(10);
+ v.emplace_back(10);
+ v.emplace_back(20);
+ v.emplace_back(30);
+
+ WHEN("inserting an element in the middle with sufficient capacity")
+ {
+ auto const tracker = kstd::tests::move_tracker{15};
+ v.insert(v.cbegin() + 1, tracker);
+
+ THEN("the shifted elements are move-assigned and the new element is copy-assigned")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0].value == 10);
+ REQUIRE_FALSE(v[0].was_moved);
+ REQUIRE(v[1].value == 15);
+ REQUIRE(v[1].was_copied);
+ REQUIRE_FALSE(v[1].was_moved);
+ REQUIRE(v[2].value == 20);
+ REQUIRE(v[2].was_moved);
+ REQUIRE(v[3].value == 30);
+ REQUIRE(v[3].was_moved);
+ }
+ }
+
+ WHEN("inserting an rvalue element in the middle with sufficient capacity")
+ {
+ auto tracker = kstd::tests::move_tracker{15};
+ v.insert(v.cbegin() + 1, std::move(tracker));
+
+ THEN("the shifted elements are move-assigned and the new element is move-assigned")
+ {
+ REQUIRE(v.size() == 4);
+ REQUIRE(v[0].value == 10);
+ REQUIRE_FALSE(v[0].was_moved);
+ REQUIRE(v[1].value == 15);
+ REQUIRE_FALSE(v[1].was_copied);
+ REQUIRE(v[1].was_moved);
+ REQUIRE(v[2].value == 20);
+ REQUIRE(v[2].was_moved);
+ REQUIRE(v[3].value == 30);
+ REQUIRE(v[3].was_moved);
+ }
+ }
+ }
}
SCENARIO("Vector advanced construction", "[vector]")