From 65df1cd22ccbb4c8a4edc2a67fefe2a11417d591 Mon Sep 17 00:00:00 2001 From: Martin Janiczek Date: Sun, 1 Oct 2023 16:28:20 +0200 Subject: [PATCH] AK: Add randomized tests for Bitmap These tests found the issue fixed in #21409 (but randomized test runner wasn't merged yet). --- Tests/AK/TestBitmap.cpp | 84 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/Tests/AK/TestBitmap.cpp b/Tests/AK/TestBitmap.cpp index f7c14c94e6..b0727c4c70 100644 --- a/Tests/AK/TestBitmap.cpp +++ b/Tests/AK/TestBitmap.cpp @@ -8,6 +8,8 @@ #include +using namespace Test::Randomized; + TEST_CASE(construct_empty) { Bitmap bitmap; @@ -277,6 +279,49 @@ TEST_CASE(byte_aligned_access) } } +RANDOMIZED_TEST_CASE(set_get) +{ + GEN(init, Gen::boolean()); + GEN(new_value, Gen::boolean()); + GEN(size, Gen::unsigned_int(1, 64)); + GEN(i, Gen::unsigned_int(size - 1)); + + auto bitmap = MUST(Bitmap::create(size, init)); + bitmap.set(i, new_value); + + EXPECT_EQ(bitmap.get(i), new_value); +} + +RANDOMIZED_TEST_CASE(set_range) +{ + GEN(init, Gen::boolean()); + GEN(size, Gen::unsigned_int(1, 64)); + GEN(new_value, Gen::boolean()); + + GEN(start, Gen::unsigned_int(size - 1)); + GEN(len, Gen::unsigned_int(size - start - 1)); + + auto bitmap = MUST(Bitmap::create(size, init)); + bitmap.set_range(start, len, new_value); + + for (size_t i = start; i < start + len; ++i) + EXPECT_EQ(bitmap.get(i), new_value); + + EXPECT_EQ(bitmap.count_in_range(start, len, new_value), len); +} + +RANDOMIZED_TEST_CASE(fill) +{ + GEN(init, Gen::boolean()); + GEN(size, Gen::unsigned_int(1, 64)); + GEN(new_value, Gen::boolean()); + + auto bitmap = MUST(Bitmap::create(size, init)); + bitmap.fill(new_value); + + EXPECT_EQ(bitmap.count_slow(new_value), size); +} + TEST_CASE(find_one_anywhere_edge_case) { { @@ -286,6 +331,26 @@ TEST_CASE(find_one_anywhere_edge_case) } } +RANDOMIZED_TEST_CASE(find_one_anywhere) +{ + GEN(init, Gen::boolean()); + GEN(size, Gen::unsigned_int(1, 64)); + GEN(hint, Gen::unsigned_int(size - 1)); + + GEN(new_value, Gen::boolean()); + GEN(i, Gen::unsigned_int(size - 1)); + + auto bitmap = MUST(Bitmap::create(size, init)); + bitmap.set(i, new_value); + + Optional result = new_value + ? bitmap.find_one_anywhere_set(hint) + : bitmap.find_one_anywhere_unset(hint); + + auto expected_found_index = init == new_value ? 0 : i; + EXPECT_EQ(result.value(), expected_found_index); +} + TEST_CASE(find_first_edge_case) { { @@ -294,3 +359,22 @@ TEST_CASE(find_first_edge_case) EXPECT_EQ(bitmap.find_first_unset().value(), 0UL); } } + +RANDOMIZED_TEST_CASE(find_first) +{ + GEN(init, Gen::boolean()); + GEN(size, Gen::unsigned_int(1, 64)); + + GEN(new_value, Gen::boolean()); + GEN(i, Gen::unsigned_int(size - 1)); + + auto bitmap = MUST(Bitmap::create(size, init)); + bitmap.set(i, new_value); + + Optional result = new_value + ? bitmap.find_first_set() + : bitmap.find_first_unset(); + + auto expected_found_index = init == new_value ? 0 : i; + EXPECT_EQ(result.value(), expected_found_index); +}