4
4
#include < random>
5
5
#include < cmath>
6
6
7
- class FindTests
8
- : public ::testing::Test
7
+ class FindTests : public ::testing::Test
9
8
{
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;
14
14
std::default_random_engine gen;
15
- std::uniform_int_distribution <int > distLarge{-50000 , 50000 };
15
+ std::uniform_int_distribution<int > distLarge{-50000 , 50000 };
16
16
};
17
17
18
18
TEST_F (FindTests, WillReturnEndIfTreeIsEmpty)
@@ -35,8 +35,7 @@ TEST_F(FindTests, WillFindRoot)
35
35
TEST_F (FindTests, WillFindRootOnConstTree)
36
36
{
37
37
tree.insert ({0 , 1 });
38
- [](auto const & tree)
39
- {
38
+ [](auto const & tree) {
40
39
EXPECT_EQ (tree.find ({0 , 1 }), std::begin (tree));
41
40
}(tree);
42
41
}
@@ -68,7 +67,7 @@ TEST_F(FindTests, WillFindAllInTreeWithDuplicates)
68
67
tree.insert ({5 , 8 });
69
68
tree.insert ({5 , 8 });
70
69
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) {
72
71
++findCount;
73
72
EXPECT_EQ (*iter, (decltype (tree)::interval_type{5 , 8 }));
74
73
return true ;
@@ -85,7 +84,7 @@ TEST_F(FindTests, WillFindAllCanExitPreemptively)
85
84
tree.insert ({5 , 8 });
86
85
tree.insert ({5 , 8 });
87
86
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) {
89
88
++findCount;
90
89
EXPECT_EQ (*iter, (decltype (tree)::interval_type{5 , 8 }));
91
90
return findCount < 3 ;
@@ -97,7 +96,7 @@ TEST_F(FindTests, CanFindAllElementsBack)
97
96
{
98
97
constexpr int amount = 10'000 ;
99
98
100
- std::vector <decltype (tree)::interval_type> intervals;
99
+ std::vector<decltype (tree)::interval_type> intervals;
101
100
intervals.reserve (amount);
102
101
for (int i = 0 ; i != amount; ++i)
103
102
{
@@ -115,11 +114,11 @@ TEST_F(FindTests, CanFindAllElementsBackInStrictlyAscendingNonOverlappingInterva
115
114
{
116
115
constexpr int amount = 10'000 ;
117
116
118
- std::vector <decltype (tree)::interval_type> intervals;
117
+ std::vector<decltype (tree)::interval_type> intervals;
119
118
intervals.reserve (amount);
120
119
for (int i = 0 ; i != amount; ++i)
121
120
{
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 );
123
122
intervals.emplace_back (interval);
124
123
tree.insert (interval);
125
124
}
@@ -133,11 +132,11 @@ TEST_F(FindTests, CanFindAllElementsBackInStrictlyAscendingOverlappingIntervals)
133
132
{
134
133
constexpr int amount = 10'000 ;
135
134
136
- std::vector <decltype (tree)::interval_type> intervals;
135
+ std::vector<decltype (tree)::interval_type> intervals;
137
136
intervals.reserve (amount);
138
137
for (int i = 0 ; i != amount; ++i)
139
138
{
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 );
141
140
intervals.emplace_back (interval);
142
141
tree.insert (interval);
143
142
}
@@ -153,9 +152,8 @@ TEST_F(FindTests, CanFindAllOnConstTree)
153
152
tree.insert (targetInterval);
154
153
tree.insert ({8 , 9 });
155
154
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) {
159
157
tree.find_all (targetInterval, [&intervals](auto const & iter) {
160
158
intervals.emplace_back (*iter);
161
159
return true ;
@@ -165,4 +163,40 @@ TEST_F(FindTests, CanFindAllOnConstTree)
165
163
166
164
ASSERT_EQ (intervals.size (), 1 );
167
165
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);
168
202
}
0 commit comments