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