@@ -64,6 +64,99 @@ class LlvmLibcBlockStoreTest : public LIBC_NAMESPACE::testing::Test {
6464 }
6565 block_store.destroy (&block_store);
6666 }
67+
68+ template <bool REVERSE> void erase_test () {
69+ using LIBC_NAMESPACE::BlockStore;
70+ BlockStore<int , 2 , REVERSE> block_store;
71+ int i;
72+
73+ constexpr int ARR_SIZE = 6 ;
74+
75+ ASSERT_TRUE (block_store.empty ());
76+ for (int i = 0 ; i < ARR_SIZE; i++) {
77+ ASSERT_TRUE (block_store.push_back (i + 1 ));
78+ }
79+
80+ // block_store state should be {1,2,3,4,5,6}
81+
82+ block_store.erase (block_store.begin ());
83+
84+ // FORWARD: block_store state should be {2,3,4,5,6}
85+ // REVERSE: block_store state should be {1,2,3,4,5}
86+
87+ auto iter = block_store.begin ();
88+ for (i = 0 ; iter != block_store.end (); ++i, ++iter) {
89+ if (!REVERSE) {
90+ ASSERT_EQ (*iter, i + 2 );
91+ } else {
92+ ASSERT_EQ (*iter, (ARR_SIZE - 1 ) - i);
93+ }
94+ }
95+
96+ // Assert that there were the correct number of elements
97+ ASSERT_EQ (i, ARR_SIZE - 1 );
98+
99+ block_store.erase (block_store.end ());
100+
101+ // BOTH: block_store state should be {2,3,4,5}
102+
103+ iter = block_store.begin ();
104+ for (i = 0 ; iter != block_store.end (); ++i, ++iter) {
105+ if (!REVERSE) {
106+ ASSERT_EQ (*iter, i + 2 );
107+ } else {
108+ ASSERT_EQ (*iter, (ARR_SIZE - 1 ) - i);
109+ }
110+ }
111+
112+ ASSERT_EQ (i, ARR_SIZE - 2 );
113+
114+ block_store.erase (block_store.begin () + 1 );
115+
116+ // FORWARD: block_store state should be {2,4,5}
117+ // REVERSE: block_store state should be {2,3,5}
118+
119+ const int FORWARD_RESULTS[] = {2 , 4 , 5 };
120+ const int REVERSE_RESULTS[] = {2 , 3 , 5 };
121+
122+ iter = block_store.begin ();
123+ for (i = 0 ; iter != block_store.end (); ++i, ++iter) {
124+ if (!REVERSE) {
125+ ASSERT_EQ (*iter, FORWARD_RESULTS[i]);
126+ } else {
127+ ASSERT_EQ (*iter, REVERSE_RESULTS[ARR_SIZE - 4 - i]); // reversed
128+ }
129+ }
130+
131+ ASSERT_EQ (i, ARR_SIZE - 3 );
132+
133+ block_store.erase (block_store.begin () + 1 );
134+ // BOTH: block_store state should be {2,5}
135+
136+ iter = block_store.begin ();
137+ if (!REVERSE) {
138+ ASSERT_EQ (*iter, 2 );
139+ ASSERT_EQ (*(iter + 1 ), 5 );
140+ } else {
141+ ASSERT_EQ (*iter, 5 );
142+ ASSERT_EQ (*(iter + 1 ), 2 );
143+ }
144+
145+ block_store.erase (block_store.begin ());
146+ // FORWARD: block_store state should be {5}
147+ // REVERSE: block_store state should be {2}
148+ iter = block_store.begin ();
149+ if (!REVERSE) {
150+ ASSERT_EQ (*iter, 5 );
151+ } else {
152+ ASSERT_EQ (*iter, 2 );
153+ }
154+
155+ block_store.erase (block_store.begin ());
156+ // BOTH: block_store state should be {}
157+
158+ block_store.destroy (&block_store);
159+ }
67160};
68161
69162TEST_F (LlvmLibcBlockStoreTest, PopulateAndIterate4) {
@@ -100,3 +193,8 @@ TEST_F(LlvmLibcBlockStoreTest, Empty) {
100193 empty_test<false >();
101194 empty_test<true >();
102195}
196+
197+ TEST_F (LlvmLibcBlockStoreTest, Erase) {
198+ erase_test<false >();
199+ erase_test<true >();
200+ }
0 commit comments