blob: 3227130417c0e86cd789668378ec788242b1a698 [file] [log] [blame]
//===---- ADT/IntervalTreeTest.cpp - IntervalTree unit tests --------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/IntervalTree.h"
#include "gtest/gtest.h"
// The test cases for the IntervalTree implementation, follow the below steps:
// a) Insert a series of intervals with their associated mapped value.
// b) Create the interval tree.
// c) Query for specific interval point, covering points inside and outside
// of any given intervals.
// d) Traversal for specific interval point, using the iterators.
//
// When querying for a set of intervals containing a given value, the query is
// done three times, by calling:
// 1) Intervals = getContaining(...).
// 2) Intervals = getContaining(...).
// sortIntervals(Intervals, Sorting=Ascending).
// 3) Intervals = getContaining(...).
// sortIntervals(Intervals, Sorting=Ascending).
//
// The returned intervals are:
// 1) In their location order within the tree.
// 2) Smaller intervals first.
// 3) Bigger intervals first.
using namespace llvm;
namespace {
// Helper function to test a specific item or iterator.
template <typename TPoint, typename TItem, typename TValue>
void checkItem(TPoint Point, TItem Item, TPoint Left, TPoint Right,
TValue Value) {
EXPECT_TRUE(Item->contains(Point));
EXPECT_EQ(Item->left(), Left);
EXPECT_EQ(Item->right(), Right);
EXPECT_EQ(Item->value(), Value);
}
// User class tree tests.
TEST(IntervalTreeTest, UserClass) {
using UUPoint = unsigned;
using UUValue = double;
class MyData : public IntervalData<UUPoint, UUValue> {
using UUData = IntervalData<UUPoint, UUValue>;
public:
// Inherit Base's constructors.
using UUData::UUData;
PointType left() const { return UUData::left(); }
PointType right() const { return UUData::right(); }
ValueType value() const { return UUData::value(); }
bool left(const PointType &Point) const { return UUData::left(Point); }
bool right(const PointType &Point) const { return UUData::right(Point); }
bool contains(const PointType &Point) const {
return UUData::contains(Point);
}
};
using UUTree = IntervalTree<UUPoint, UUValue, MyData>;
using UUReferences = UUTree::IntervalReferences;
using UUData = UUTree::DataType;
using UUAlloc = UUTree::Allocator;
auto CheckData = [](UUPoint Point, const UUData *Data, UUPoint Left,
UUPoint Right, UUValue Value) {
checkItem<UUPoint, const UUData *, UUValue>(Point, Data, Left, Right,
Value);
};
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
EXPECT_TRUE(Tree.empty());
Tree.clear();
EXPECT_TRUE(Tree.empty());
// [10, 20] <- (10.20)
// [30, 40] <- (30.40)
//
// [10...20] [30...40]
Tree.insert(10, 20, 10.20);
Tree.insert(30, 40, 30.40);
Tree.create();
// Invalid interval values: x < [10
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [10...20]
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
CheckData(Point, Intervals[0], 10, 20, 10.20);
Point = 15;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
CheckData(Point, Intervals[0], 10, 20, 10.20);
Point = 20;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
CheckData(Point, Intervals[0], 10, 20, 10.20);
// Invalid interval values: 20] < x < [30
Point = 25;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [30...40]
Point = 30;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
CheckData(Point, Intervals[0], 30, 40, 30.40);
Point = 35;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
CheckData(Point, Intervals[0], 30, 40, 30.40);
Point = 40;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
CheckData(Point, Intervals[0], 30, 40, 30.40);
// Invalid interval values: 40] < x
Point = 45;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
using UUPoint = unsigned; // Interval endpoint type.
using UUValue = unsigned; // Mapped value type.
using UUTree = IntervalTree<UUPoint, UUValue>;
using UUReferences = UUTree::IntervalReferences;
using UUData = UUTree::DataType;
using UUSorting = UUTree::Sorting;
using UUPoint = UUTree::PointType;
using UUValue = UUTree::ValueType;
using UUIter = UUTree::find_iterator;
using UUAlloc = UUTree::Allocator;
void checkData(UUPoint Point, const UUData *Data, UUPoint Left, UUPoint Right,
UUValue Value) {
checkItem<UUPoint, const UUData *, UUValue>(Point, Data, Left, Right, Value);
}
void checkData(UUPoint Point, UUIter Iter, UUPoint Left, UUPoint Right,
UUValue Value) {
checkItem<UUPoint, UUIter, UUValue>(Point, Iter, Left, Right, Value);
}
// Empty tree tests.
TEST(IntervalTreeTest, NoIntervals) {
UUAlloc Allocator;
UUTree Tree(Allocator);
EXPECT_TRUE(Tree.empty());
Tree.clear();
EXPECT_TRUE(Tree.empty());
// Create the tree and switch to query mode.
Tree.create();
EXPECT_TRUE(Tree.empty());
EXPECT_EQ(Tree.find(1), Tree.find_end());
}
// One item tree tests.
TEST(IntervalTreeTest, OneInterval) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
// [10, 20] <- (1020)
//
// [10...20]
Tree.insert(10, 20, 1020);
EXPECT_TRUE(Tree.empty());
Tree.create();
EXPECT_FALSE(Tree.empty());
// Invalid interval values: x < [10.
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [10...20].
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
Point = 15;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
Point = 20;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
// Invalid interval values: 20] < x
Point = 25;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
// Two items tree tests. No overlapping.
TEST(IntervalTreeTest, TwoIntervals) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
// [10, 20] <- (1020)
// [30, 40] <- (3040)
//
// [10...20] [30...40]
Tree.insert(10, 20, 1020);
Tree.insert(30, 40, 3040);
Tree.create();
// Invalid interval values: x < [10
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [10...20]
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
Point = 15;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
Point = 20;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
// Invalid interval values: 20] < x < [30
Point = 25;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [30...40]
Point = 30;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 30, 40, 3040);
Point = 35;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 30, 40, 3040);
Point = 40;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 30, 40, 3040);
// Invalid interval values: 40] < x
Point = 45;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
// Three items tree tests. No overlapping.
TEST(IntervalTreeTest, ThreeIntervals) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
// [10, 20] <- (1020)
// [30, 40] <- (3040)
// [50, 60] <- (5060)
//
// [10...20] [30...40] [50...60]
Tree.insert(10, 20, 1020);
Tree.insert(30, 40, 3040);
Tree.insert(50, 60, 5060);
Tree.create();
// Invalid interval values: x < [10
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [10...20]
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
Point = 15;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
Point = 20;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 20, 1020);
// Invalid interval values: 20] < x < [30
Point = 25;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [30...40]
Point = 30;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 30, 40, 3040);
Point = 35;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 30, 40, 3040);
Point = 40;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 30, 40, 3040);
// Invalid interval values: 40] < x < [50
Point = 45;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [50...60]
Point = 50;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 50, 60, 5060);
Point = 55;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 50, 60, 5060);
Point = 60;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 50, 60, 5060);
// Invalid interval values: 60] < x
Point = 65;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
// One item tree tests.
TEST(IntervalTreeTest, EmptyIntervals) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
// [40, 60] <- (4060)
// [50, 50] <- (5050)
// [10, 10] <- (1010)
// [70, 70] <- (7070)
//
// [40...............60]
// [50...50]
// [10...10]
// [70...70]
Tree.insert(40, 60, 4060);
Tree.insert(50, 50, 5050);
Tree.insert(10, 10, 1010);
Tree.insert(70, 70, 7070);
EXPECT_TRUE(Tree.empty());
Tree.create();
EXPECT_FALSE(Tree.empty());
// Invalid interval values: x < [10.
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [10...10].
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 10, 1010);
// Invalid interval values: 10] < x
Point = 15;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Invalid interval values: x < [50.
Point = 45;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 40, 60, 4060);
// Valid interval values: [50...50].
Point = 50;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 40, 60, 4060);
checkData(Point, Intervals[1], 50, 50, 5050);
// Invalid interval values: 50] < x
Point = 55;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 40, 60, 4060);
// Invalid interval values: x < [70.
Point = 65;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values: [70...70].
Point = 70;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 70, 70, 7070);
// Invalid interval values: 70] < x
Point = 75;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
// Simple overlapping tests.
TEST(IntervalTreeTest, SimpleIntervalsOverlapping) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
// [40, 60] <- (4060)
// [30, 70] <- (3070)
// [20, 80] <- (2080)
// [10, 90] <- (1090)
//
// [40...60]
// [30...............70]
// [20...........................80]
// [10.......................................90]
Tree.insert(40, 60, 4060);
Tree.insert(30, 70, 3070);
Tree.insert(20, 80, 2080);
Tree.insert(10, 90, 1090);
Tree.create();
// Invalid interval values: x < [10
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
// Valid interval values:
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 90, 1090);
Point = 15;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 90, 1090);
Point = 20;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 20, 80, 2080);
checkData(Point, Intervals[1], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Point = 25;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 20, 80, 2080);
checkData(Point, Intervals[1], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Point = 30;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 30, 70, 3070);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Point = 35;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 30, 70, 3070);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Point = 40;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
checkData(Point, Intervals[3], 40, 60, 4060);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 40, 60, 4060);
checkData(Point, Intervals[1], 30, 70, 3070);
checkData(Point, Intervals[2], 20, 80, 2080);
checkData(Point, Intervals[3], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
checkData(Point, Intervals[3], 40, 60, 4060);
Point = 50;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
checkData(Point, Intervals[3], 40, 60, 4060);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 40, 60, 4060);
checkData(Point, Intervals[1], 30, 70, 3070);
checkData(Point, Intervals[2], 20, 80, 2080);
checkData(Point, Intervals[3], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
checkData(Point, Intervals[3], 40, 60, 4060);
Point = 60;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
checkData(Point, Intervals[3], 40, 60, 4060);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 40, 60, 4060);
checkData(Point, Intervals[1], 30, 70, 3070);
checkData(Point, Intervals[2], 20, 80, 2080);
checkData(Point, Intervals[3], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
checkData(Point, Intervals[3], 40, 60, 4060);
Point = 65;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 30, 70, 3070);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Point = 70;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 30, 70, 3070);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
checkData(Point, Intervals[2], 30, 70, 3070);
Point = 75;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 20, 80, 2080);
checkData(Point, Intervals[1], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Point = 80;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 20, 80, 2080);
checkData(Point, Intervals[1], 10, 90, 1090);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 90, 1090);
checkData(Point, Intervals[1], 20, 80, 2080);
Point = 85;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 90, 1090);
Point = 90;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 90, 1090);
// Invalid interval values: 90] < x
Point = 95;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
// Complex Overlapping.
TEST(IntervalTreeTest, ComplexIntervalsOverlapping) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUReferences Intervals;
UUPoint Point;
// [30, 35] <- (3035)
// [39, 50] <- (3950)
// [55, 61] <- (5561)
// [31, 56] <- (3156)
// [12, 21] <- (1221)
// [25, 41] <- (2541)
// [49, 65] <- (4965)
// [71, 79] <- (7179)
// [11, 16] <- (1116)
// [20, 30] <- (2030)
// [36, 54] <- (3654)
// [60, 70] <- (6070)
// [74, 80] <- (7480)
// [15, 40] <- (1540)
// [43, 45] <- (4345)
// [50, 75] <- (5075)
// [10, 85] <- (1085)
// 30--35 39------------50 55----61
// 31------------------------56
// 12--------21 25------------41 49-------------65 71-----79
// 11----16 20-----30 36----------------54 60------70 74---- 80
// 15---------------------40 43--45 50--------------------75
// 10----------------------------------------------------------------------85
Tree.insert(30, 35, 3035);
Tree.insert(39, 50, 3950);
Tree.insert(55, 61, 5561);
Tree.insert(31, 56, 3156);
Tree.insert(12, 21, 1221);
Tree.insert(25, 41, 2541);
Tree.insert(49, 65, 4965);
Tree.insert(71, 79, 7179);
Tree.insert(11, 16, 1116);
Tree.insert(20, 30, 2030);
Tree.insert(36, 54, 3654);
Tree.insert(60, 70, 6070);
Tree.insert(74, 80, 7480);
Tree.insert(15, 40, 1540);
Tree.insert(43, 45, 4345);
Tree.insert(50, 75, 5075);
Tree.insert(10, 85, 1085);
Tree.create();
// Find valid interval values.
Point = 30;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 20, 30, 2030);
checkData(Point, Intervals[4], 30, 35, 3035);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 30, 35, 3035);
checkData(Point, Intervals[1], 20, 30, 2030);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 20, 30, 2030);
checkData(Point, Intervals[4], 30, 35, 3035);
Point = 35;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 30, 35, 3035);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 30, 35, 3035);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 31, 56, 3156);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 25, 41, 2541);
checkData(Point, Intervals[4], 30, 35, 3035);
Point = 39;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 25, 41, 2541);
checkData(Point, Intervals[5], 15, 40, 1540);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 39, 50, 3950);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 15, 40, 1540);
checkData(Point, Intervals[5], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 36, 54, 3654);
checkData(Point, Intervals[4], 25, 41, 2541);
checkData(Point, Intervals[5], 39, 50, 3950);
Point = 50;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 49, 65, 4965);
checkData(Point, Intervals[5], 50, 75, 5075);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 39, 50, 3950);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 50, 75, 5075);
checkData(Point, Intervals[5], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 36, 54, 3654);
checkData(Point, Intervals[4], 49, 65, 4965);
checkData(Point, Intervals[5], 39, 50, 3950);
Point = 55;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 55, 61, 5561);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 55, 61, 5561);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 31, 56, 3156);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 49, 65, 4965);
checkData(Point, Intervals[4], 55, 61, 5561);
Point = 61;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 55, 61, 5561);
checkData(Point, Intervals[4], 60, 70, 6070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 55, 61, 5561);
checkData(Point, Intervals[1], 60, 70, 6070);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 60, 70, 6070);
checkData(Point, Intervals[4], 55, 61, 5561);
Point = 31;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 30, 35, 3035);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 30, 35, 3035);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 31, 56, 3156);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 25, 41, 2541);
checkData(Point, Intervals[4], 30, 35, 3035);
Point = 56;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 55, 61, 5561);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 55, 61, 5561);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 31, 56, 3156);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 49, 65, 4965);
checkData(Point, Intervals[4], 55, 61, 5561);
Point = 12;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 11, 16, 1116);
checkData(Point, Intervals[2], 12, 21, 1221);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 11, 16, 1116);
checkData(Point, Intervals[1], 12, 21, 1221);
checkData(Point, Intervals[2], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 12, 21, 1221);
checkData(Point, Intervals[2], 11, 16, 1116);
Point = 21;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 20, 30, 2030);
checkData(Point, Intervals[3], 12, 21, 1221);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 12, 21, 1221);
checkData(Point, Intervals[1], 20, 30, 2030);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 20, 30, 2030);
checkData(Point, Intervals[3], 12, 21, 1221);
Point = 25;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 20, 30, 2030);
checkData(Point, Intervals[3], 25, 41, 2541);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 20, 30, 2030);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 20, 30, 2030);
Point = 41;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 25, 41, 2541);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 39, 50, 3950);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 25, 41, 2541);
checkData(Point, Intervals[4], 39, 50, 3950);
Point = 49;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 49, 65, 4965);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 39, 50, 3950);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 49, 65, 4965);
checkData(Point, Intervals[4], 39, 50, 3950);
Point = 65;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 60, 70, 6070);
checkData(Point, Intervals[3], 49, 65, 4965);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 60, 70, 6070);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 60, 70, 6070);
Point = 71;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 71, 79, 7179);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 71, 79, 7179);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 71, 79, 7179);
Point = 79;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 74, 80, 7480);
checkData(Point, Intervals[2], 71, 79, 7179);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 74, 80, 7480);
checkData(Point, Intervals[1], 71, 79, 7179);
checkData(Point, Intervals[2], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 71, 79, 7179);
checkData(Point, Intervals[2], 74, 80, 7480);
Point = 11;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 11, 16, 1116);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 11, 16, 1116);
checkData(Point, Intervals[1], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 11, 16, 1116);
Point = 16;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 12, 21, 1221);
checkData(Point, Intervals[3], 11, 16, 1116);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 11, 16, 1116);
checkData(Point, Intervals[1], 12, 21, 1221);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 12, 21, 1221);
checkData(Point, Intervals[3], 11, 16, 1116);
Point = 20;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 20, 30, 2030);
checkData(Point, Intervals[3], 12, 21, 1221);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 12, 21, 1221);
checkData(Point, Intervals[1], 20, 30, 2030);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 20, 30, 2030);
checkData(Point, Intervals[3], 12, 21, 1221);
Point = 30;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 20, 30, 2030);
checkData(Point, Intervals[4], 30, 35, 3035);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 30, 35, 3035);
checkData(Point, Intervals[1], 20, 30, 2030);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 25, 41, 2541);
checkData(Point, Intervals[3], 20, 30, 2030);
checkData(Point, Intervals[4], 30, 35, 3035);
Point = 36;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 25, 41, 2541);
checkData(Point, Intervals[4], 15, 40, 1540);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 25, 41, 2541);
checkData(Point, Intervals[1], 36, 54, 3654);
checkData(Point, Intervals[2], 31, 56, 3156);
checkData(Point, Intervals[3], 15, 40, 1540);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 36, 54, 3654);
checkData(Point, Intervals[4], 25, 41, 2541);
Point = 54;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 49, 65, 4965);
checkData(Point, Intervals[4], 50, 75, 5075);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 49, 65, 4965);
checkData(Point, Intervals[1], 36, 54, 3654);
checkData(Point, Intervals[2], 31, 56, 3156);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 36, 54, 3654);
checkData(Point, Intervals[4], 49, 65, 4965);
Point = 60;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 55, 61, 5561);
checkData(Point, Intervals[4], 60, 70, 6070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 55, 61, 5561);
checkData(Point, Intervals[1], 60, 70, 6070);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 50, 75, 5075);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 49, 65, 4965);
checkData(Point, Intervals[3], 60, 70, 6070);
checkData(Point, Intervals[4], 55, 61, 5561);
Point = 70;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 60, 70, 6070);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 60, 70, 6070);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 3u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 60, 70, 6070);
Point = 74;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 71, 79, 7179);
checkData(Point, Intervals[3], 74, 80, 7480);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 74, 80, 7480);
checkData(Point, Intervals[1], 71, 79, 7179);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 71, 79, 7179);
checkData(Point, Intervals[3], 74, 80, 7480);
Point = 80;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 74, 80, 7480);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 74, 80, 7480);
checkData(Point, Intervals[1], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 2u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 74, 80, 7480);
Point = 15;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 11, 16, 1116);
checkData(Point, Intervals[3], 12, 21, 1221);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 11, 16, 1116);
checkData(Point, Intervals[1], 12, 21, 1221);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 15, 40, 1540);
checkData(Point, Intervals[2], 12, 21, 1221);
checkData(Point, Intervals[3], 11, 16, 1116);
Point = 40;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 25, 41, 2541);
checkData(Point, Intervals[5], 15, 40, 1540);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 39, 50, 3950);
checkData(Point, Intervals[1], 25, 41, 2541);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 15, 40, 1540);
checkData(Point, Intervals[5], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 15, 40, 1540);
checkData(Point, Intervals[3], 36, 54, 3654);
checkData(Point, Intervals[4], 25, 41, 2541);
checkData(Point, Intervals[5], 39, 50, 3950);
Point = 43;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 43, 45, 4345);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 43, 45, 4345);
checkData(Point, Intervals[1], 39, 50, 3950);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 43, 45, 4345);
Point = 45;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 43, 45, 4345);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 43, 45, 4345);
checkData(Point, Intervals[1], 39, 50, 3950);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 5u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 43, 45, 4345);
Point = 50;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 39, 50, 3950);
checkData(Point, Intervals[4], 49, 65, 4965);
checkData(Point, Intervals[5], 50, 75, 5075);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 39, 50, 3950);
checkData(Point, Intervals[1], 49, 65, 4965);
checkData(Point, Intervals[2], 36, 54, 3654);
checkData(Point, Intervals[3], 31, 56, 3156);
checkData(Point, Intervals[4], 50, 75, 5075);
checkData(Point, Intervals[5], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 6u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 31, 56, 3156);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 36, 54, 3654);
checkData(Point, Intervals[4], 49, 65, 4965);
checkData(Point, Intervals[5], 39, 50, 3950);
Point = 75;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 74, 80, 7480);
checkData(Point, Intervals[3], 71, 79, 7179);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Ascending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 74, 80, 7480);
checkData(Point, Intervals[1], 71, 79, 7179);
checkData(Point, Intervals[2], 50, 75, 5075);
checkData(Point, Intervals[3], 10, 85, 1085);
Intervals = Tree.getContaining(Point);
Tree.sortIntervals(Intervals, UUSorting::Descending);
ASSERT_EQ(Intervals.size(), 4u);
checkData(Point, Intervals[0], 10, 85, 1085);
checkData(Point, Intervals[1], 50, 75, 5075);
checkData(Point, Intervals[2], 71, 79, 7179);
checkData(Point, Intervals[3], 74, 80, 7480);
Point = 10;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 85, 1085);
Point = 85;
Intervals = Tree.getContaining(Point);
ASSERT_EQ(Intervals.size(), 1u);
checkData(Point, Intervals[0], 10, 85, 1085);
// Invalid interval values.
Point = 5;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
Point = 90;
Intervals = Tree.getContaining(Point);
EXPECT_TRUE(Intervals.empty());
}
// Four items tree tests. Overlapping. Check mapped values and iterators.
TEST(IntervalTreeTest, MappedValuesIteratorsTree) {
UUAlloc Allocator;
UUTree Tree(Allocator);
UUPoint Point;
// [10, 20] <- (1020)
// [15, 25] <- (1525)
// [50, 60] <- (5060)
// [55, 65] <- (5565)
//
// [10.........20]
// [15.........25]
// [50.........60]
// [55.........65]
Tree.insert(10, 20, 1020);
Tree.insert(15, 25, 1525);
Tree.insert(50, 60, 5060);
Tree.insert(55, 65, 5565);
Tree.create();
// Iterators.
{
// Start searching for '10'.
Point = 10;
UUIter Iter = Tree.find(Point);
EXPECT_NE(Iter, Tree.find_end());
checkData(Point, Iter, 10, 20, 1020);
++Iter;
EXPECT_EQ(Iter, Tree.find_end());
}
{
// Start searching for '15'.
Point = 15;
UUIter Iter = Tree.find(Point);
ASSERT_TRUE(Iter != Tree.find_end());
checkData(Point, Iter, 15, 25, 1525);
++Iter;
ASSERT_TRUE(Iter != Tree.find_end());
checkData(Point, Iter, 10, 20, 1020);
++Iter;
EXPECT_EQ(Iter, Tree.find_end());
}
{
// Start searching for '20'.
Point = 20;
UUIter Iter = Tree.find(Point);
ASSERT_TRUE(Iter != Tree.find_end());
checkData(Point, Iter, 15, 25, 1525);
++Iter;
ASSERT_TRUE(Iter != Tree.find_end());
checkData(Point, Iter, 10, 20, 1020);
++Iter;
EXPECT_EQ(Iter, Tree.find_end());
}
{
// Start searching for '25'.
Point = 25;
UUIter Iter = Tree.find(Point);
ASSERT_TRUE(Iter != Tree.find_end());
checkData(Point, Iter, 15, 25, 1525);
++Iter;
EXPECT_EQ(Iter, Tree.find_end());
}
// Invalid interval values.
{
Point = 5;
UUIter Iter = Tree.find(Point);
EXPECT_EQ(Iter, Tree.find_end());
}
{
Point = 45;
UUIter Iter = Tree.find(Point);
EXPECT_EQ(Iter, Tree.find_end());
}
{
Point = 70;
UUIter Iter = Tree.find(Point);
EXPECT_EQ(Iter, Tree.find_end());
}
}
} // namespace