44#include  < random> 
55#include  < cmath> 
66
7- class  FindTests 
8-     : public ::testing::Test
7+ class  FindTests  : public ::testing::Test
98{
10- public: 
11-     using  types = IntervalTypes <int >;
12- protected: 
13-     IntervalTypes <int >::tree_type tree;
9+   public: 
10+     using  types = IntervalTypes<int >;
11+ 
12+   protected: 
13+     IntervalTypes<int >::tree_type tree;
1414    std::default_random_engine gen;
15-     std::uniform_int_distribution  <int > distLarge{-50000 , 50000 };
15+     std::uniform_int_distribution<int > distLarge{-50000 , 50000 };
1616};
1717
1818TEST_F (FindTests, WillReturnEndIfTreeIsEmpty)
@@ -35,8 +35,7 @@ TEST_F(FindTests, WillFindRoot)
3535TEST_F (FindTests, WillFindRootOnConstTree)
3636{
3737    tree.insert ({0 , 1 });
38-     [](auto  const & tree)
39-     {
38+     [](auto  const & tree) {
4039        EXPECT_EQ (tree.find ({0 , 1 }), std::begin (tree));
4140    }(tree);
4241}
@@ -68,7 +67,7 @@ TEST_F(FindTests, WillFindAllInTreeWithDuplicates)
6867    tree.insert ({5 , 8 });
6968    tree.insert ({5 , 8 });
7069    int  findCount = 0 ;
71-     tree.find_all ({5 , 8 }, [&findCount](decltype (tree)::iterator iter){
70+     tree.find_all ({5 , 8 }, [&findCount](decltype (tree)::iterator iter)  {
7271        ++findCount;
7372        EXPECT_EQ (*iter, (decltype (tree)::interval_type{5 , 8 }));
7473        return  true ;
@@ -85,7 +84,7 @@ TEST_F(FindTests, WillFindAllCanExitPreemptively)
8584    tree.insert ({5 , 8 });
8685    tree.insert ({5 , 8 });
8786    int  findCount = 0 ;
88-     tree.find_all ({5 , 8 }, [&findCount](decltype (tree)::iterator iter){
87+     tree.find_all ({5 , 8 }, [&findCount](decltype (tree)::iterator iter)  {
8988        ++findCount;
9089        EXPECT_EQ (*iter, (decltype (tree)::interval_type{5 , 8 }));
9190        return  findCount < 3 ;
@@ -97,7 +96,7 @@ TEST_F(FindTests, CanFindAllElementsBack)
9796{
9897    constexpr  int  amount = 10'000 ;
9998
100-     std::vector  <decltype (tree)::interval_type> intervals;
99+     std::vector<decltype (tree)::interval_type> intervals;
101100    intervals.reserve (amount);
102101    for  (int  i = 0 ; i != amount; ++i)
103102    {
@@ -115,11 +114,11 @@ TEST_F(FindTests, CanFindAllElementsBackInStrictlyAscendingNonOverlappingInterva
115114{
116115    constexpr  int  amount = 10'000 ;
117116
118-     std::vector  <decltype (tree)::interval_type> intervals;
117+     std::vector<decltype (tree)::interval_type> intervals;
119118    intervals.reserve (amount);
120119    for  (int  i = 0 ; i != amount; ++i)
121120    {
122-         const  auto  interval = lib_interval_tree::make_safe_interval (i * 2 ,   i * 2  + 1 );
121+         const  auto  interval = lib_interval_tree::make_safe_interval (i * 2 , i * 2  + 1 );
123122        intervals.emplace_back (interval);
124123        tree.insert (interval);
125124    }
@@ -133,11 +132,11 @@ TEST_F(FindTests, CanFindAllElementsBackInStrictlyAscendingOverlappingIntervals)
133132{
134133    constexpr  int  amount = 10'000 ;
135134
136-     std::vector  <decltype (tree)::interval_type> intervals;
135+     std::vector<decltype (tree)::interval_type> intervals;
137136    intervals.reserve (amount);
138137    for  (int  i = 0 ; i != amount; ++i)
139138    {
140-         const  auto  interval = lib_interval_tree::make_safe_interval (i - 1 ,   i + 1 );
139+         const  auto  interval = lib_interval_tree::make_safe_interval (i - 1 , i + 1 );
141140        intervals.emplace_back (interval);
142141        tree.insert (interval);
143142    }
@@ -153,9 +152,8 @@ TEST_F(FindTests, CanFindAllOnConstTree)
153152    tree.insert (targetInterval);
154153    tree.insert ({8 , 9 });
155154    tree.insert ({25 , 30 });
156-     std::vector <decltype (tree)::interval_type> intervals;
157-     auto  findWithConstTree = [&intervals, &targetInterval](auto  const & tree)
158-     {
155+     std::vector<decltype (tree)::interval_type> intervals;
156+     auto  findWithConstTree = [&intervals, &targetInterval](auto  const & tree) {
159157        tree.find_all (targetInterval, [&intervals](auto  const & iter) {
160158            intervals.emplace_back (*iter);
161159            return  true ;
@@ -165,4 +163,40 @@ TEST_F(FindTests, CanFindAllOnConstTree)
165163
166164    ASSERT_EQ (intervals.size (), 1 );
167165    EXPECT_EQ (intervals[0 ], targetInterval);
166+ }
167+ 
168+ TEST_F (FindTests, FuzzyFindAllInTree)
169+ {
170+     std::mt19937 gen{0 };
171+     std::uniform_int_distribution<int > distSmall{-500 , 500 };
172+ 
173+     for  (int  i = 0 ; i < 200 ; ++i)
174+     {
175+         const  auto  generated = distSmall (gen);
176+         tree.insert (lib_interval_tree::make_safe_interval (generated, generated + 20 ));
177+     }
178+     const  auto  searchInterval = decltype (tree)::interval_type{20 , 50 };
179+     tree.insert (searchInterval);
180+     tree.insert (searchInterval);
181+     tree.insert (searchInterval);
182+ 
183+     int  findCount = 0 ;
184+     bool  findIsConsistent = true ;
185+     std::vector<decltype (tree)::interval_type> foundIntervals;
186+     tree.find_all (
187+         searchInterval,
188+         [&findIsConsistent, &searchInterval, &findCount, &foundIntervals](decltype (tree)::iterator iter) {
189+             ++findCount;
190+             if  (*iter != searchInterval)
191+             {
192+                 findIsConsistent = false ;
193+                 return  false ;
194+             }
195+             foundIntervals.emplace_back (*iter);
196+             return  true ;
197+         }
198+     );
199+ 
200+     EXPECT_EQ (findCount, 3 );
201+     ASSERT_TRUE (findIsConsistent);
168202}
0 commit comments