#include "gmock/gmock.h" #include "persistent-data/run_set.h" #include using namespace base; using namespace std; using namespace testing; //---------------------------------------------------------------- namespace { MATCHER_P2(EqRun, b, e, "") { return (arg.begin_ == static_cast(b)) && (arg.end_ == static_cast(e)); } MATCHER(EqAll, "") { return !arg.begin_ && !arg.end_; } MATCHER_P(EqOpenBegin, e, "") { return !arg.begin_ && (arg.end_ == static_cast(e)); } MATCHER_P(EqOpenEnd, b, "") { return (arg.begin_ == static_cast(b)) && !arg.end_; } class RunSetTests : public Test { }; } //---------------------------------------------------------------- TEST_F(RunSetTests, create) { unique_ptr > rs(new run_set()); } TEST_F(RunSetTests, add_single_blocks) { run_set rs; rs.add(3u); rs.add(8u); rs.add(9u); } TEST_F(RunSetTests, add_adjacent_single) { run_set rs; rs.add(3); rs.add(4); ASSERT_THAT(*rs.begin(), EqRun(3, 5)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, add_adjacent_single_other_way_round) { run_set rs; rs.add(4); rs.add(3); ASSERT_THAT(*rs.begin(), EqRun(3, 5)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, many_single_blocks) { run_set rs; for (unsigned i = 1; i < 100000; i++) rs.add(i); ASSERT_THAT(*rs.begin(), EqRun(1, 100000)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, add_runs) { run_set rs; rs.add(run(3, 8)); rs.add(run(23, 55)); rs.add(run(78, 190)); } TEST_F(RunSetTests, member_empty_set) { run_set rs; ASSERT_THAT(rs.begin(), Eq(rs.end())); ASSERT_FALSE(rs.member(5)); } TEST_F(RunSetTests, member_many_runs) { run_set rs; rs.add(3); rs.add(7, 15); rs.add(23, 28); rs.add(25, 50); rs.add(101, 105); rs.add(105, 110); rs.add(201, 205); rs.add(206, 210); ASSERT_TRUE(rs.member(3)); ASSERT_FALSE(rs.member(6)); for (unsigned i = 7; i < 15; i++) ASSERT_TRUE(rs.member(i)); ASSERT_FALSE(rs.member(15)); ASSERT_FALSE(rs.member(22)); for (unsigned i = 23; i < 50; i++) ASSERT_TRUE(rs.member(i)); ASSERT_FALSE(rs.member(50)); ASSERT_FALSE(rs.member(100)); for (unsigned i = 101; i < 110; i++) ASSERT_TRUE(rs.member(i)); ASSERT_FALSE(rs.member(110)); ASSERT_FALSE(rs.member(200)); for (unsigned i = 201; i < 205; i++) ASSERT_TRUE(rs.member(i)); ASSERT_FALSE(rs.member(205)); for (unsigned i = 206; i < 210; i++) ASSERT_TRUE(rs.member(i)); ASSERT_FALSE(rs.member(210)); } TEST_F(RunSetTests, iterate_empty) { run_set rs; ASSERT_THAT(rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, iterate_single) { run_set rs; rs.add(5, 10); ASSERT_THAT(*rs.begin(), EqRun(5, 10)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, iterate_overlapping_runs) { run_set rs; rs.add(5, 10); rs.add(8, 15); ASSERT_THAT(*rs.begin(), EqRun(5, 15)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, iterate_overlapping_runs_other_way) { run_set rs; rs.add(8, 15); rs.add(5, 10); ASSERT_THAT(*rs.begin(), EqRun(5, 15)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, iterate_covered_runs) { run_set rs; rs.add(8, 15); rs.add(5, 20); ASSERT_THAT(*rs.begin(), EqRun(5, 20)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, iterate_covered_runs2) { run_set rs; rs.add(8, 10); rs.add(12, 20); rs.add(5, 30); ASSERT_THAT(*rs.begin(), EqRun(5, 30)); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, iterate_non_overlapping_runs) { run_set rs; rs.add(5, 10); rs.add(15, 20); ASSERT_THAT(*rs.begin(), EqRun(5, 10)); ASSERT_THAT(*(++rs.begin()), EqRun(15, 20)); ASSERT_THAT(++(++(rs.begin())), Eq(rs.end())); } TEST_F(RunSetTests, merge_empty_sets) { run_set rs1; run_set rs2; rs1.merge(rs2); ASSERT_THAT(rs1.begin(), Eq(rs1.end())); } TEST_F(RunSetTests, merge_discrete_sets) { run_set rs1; run_set rs2; rs1.add(5, 10); rs2.add(15, 20); rs1.merge(rs2); ASSERT_THAT(*rs1.begin(), EqRun(5, 10)); ASSERT_THAT(*(++rs1.begin()), EqRun(15, 20)); ASSERT_THAT(++(++(rs1.begin())), Eq(rs1.end())); } TEST_F(RunSetTests, negate_empty) { run_set rs; rs.negate(); ASSERT_THAT(*rs.begin(), EqAll()); ASSERT_THAT(++rs.begin(), Eq(rs.end())); } TEST_F(RunSetTests, negate_single) { run_set rs; rs.add(5, 10); rs.negate(); ASSERT_THAT(*rs.begin(), EqOpenBegin(5)); ASSERT_THAT(*(++rs.begin()), EqOpenEnd(10)); ASSERT_THAT(++(++rs.begin()), Eq(rs.end())); } TEST_F(RunSetTests, negate_single2) { run_set rs; rs.add(23); rs.negate(); ASSERT_THAT(*rs.begin(), EqOpenBegin(23)); ASSERT_THAT(*(++rs.begin()), EqOpenEnd(24)); ASSERT_THAT(++(++rs.begin()), Eq(rs.end())); } TEST_F(RunSetTests, negate_double) { run_set rs; rs.add(5, 10); rs.add(15, 20); rs.negate(); ASSERT_THAT(*rs.begin(), EqOpenBegin(5)); ASSERT_THAT(*(++rs.begin()), EqRun(10, 15)); ASSERT_THAT(*(++(++rs.begin())), EqOpenEnd(20)); ASSERT_THAT(++(++(++rs.begin())), Eq(rs.end())); } TEST_F(RunSetTests, negate_negate) { run_set rs; rs.add(5, 10); rs.add(15, 20); rs.negate(); rs.negate(); ASSERT_THAT(*rs.begin(), EqRun(5, 10)); ASSERT_THAT(*(++rs.begin()), EqRun(15, 20)); ASSERT_THAT(++(++rs.begin()), Eq(rs.end())); } //----------------------------------------------------------------