11#pragma once
22
3+ #include " interval_io.hpp"
4+ #include " test_utility.hpp"
5+
36#include < ctime>
47#include < random>
58#include < cmath>
@@ -48,7 +51,7 @@ class OracleInterval : public lib_interval_tree::interval<numerical_type, interv
4851 other.oracle_ = nullptr ;
4952 return *this ;
5053 }
51- ~OracleInterval ()
54+ ~OracleInterval ()
5255 {
5356 if (oracle_ != nullptr )
5457 --oracle_->livingInstances ;
@@ -73,6 +76,23 @@ class EraseTests
7376public:
7477 using interval_type = OracleInterval<int >;
7578
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+
7696protected:
7797 Oracle oracle;
7898 lib_interval_tree::interval_tree <OracleInterval<int >> tree;
@@ -162,3 +182,84 @@ TEST_F(EraseTests, RandomEraseTest)
162182 testMaxProperty (tree);
163183 testTreeHeightHealth (tree);
164184}
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