#include "testing/testing.hpp" #include "search/interval_set.hpp" #include "std/initializer_list.hpp" using namespace my; namespace { template using TInterval = typename IntervalSet::TInterval; template void CheckSet(IntervalSet const & actual, initializer_list> intervals) { set> expected(intervals); TEST_EQUAL(actual.Elems(), expected, ()); } } // namespace UNIT_TEST(IntervalSet_Add) { IntervalSet set; TEST(set.Elems().empty(), ()); set.Add(TInterval(0, 2)); CheckSet(set, {TInterval(0, 2)}); set.Add(TInterval(1, 3)); CheckSet(set, {TInterval(0, 3)}); set.Add(TInterval(-2, 0)); CheckSet(set, {TInterval(-2, 3)}); set.Add(TInterval(-4, -3)); CheckSet(set, {TInterval(-4, -3), TInterval(-2, 3)}); set.Add(TInterval(7, 10)); CheckSet(set, {TInterval(-4, -3), TInterval(-2, 3), TInterval(7, 10)}); set.Add(TInterval(-3, -2)); CheckSet(set, {TInterval(-4, 3), TInterval(7, 10)}); set.Add(TInterval(2, 8)); CheckSet(set, {TInterval(-4, 10)}); set.Add(TInterval(2, 3)); CheckSet(set, {TInterval(-4, 10)}); } UNIT_TEST(IntervalSet_AdjacentIntervalAdd) { IntervalSet set; TEST(set.Elems().empty(), ()); set.Add(TInterval(100, 106)); CheckSet(set, {TInterval(100, 106)}); set.Add(TInterval(106, 110)); CheckSet(set, {TInterval(100, 110)}); set.Add(TInterval(90, 100)); CheckSet(set, {TInterval(90, 110)}); } UNIT_TEST(IntervalSet_SubtractFrom) { IntervalSet set; TEST(set.Elems().empty(), ()); set.Add(TInterval(0, 2)); set.Add(TInterval(4, 7)); set.Add(TInterval(10, 11)); CheckSet(set, {TInterval(0, 2), TInterval(4, 7), TInterval(10, 11)}); { vector> difference; set.SubtractFrom(TInterval(1, 5), difference); vector> expected{TInterval(2, 4)}; TEST_EQUAL(difference, expected, ()); } { vector> difference; set.SubtractFrom(TInterval(-10, -5), difference); vector> expected{TInterval(-10, -5)}; TEST_EQUAL(difference, expected, ()); } { vector> difference; set.SubtractFrom(TInterval(0, 11), difference); vector> expected{TInterval(2, 4), TInterval(7, 10)}; TEST_EQUAL(difference, expected, ()); } { vector> difference; set.SubtractFrom(TInterval(-1, 11), difference); vector> expected{TInterval(-1, 0), TInterval(2, 4), TInterval(7, 10)}; TEST_EQUAL(difference, expected, ()); } { vector> difference; set.SubtractFrom(TInterval(5, 7), difference); TEST(difference.empty(), ()); } { vector> difference; set.SubtractFrom(TInterval(4, 7), difference); TEST(difference.empty(), ()); } { vector> difference; set.SubtractFrom(TInterval(3, 7), difference); vector> expected{TInterval(3, 4)}; TEST_EQUAL(difference, expected, ()); } }