diff --git a/.gitignore b/.gitignore index 32bf260..76e18ec 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ cmake-build-debug cmake-build-release build Testing/Temporary +_codeql_build_dir diff --git a/_codeql_detected_source_root b/_codeql_detected_source_root new file mode 120000 index 0000000..945c9b4 --- /dev/null +++ b/_codeql_detected_source_root @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/test_main.cpp b/test_main.cpp index 0954af4..49933a6 100644 --- a/test_main.cpp +++ b/test_main.cpp @@ -336,6 +336,76 @@ TEST(RingBufferTest, NonMemberSwapWorks) { EXPECT_EQ(b2.back(), 4); } +// Tests for move and swap with non-trivially copyable types +TEST(RingBufferTest, MoveConstructionWithNonTriviallyCopyableType) { + ring_buffer b1; + b1.push_back("hello"); + b1.push_back("world"); + b1.push_back("test"); + b1.pop_front(); + b1.push_back("data"); + + ring_buffer b2(std::move(b1)); + + EXPECT_TRUE(b1.empty()); + EXPECT_EQ(b2.size(), 3); + EXPECT_EQ(b2.front(), "world"); + EXPECT_EQ(b2.back(), "data"); +} + +TEST(RingBufferTest, MoveAssignmentWithNonTriviallyCopyableType) { + ring_buffer b1; + b1.push_back("foo"); + b1.push_back("bar"); + + ring_buffer b2; + b2.push_back("existing"); + b2 = std::move(b1); + + EXPECT_TRUE(b1.empty()); + EXPECT_EQ(b2.size(), 2); + EXPECT_EQ(b2.front(), "foo"); + EXPECT_EQ(b2.back(), "bar"); +} + +TEST(RingBufferTest, SwapWithNonTriviallyCopyableType) { + ring_buffer b1; + b1.push_back("one"); + b1.push_back("two"); + + ring_buffer b2; + b2.push_back("alpha"); + b2.push_back("beta"); + b2.push_back("gamma"); + + b1.swap(b2); + + EXPECT_EQ(b1.size(), 3); + EXPECT_EQ(b1.front(), "alpha"); + EXPECT_EQ(b1.back(), "gamma"); + EXPECT_EQ(b2.size(), 2); + EXPECT_EQ(b2.front(), "one"); + EXPECT_EQ(b2.back(), "two"); +} + +TEST(RingBufferTest, NonMemberSwapWithNonTriviallyCopyableType) { + ring_buffer, 2> b1; + b1.push_back(std::vector{1, 2, 3}); + b1.push_back(std::vector{4, 5, 6}); + + ring_buffer, 2> b2; + b2.push_back(std::vector{7, 8, 9}); + + using std::swap; + swap(b1, b2); + + EXPECT_EQ(b1.size(), 1); + EXPECT_EQ(b1.front(), (std::vector{7, 8, 9})); + EXPECT_EQ(b2.size(), 2); + EXPECT_EQ(b2.front(), (std::vector{1, 2, 3})); + EXPECT_EQ(b2.back(), (std::vector{4, 5, 6})); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();