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