Skip to content

Commit dab26b2

Browse files
authored
Merge pull request #58 from 5cript/feat/add_more_find_tests
Added two more find tests with larger trees.
2 parents cbd8548 + 3e1f76d commit dab26b2

File tree

2 files changed

+114
-35
lines changed

2 files changed

+114
-35
lines changed

tests/find_tests.hpp

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
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

1818
TEST_F(FindTests, WillReturnEndIfTreeIsEmpty)
@@ -35,8 +35,7 @@ TEST_F(FindTests, WillFindRoot)
3535
TEST_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
}

tests/overlap_find_tests.hpp

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
#include "test_utility.hpp"
44

5-
class OverlapFindTests
6-
: public ::testing::Test
5+
#include <random>
6+
7+
class OverlapFindTests : public ::testing::Test
78
{
8-
public:
9-
using types = IntervalTypes <int>;
10-
protected:
11-
IntervalTypes <int>::tree_type tree;
9+
public:
10+
using types = IntervalTypes<int>;
11+
12+
protected:
13+
IntervalTypes<int>::tree_type tree;
1214
};
1315

1416
TEST_F(OverlapFindTests, WillReturnEndIfTreeIsEmpty)
@@ -73,19 +75,21 @@ TEST_F(OverlapFindTests, WillFindMultipleOverlaps)
7375
tree.insert({10, 15});
7476
tree.insert({15, 20});
7577

76-
std::vector <decltype(tree)::interval_type> intervals;
78+
std::vector<decltype(tree)::interval_type> intervals;
7779
tree.overlap_find_all({5, 5}, [&intervals](auto iter) {
7880
intervals.push_back(*iter);
7981
return true;
8082
});
8183
using ::testing::UnorderedElementsAre;
82-
ASSERT_THAT(intervals, UnorderedElementsAre(decltype(tree)::interval_type{0, 5}, decltype(tree)::interval_type{5, 10}));
84+
ASSERT_THAT(
85+
intervals, UnorderedElementsAre(decltype(tree)::interval_type{0, 5}, decltype(tree)::interval_type{5, 10})
86+
);
8387
}
8488

8589
TEST_F(OverlapFindTests, FindAllWillFindNothingIfEmpty)
8690
{
8791
int findCount = 0;
88-
tree.overlap_find_all({2, 7}, [&findCount](auto){
92+
tree.overlap_find_all({2, 7}, [&findCount](auto) {
8993
++findCount;
9094
return true;
9195
});
@@ -100,7 +104,7 @@ TEST_F(OverlapFindTests, FindAllWillFindNothingIfNothingOverlaps)
100104
tree.insert({5, 8});
101105
tree.insert({15, 23});
102106
int findCount = 0;
103-
tree.overlap_find_all({1000, 2000}, [&findCount](auto){
107+
tree.overlap_find_all({1000, 2000}, [&findCount](auto) {
104108
++findCount;
105109
return true;
106110
});
@@ -116,7 +120,7 @@ TEST_F(OverlapFindTests, FindAllWillFindAllWithLotsOfDuplicates)
116120
tree.insert({0, 5});
117121

118122
int findCount = 0;
119-
tree.overlap_find_all({2, 3}, [&findCount](decltype(tree)::iterator iter){
123+
tree.overlap_find_all({2, 3}, [&findCount](decltype(tree)::iterator iter) {
120124
++findCount;
121125
EXPECT_EQ(*iter, (decltype(tree)::interval_type{0, 5}));
122126
return true;
@@ -133,7 +137,7 @@ TEST_F(OverlapFindTests, CanExitPreemptivelyByReturningFalse)
133137
tree.insert({0, 5});
134138

135139
int findCount = 0;
136-
tree.overlap_find_all({2, 3}, [&findCount](decltype(tree)::iterator iter){
140+
tree.overlap_find_all({2, 3}, [&findCount](decltype(tree)::iterator iter) {
137141
++findCount;
138142
EXPECT_EQ(*iter, (decltype(tree)::interval_type{0, 5}));
139143
return findCount < 3;
@@ -159,15 +163,14 @@ TEST_F(OverlapFindTests, WillFindSingleOverlapInBiggerTree)
159163
EXPECT_EQ(iter->high(), 2000);
160164
}
161165

162-
TEST_F(FindTests, CanOverlapFindAllOnConstTree)
166+
TEST_F(OverlapFindTests, CanOverlapFindAllOnConstTree)
163167
{
164168
const auto targetInterval = lib_interval_tree::make_safe_interval(16, 21);
165169
tree.insert(targetInterval);
166170
tree.insert({8, 9});
167171
tree.insert({25, 30});
168-
std::vector <decltype(tree)::interval_type> intervals;
169-
auto findWithConstTree = [&intervals, &targetInterval](auto const& tree)
170-
{
172+
std::vector<decltype(tree)::interval_type> intervals;
173+
auto findWithConstTree = [&intervals, &targetInterval](auto const& tree) {
171174
tree.overlap_find_all(targetInterval, [&intervals](auto const& iter) {
172175
intervals.emplace_back(*iter);
173176
return true;
@@ -178,3 +181,45 @@ TEST_F(FindTests, CanOverlapFindAllOnConstTree)
178181
ASSERT_EQ(intervals.size(), 1);
179182
EXPECT_EQ(intervals[0], targetInterval);
180183
}
184+
185+
TEST_F(OverlapFindTests, FuzzyOverlapFindAllInTree)
186+
{
187+
std::mt19937 gen{0};
188+
std::uniform_int_distribution<int> distSmall{-500, 500};
189+
190+
for (int i = 0; i < 200; ++i)
191+
{
192+
const auto generated = distSmall(gen);
193+
tree.insert(lib_interval_tree::make_safe_interval(generated, generated + 20));
194+
}
195+
196+
int findCount = 0;
197+
bool findIsConsistent = true;
198+
const auto searchInterval = decltype(tree)::interval_type{20, 50};
199+
std::vector<decltype(tree)::interval_type> foundIntervals;
200+
tree.overlap_find_all(
201+
searchInterval,
202+
[&findIsConsistent, &searchInterval, &findCount, &foundIntervals](decltype(tree)::iterator iter) {
203+
++findCount;
204+
if (!iter->overlaps(searchInterval))
205+
{
206+
findIsConsistent = false;
207+
return false;
208+
}
209+
foundIntervals.emplace_back(*iter);
210+
return true;
211+
}
212+
);
213+
214+
EXPECT_GT(findCount, 0); // Just make sure the test has at least one interval found, or its useless.
215+
ASSERT_TRUE(findIsConsistent);
216+
217+
// now check that all other intervals should not have been found
218+
for (auto const& ival : tree)
219+
{
220+
if (ival.overlaps(searchInterval))
221+
{
222+
EXPECT_TRUE(std::find(foundIntervals.begin(), foundIntervals.end(), ival) != foundIntervals.end());
223+
}
224+
}
225+
}

0 commit comments

Comments
 (0)