diff --git a/AK/NoAllocationGuard.h b/AK/NoAllocationGuard.h index 19356541dd..e009644196 100644 --- a/AK/NoAllocationGuard.h +++ b/AK/NoAllocationGuard.h @@ -58,7 +58,7 @@ private: #endif } - bool m_allocation_enabled_previously; + bool m_allocation_enabled_previously { true }; }; } diff --git a/Tests/AK/TestFixedArray.cpp b/Tests/AK/TestFixedArray.cpp index 872f97767b..b0c6ca8f31 100644 --- a/Tests/AK/TestFixedArray.cpp +++ b/Tests/AK/TestFixedArray.cpp @@ -4,14 +4,16 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include -#include +#include TEST_CASE(construct) { - EXPECT(FixedArray().size() == 0); + EXPECT_EQ(FixedArray().size(), 0u); + EXPECT_EQ(FixedArray::must_create_but_fixme_should_propagate_errors(1985).size(), 1985u); } TEST_CASE(ints) @@ -24,3 +26,56 @@ TEST_CASE(ints) EXPECT_EQ(ints[1], 1); EXPECT_EQ(ints[2], 2); } + +TEST_CASE(swap) +{ + FixedArray first = FixedArray::must_create_but_fixme_should_propagate_errors(4); + FixedArray second = FixedArray::must_create_but_fixme_should_propagate_errors(5); + first[3] = 1; + second[3] = 2; + first.swap(second); + EXPECT_EQ(first.size(), 5u); + EXPECT_EQ(second.size(), 4u); + EXPECT_EQ(first[3], 2); + EXPECT_EQ(second[3], 1); +} + +TEST_CASE(move) +{ + FixedArray moved_from_array = FixedArray::must_create_but_fixme_should_propagate_errors(6); + FixedArray moved_to_array(move(moved_from_array)); + EXPECT_EQ(moved_to_array.size(), 6u); + EXPECT_EQ(moved_from_array.size(), 0u); +} + +TEST_CASE(no_allocation) +{ + FixedArray array = FixedArray::must_create_but_fixme_should_propagate_errors(5); + EXPECT_NO_CRASH("Assigments", [&] { + NoAllocationGuard guard; + array[0] = 0; + array[1] = 1; + array[2] = 2; + array[4] = array[1]; + array[3] = array[0] + array[2]; + return Test::Crash::Failure::DidNotCrash; + }); + + EXPECT_NO_CRASH("Move", [&] { + FixedArray moved_from_array = FixedArray::must_create_but_fixme_should_propagate_errors(6); + NoAllocationGuard guard; + FixedArray moved_to_array(move(moved_from_array)); + // We need to ensure that this destructor runs before the FixedArray destructor. + guard.~NoAllocationGuard(); + return Test::Crash::Failure::DidNotCrash; + }); + + EXPECT_NO_CRASH("Swap", [&] { + FixedArray target_for_swapping; + { + NoAllocationGuard guard; + array.swap(target_for_swapping); + } + return Test::Crash::Failure::DidNotCrash; + }); +}