/* Ousía Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include namespace ousia { TEST(Range, IsValid) { ASSERT_FALSE(Range().isValid()); ASSERT_TRUE(Range(10).isValid()); ASSERT_TRUE(Range(10, 20).isValid()); ASSERT_FALSE(Range(20, 10).isValid()); } TEST(Range, InRange) { Range r(10, 20); ASSERT_FALSE(r.inRange(0)); ASSERT_FALSE(r.inRange(21)); ASSERT_TRUE(r.inRange(10)); ASSERT_TRUE(r.inRange(20)); ASSERT_TRUE(r.inRange(15)); } TEST(Range, overlaps) { ASSERT_FALSE(Range(10, 20).overlaps(Range(0, 9))); ASSERT_FALSE(Range(10, 20).overlaps(Range(21, 30))); ASSERT_TRUE(Range(10, 20).overlaps(Range(0, 10))); ASSERT_TRUE(Range(10, 20).overlaps(Range(20, 30))); ASSERT_TRUE(Range(10, 20).overlaps(Range(5, 15))); ASSERT_TRUE(Range(10, 20).overlaps(Range(15, 25))); ASSERT_TRUE(Range(10, 20).overlaps(Range(15, 19))); ASSERT_TRUE(Range(10, 20).overlaps(Range(15, 15))); ASSERT_TRUE(Range(10, 20).overlaps(Range(10, 20))); ASSERT_TRUE(Range(10, 20).overlaps(Range(0, 30))); } TEST(Range, CoveredBy) { ASSERT_FALSE(Range(10, 20).coveredBy(Range(0, 9))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(21, 30))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(0, 10))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(20, 30))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(5, 15))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(15, 25))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(15, 19))); ASSERT_FALSE(Range(10, 20).coveredBy(Range(15, 15))); ASSERT_TRUE(Range(10, 20).coveredBy(Range(10, 20))); ASSERT_TRUE(Range(10, 20).coveredBy(Range(0, 30))); } TEST(Range, Covers) { ASSERT_FALSE(Range(10, 20).covers(Range(0, 9))); ASSERT_FALSE(Range(10, 20).covers(Range(21, 30))); ASSERT_FALSE(Range(10, 20).covers(Range(0, 10))); ASSERT_FALSE(Range(10, 20).covers(Range(20, 30))); ASSERT_FALSE(Range(10, 20).covers(Range(5, 15))); ASSERT_FALSE(Range(10, 20).covers(Range(15, 25))); ASSERT_TRUE(Range(10, 20).covers(Range(15, 19))); ASSERT_TRUE(Range(10, 20).covers(Range(15, 15))); ASSERT_TRUE(Range(10, 20).covers(Range(10, 20))); ASSERT_FALSE(Range(10, 20).covers(Range(0, 30))); } TEST(RangeSet, Neighbours) { ASSERT_TRUE(Range(10, 19).neighbours(Range(20, 30))); ASSERT_TRUE(Range(20, 29).neighbours(Range(10, 19))); } TEST(Range, Merge) { Range r1(10, 20); Range r2(15, 25); Range r3(5, 15); Range rM = r1.merge(r2).merge(r3); ASSERT_EQ(rM.start, 5); ASSERT_EQ(rM.end, 25); } TEST(RangeSet, Merge) { RangeSet s; auto &ranges = s.getRanges(); // Insert some non-overlapping elements into the range. We expect these to // be just inserted into the ranges. s.merge(Range( 0, 10)); s.merge(Range(20, 30)); s.merge(Range(40, 50)); s.merge(Range(60, 70)); { ASSERT_EQ(ranges.size(), 4); auto it = ranges.begin(); ASSERT_EQ((*it).start, 0); ASSERT_EQ((*it).end, 10); it++; ASSERT_EQ((*it).start, 20); ASSERT_EQ((*it).end, 30); it++; ASSERT_EQ((*it).start, 40); ASSERT_EQ((*it).end, 50); it++; ASSERT_EQ((*it).start, 60); ASSERT_EQ((*it).end, 70); } // Now insert an element which spans the second and third element s.merge(Range(15, 55)); { ASSERT_EQ(ranges.size(), 3); auto it = ranges.begin(); ASSERT_EQ((*it).start, 0); ASSERT_EQ((*it).end, 10); it++; ASSERT_EQ((*it).start, 15); ASSERT_EQ((*it).end, 55); it++; ASSERT_EQ((*it).start, 60); ASSERT_EQ((*it).end, 70); } // Now insert an element which expands the first element s.merge(Range(-10, 11)); { ASSERT_EQ(ranges.size(), 3); auto it = ranges.begin(); ASSERT_EQ((*it).start, -10); ASSERT_EQ((*it).end, 11); it++; ASSERT_EQ((*it).start, 15); ASSERT_EQ((*it).end, 55); it++; ASSERT_EQ((*it).start, 60); ASSERT_EQ((*it).end, 70); } // Now insert an element which merges the last two elements s.merge(Range(13, 70)); { ASSERT_EQ(ranges.size(), 2); auto it = ranges.begin(); ASSERT_EQ((*it).start, -10); ASSERT_EQ((*it).end, 11); it++; ASSERT_EQ((*it).start, 13); ASSERT_EQ((*it).end, 70); } // Now insert an element which merges the remaining elements s.merge(Range(-9, 12)); { ASSERT_EQ(ranges.size(), 1); auto it = ranges.begin(); ASSERT_EQ((*it).start, -10); ASSERT_EQ((*it).end, 70); } } TEST(RangeSet, Contains) { RangeSet s; // Insert some non-overlapping elements into the range. We expect these to // be just inserted into the ranges. s.merge(Range( 0, 10)); s.merge(Range(20, 30)); s.merge(Range(40, 50)); s.merge(Range(60, 70)); s.merge(Range(71)); s.merge(Range(72)); s.merge(Range(73)); s.merge(Range(74)); ASSERT_TRUE(s.contains(60)); ASSERT_TRUE(s.contains(0)); ASSERT_TRUE(s.contains(25)); ASSERT_TRUE(s.contains(73)); ASSERT_TRUE(s.contains(Range(25, 30))); ASSERT_FALSE(s.contains(Range(25, 35))); ASSERT_TRUE(s.contains(Range(0, 10))); ASSERT_TRUE(s.contains(Range(70, 74))); } }