#include "interval_map.h"
#include "gtest/gtest.h"
using namespace __orc_rt;
TEST(IntervalMapTest, DefaultConstructed) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M;
EXPECT_TRUE(M.empty());
EXPECT_TRUE(M.begin() == M.end());
EXPECT_TRUE(M.find(0) == M.end());
}
TEST(IntervalMapTest, InsertSingleElement) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M;
M.insert(7, 8, 42);
EXPECT_FALSE(M.empty());
EXPECT_EQ(std::next(M.begin()), M.end());
EXPECT_EQ(M.find(7), M.begin());
EXPECT_EQ(M.find(8), M.end());
EXPECT_EQ(M.lookup(7), 42U);
EXPECT_EQ(M.lookup(8), 0U);
}
TEST(IntervalMapTest, InsertCoalesceWithPrevious) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M1;
M1.insert(7, 8, 42);
M1.insert(8, 9, 42);
EXPECT_FALSE(M1.empty());
EXPECT_EQ(std::next(M1.begin()), M1.end());
EXPECT_EQ(M1.find(7), M1.find(8));
EXPECT_EQ(M1.lookup(7), 42U);
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M2;
M2.insert(7, 8, 42);
M2.insert(8, 9, 7);
EXPECT_FALSE(M2.empty());
EXPECT_EQ(std::next(std::next(M2.begin())), M2.end());
EXPECT_NE(M2.find(7), M2.find(8));
EXPECT_EQ(M2.lookup(7), 42U);
EXPECT_EQ(M2.lookup(8), 7U);
}
TEST(IntervalMapTest, InsertCoalesceWithFollowing) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M1;
M1.insert(8, 9, 42);
M1.insert(7, 8, 42);
EXPECT_FALSE(M1.empty());
EXPECT_EQ(std::next(M1.begin()), M1.end());
EXPECT_EQ(M1.find(7), M1.find(8));
EXPECT_EQ(M1.lookup(7), 42U);
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M2;
M2.insert(8, 9, 42);
M2.insert(7, 8, 7);
EXPECT_FALSE(M2.empty());
EXPECT_EQ(std::next(std::next(M2.begin())), M2.end());
EXPECT_EQ(M2.lookup(7), 7U);
EXPECT_EQ(M2.lookup(8), 42U);
}
TEST(IntervalMapTest, InsertCoalesceBoth) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M1;
M1.insert(7, 8, 42);
M1.insert(9, 10, 42);
EXPECT_NE(M1.find(7), M1.find(9));
M1.insert(8, 9, 42);
EXPECT_FALSE(M1.empty());
EXPECT_EQ(std::next(M1.begin()), M1.end());
EXPECT_EQ(M1.find(7), M1.find(8));
EXPECT_EQ(M1.find(8), M1.find(9));
EXPECT_EQ(M1.lookup(7), 42U);
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M2;
M2.insert(7, 8, 42);
M2.insert(8, 9, 7);
M2.insert(9, 10, 42);
EXPECT_FALSE(M2.empty());
EXPECT_EQ(std::next(std::next(std::next(M2.begin()))), M2.end());
EXPECT_NE(M2.find(7), M2.find(8));
EXPECT_NE(M2.find(8), M2.find(9));
EXPECT_EQ(M2.lookup(7), 42U);
EXPECT_EQ(M2.lookup(8), 7U);
EXPECT_EQ(M2.lookup(9), 42U);
}
TEST(IntervalMapTest, EraseSingleElement) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M;
M.insert(7, 10, 42);
EXPECT_FALSE(M.empty());
M.erase(7, 10);
EXPECT_TRUE(M.empty());
}
TEST(IntervalMapTest, EraseSplittingLeft) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M;
M.insert(7, 10, 42);
EXPECT_FALSE(M.empty());
M.erase(9, 10);
EXPECT_EQ(std::next(M.begin()), M.end());
EXPECT_EQ(M.begin()->first.first, 7U);
EXPECT_EQ(M.begin()->first.second, 9U);
}
TEST(IntervalMapTest, EraseSplittingRight) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M;
M.insert(7, 10, 42);
EXPECT_FALSE(M.empty());
M.erase(7, 8);
EXPECT_EQ(std::next(M.begin()), M.end());
EXPECT_EQ(M.begin()->first.first, 8U);
EXPECT_EQ(M.begin()->first.second, 10U);
}
TEST(IntervalMapTest, EraseSplittingBoth) {
IntervalMap<unsigned, unsigned, IntervalCoalescing::Enabled> M;
M.insert(7, 10, 42);
EXPECT_FALSE(M.empty());
M.erase(8, 9);
EXPECT_EQ(std::next(std::next(M.begin())), M.end());
EXPECT_EQ(M.begin()->first.first, 7U);
EXPECT_EQ(M.begin()->first.second, 8U);
EXPECT_EQ(std::next(M.begin())->first.first, 9U);
EXPECT_EQ(std::next(M.begin())->first.second, 10U);
}
TEST(IntervalMapTest, NonCoalescingMapPermitsNonComparableKeys) {
struct S {};
IntervalMap<unsigned, S, IntervalCoalescing::Disabled> M;
M.insert(7, 8, S());
EXPECT_FALSE(M.empty());
EXPECT_EQ(std::next(M.begin()), M.end());
EXPECT_EQ(M.find(7), M.begin());
EXPECT_EQ(M.find(8), M.end());
}