11#pragma once
22
3+ #include < interval-tree/draw.hpp>
4+ #include " interval_io.hpp"
5+ #include " test_utility.hpp"
6+
37#include < ctime>
48#include < random>
59#include < cmath>
@@ -48,7 +52,7 @@ class OracleInterval : public lib_interval_tree::interval<numerical_type, interv
4852 other.oracle_ = nullptr ;
4953 return *this ;
5054 }
51- ~OracleInterval ()
55+ ~OracleInterval ()
5256 {
5357 if (oracle_ != nullptr )
5458 --oracle_->livingInstances ;
@@ -73,6 +77,23 @@ class EraseTests
7377public:
7478 using interval_type = OracleInterval<int >;
7579
80+ public:
81+ auto makeTree ()
82+ {
83+ lib_interval_tree::interval_tree_t <int > regularTree;
84+ regularTree.insert ({16 , 21 });
85+ regularTree.insert ({8 , 9 });
86+ regularTree.insert ({25 , 30 });
87+ regularTree.insert ({5 , 8 });
88+ regularTree.insert ({15 , 23 });
89+ regularTree.insert ({17 , 19 });
90+ regularTree.insert ({26 , 26 });
91+ regularTree.insert ({0 , 3 });
92+ regularTree.insert ({6 , 10 });
93+ regularTree.insert ({19 , 20 });
94+ return regularTree;
95+ }
96+
7697protected:
7798 Oracle oracle;
7899 lib_interval_tree::interval_tree <OracleInterval<int >> tree;
@@ -162,3 +183,54 @@ TEST_F(EraseTests, RandomEraseTest)
162183 testMaxProperty (tree);
163184 testTreeHeightHealth (tree);
164185}
186+
187+ TEST_F (EraseTests, ReturnedIteratorPointsToNextInOrderNode)
188+ {
189+ auto regularTree = makeTree ();
190+ auto iter = regularTree.erase (regularTree.find ({16 , 21 }));
191+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{17 , 19 })) << *iter;
192+
193+ regularTree = makeTree ();
194+ iter = regularTree.erase (regularTree.find ({8 , 9 }));
195+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{15 , 23 })) << *iter;
196+
197+ regularTree = makeTree ();
198+ iter = regularTree.erase (regularTree.find ({25 , 30 }));
199+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{26 , 26 })) << *iter;
200+
201+ regularTree = makeTree ();
202+ iter = regularTree.erase (regularTree.find ({5 , 8 }));
203+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{6 , 10 })) << *iter;
204+
205+ regularTree = makeTree ();
206+ iter = regularTree.erase (regularTree.find ({15 , 23 }));
207+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{16 , 21 })) << *iter;
208+
209+ regularTree = makeTree ();
210+ iter = regularTree.erase (regularTree.find ({17 , 19 }));
211+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{19 , 20 })) << *iter;
212+
213+ regularTree = makeTree ();
214+ iter = regularTree.erase (regularTree.find ({26 , 26 }));
215+ EXPECT_EQ (iter, regularTree.end ());
216+
217+ regularTree = makeTree ();
218+ iter = regularTree.erase (regularTree.find ({0 , 3 }));
219+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{5 , 8 })) << *iter;
220+
221+ regularTree = makeTree ();
222+ iter = regularTree.erase (regularTree.find ({6 , 10 }));
223+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{8 , 9 })) << *iter;
224+
225+ regularTree = makeTree ();
226+ iter = regularTree.erase (regularTree.find ({19 , 20 }));
227+ EXPECT_EQ (*iter, (decltype (regularTree)::interval_type{25 , 30 })) << *iter;
228+ }
229+
230+ TEST_F (EraseTests, CanEraseEntireTreeUsingReturnedIterator)
231+ {
232+ auto tree = makeTree ();
233+ for (auto iter = tree.begin (); iter != tree.end ();)
234+ iter = tree.erase (iter);
235+ EXPECT_EQ (tree.empty (), true );
236+ }
0 commit comments