//===---- 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 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 { using UUData = IntervalData; 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; 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(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; 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(Point, Data, Left, Right, Value); } void checkData(UUPoint Point, UUIter Iter, UUPoint Left, UUPoint Right, UUValue Value) { checkItem(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