1 //===-- Unittests for BlockStore ------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/__support/CPP/blockstore.h" 10 #include "utils/UnitTest/Test.h" 11 12 struct Element { 13 int a; 14 long b; 15 unsigned c; 16 }; 17 18 class LlvmLibcBlockStoreTest : public __llvm_libc::testing::Test { 19 public: 20 template <size_t BLOCK_SIZE, size_t ELEMENT_COUNT, bool REVERSE> 21 void populate_and_iterate() { 22 __llvm_libc::cpp::BlockStore<Element, BLOCK_SIZE, REVERSE> block_store; 23 for (int i = 0; i < int(ELEMENT_COUNT); ++i) 24 block_store.push_back({i, 2 * i, 3 * unsigned(i)}); 25 auto end = block_store.end(); 26 int i = 0; 27 for (auto iter = block_store.begin(); iter != end; ++iter, ++i) { 28 Element &e = *iter; 29 if (REVERSE) { 30 int j = ELEMENT_COUNT - 1 - i; 31 ASSERT_EQ(e.a, j); 32 ASSERT_EQ(e.b, long(j * 2)); 33 ASSERT_EQ(e.c, unsigned(j * 3)); 34 } else { 35 ASSERT_EQ(e.a, i); 36 ASSERT_EQ(e.b, long(i * 2)); 37 ASSERT_EQ(e.c, unsigned(i * 3)); 38 } 39 } 40 ASSERT_EQ(i, int(ELEMENT_COUNT)); 41 __llvm_libc::cpp::BlockStore<Element, BLOCK_SIZE, REVERSE>::destroy( 42 &block_store); 43 } 44 45 template <bool REVERSE> void back_test() { 46 using __llvm_libc::cpp::BlockStore; 47 BlockStore<int, 4, REVERSE> block_store; 48 for (int i = 0; i < 20; i++) 49 block_store.push_back(i); 50 for (int i = 19; i >= 0; i--, block_store.pop_back()) 51 ASSERT_EQ(block_store.back(), i); 52 block_store.destroy(&block_store); 53 } 54 55 template <bool REVERSE> void empty_test() { 56 using __llvm_libc::cpp::BlockStore; 57 BlockStore<int, 2, REVERSE> block_store; 58 59 ASSERT_TRUE(block_store.empty()); 60 block_store.push_back(1); 61 for (int i = 0; i < 10; i++, block_store.push_back(1)) 62 ASSERT_FALSE(block_store.empty()); 63 block_store.destroy(&block_store); 64 } 65 }; 66 67 TEST_F(LlvmLibcBlockStoreTest, PopulateAndIterate4) { 68 populate_and_iterate<4, 4, false>(); 69 } 70 71 TEST_F(LlvmLibcBlockStoreTest, PopulateAndIterate8) { 72 populate_and_iterate<4, 8, false>(); 73 } 74 75 TEST_F(LlvmLibcBlockStoreTest, PopulateAndIterate10) { 76 populate_and_iterate<4, 10, false>(); 77 } 78 79 TEST_F(LlvmLibcBlockStoreTest, PopulateAndIterateReverse4) { 80 populate_and_iterate<4, 4, true>(); 81 } 82 83 TEST_F(LlvmLibcBlockStoreTest, PopulateAndIterateReverse8) { 84 populate_and_iterate<4, 8, true>(); 85 } 86 87 TEST_F(LlvmLibcBlockStoreTest, PopulateAndIterateReverse10) { 88 populate_and_iterate<4, 10, true>(); 89 } 90 91 TEST_F(LlvmLibcBlockStoreTest, Back) { 92 back_test<false>(); 93 back_test<true>(); 94 } 95 96 TEST_F(LlvmLibcBlockStoreTest, Empty) { 97 empty_test<false>(); 98 empty_test<true>(); 99 } 100