1
1
#pragma once
2
2
3
+ #include " interval_io.hpp"
4
+ #include " test_utility.hpp"
5
+
3
6
#include < ctime>
4
7
#include < random>
5
8
#include < cmath>
@@ -48,7 +51,7 @@ class OracleInterval : public lib_interval_tree::interval<numerical_type, interv
48
51
other.oracle_ = nullptr ;
49
52
return *this ;
50
53
}
51
- ~OracleInterval ()
54
+ ~OracleInterval ()
52
55
{
53
56
if (oracle_ != nullptr )
54
57
--oracle_->livingInstances ;
@@ -73,6 +76,23 @@ class EraseTests
73
76
public:
74
77
using interval_type = OracleInterval<int >;
75
78
79
+ public:
80
+ auto makeTree ()
81
+ {
82
+ lib_interval_tree::interval_tree_t <int > regularTree;
83
+ regularTree.insert ({16 , 21 });
84
+ regularTree.insert ({8 , 9 });
85
+ regularTree.insert ({25 , 30 });
86
+ regularTree.insert ({5 , 8 });
87
+ regularTree.insert ({15 , 23 });
88
+ regularTree.insert ({17 , 19 });
89
+ regularTree.insert ({26 , 26 });
90
+ regularTree.insert ({0 , 3 });
91
+ regularTree.insert ({6 , 10 });
92
+ regularTree.insert ({19 , 20 });
93
+ return regularTree;
94
+ }
95
+
76
96
protected:
77
97
Oracle oracle;
78
98
lib_interval_tree::interval_tree <OracleInterval<int >> tree;
@@ -162,3 +182,84 @@ TEST_F(EraseTests, RandomEraseTest)
162
182
testMaxProperty (tree);
163
183
testTreeHeightHealth (tree);
164
184
}
185
+
186
+
187
+
188
+ TEST_F (EraseTests, MassiveDeleteEntireTreeWithEraseReturnIterator)
189
+ {
190
+ constexpr int amount = 1000 ;
191
+
192
+ for (int i = 0 ; i != amount; ++i)
193
+ tree.insert (makeSafeOracleInterval (&oracle, distSmall (gen), distSmall (gen)));
194
+
195
+ for (auto iter = tree.begin (); !tree.empty ();)
196
+ {
197
+ iter = tree.erase (iter);
198
+ }
199
+
200
+ EXPECT_EQ (oracle.livingInstances , 0 );
201
+ testMaxProperty (tree);
202
+ testTreeHeightHealth (tree);
203
+ }
204
+
205
+ TEST_F (EraseTests, ReturnedIteratorPointsToNextInOrderNode)
206
+ {
207
+ auto regularTree = makeTree ();
208
+ auto iter = regularTree.erase (regularTree.find ({16 , 21 }));
209
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{17 , 19 })) << *iter;
210
+
211
+ regularTree = makeTree ();
212
+ iter = regularTree.erase (regularTree.find ({8 , 9 }));
213
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{15 , 23 })) << *iter;
214
+
215
+ regularTree = makeTree ();
216
+ iter = regularTree.erase (regularTree.find ({25 , 30 }));
217
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{26 , 26 })) << *iter;
218
+
219
+ regularTree = makeTree ();
220
+ iter = regularTree.erase (regularTree.find ({5 , 8 }));
221
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{6 , 10 })) << *iter;
222
+
223
+ regularTree = makeTree ();
224
+ iter = regularTree.erase (regularTree.find ({15 , 23 }));
225
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{16 , 21 })) << *iter;
226
+
227
+ regularTree = makeTree ();
228
+ iter = regularTree.erase (regularTree.find ({17 , 19 }));
229
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{19 , 20 })) << *iter;
230
+
231
+ regularTree = makeTree ();
232
+ iter = regularTree.erase (regularTree.find ({26 , 26 }));
233
+ EXPECT_EQ (iter, regularTree.end ());
234
+
235
+ regularTree = makeTree ();
236
+ iter = regularTree.erase (regularTree.find ({0 , 3 }));
237
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{5 , 8 })) << *iter;
238
+
239
+ regularTree = makeTree ();
240
+ iter = regularTree.erase (regularTree.find ({6 , 10 }));
241
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{8 , 9 })) << *iter;
242
+
243
+ regularTree = makeTree ();
244
+ iter = regularTree.erase (regularTree.find ({19 , 20 }));
245
+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{25 , 30 })) << *iter;
246
+ }
247
+
248
+ TEST_F (EraseTests, CanEraseEntireTreeUsingReturnedIterator)
249
+ {
250
+ auto tree = makeTree ();
251
+ for (auto iter = tree.begin (); iter != tree.end ();)
252
+ iter = tree.erase (iter);
253
+ EXPECT_EQ (tree.empty (), true );
254
+ }
255
+
256
+ TEST_F (EraseTests, FromNuiTest)
257
+ {
258
+ lib_interval_tree::interval_tree_t <int > tree;
259
+ tree.insert ({0 , 0 });
260
+ tree.insert ({4 , 4 });
261
+ tree.insert ({13 , 13 });
262
+
263
+ auto iter = tree.erase (tree.find ({4 , 4 }));
264
+ EXPECT_EQ (*iter, (decltype (tree)::interval_type{13 , 13 })) << *iter;
265
+ }
0 commit comments