TEST(IfTest, VersionAfterThenElseWithSingleAnyVar) { bool ok; Int i = any_int("I"); If branch(i < 5); branch.track(i); ok = branch.begin_then(); EXPECT_TRUE(ok); i = i + any_int("A"); EXPECT_EQ(VZERO + 1, i.get_version()); ok = branch.begin_else(); EXPECT_TRUE(ok); EXPECT_EQ(VZERO + 2, i.get_version()); i = i + any_int("A"); EXPECT_EQ(VZERO + 3, i.get_version()); branch.end(); // version increase due to join operation EXPECT_EQ(VZERO + 4, i.get_version()); }
TEST(VersionTest, InitWithValue) { Int a = 3; Int b = a + 4; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); }
TEST(VersionTest, SelfAssignmentAfterInit) { Int a = 3; Int b = any_int("B"); Char c = 'c'; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); a = a; b = b; c = c; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); }
TEST(VersionTest, InitWithVarRequiringCast) { Bool a = any_bool("A"); Char b = any_char("B"); Int c = b; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); }
TEST(VersionTest, InitWithAny) { Bool a = any_bool("A"); Char b = any_char("B"); Int c = any_int("C"); EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); }
TEST(VersionTest, InitWithConcrete) { Bool a = true; Bool b = true; Char c = 'a'; Int d = 3; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); EXPECT_EQ(0, d.get_version()); }
TEST(LoopTest, VersionAfterUnwind1xWithSingleVarWithAny) { bool ok; Int i = any_int("I"); Loop loop(1u); loop.track(i); // 1x ok = loop.unwind(i < 5); EXPECT_TRUE(ok); i = i + any_int("A"); EXPECT_EQ(VZERO + 1, i.get_version()); // 2x ok = loop.unwind(any_bool("ANY")); EXPECT_FALSE(ok); // version increase due to join operation EXPECT_EQ(VZERO + 2, i.get_version()); }
TEST(VersionTest, SelfAssignmentAfterOperations) { Int a = 3; Int b = any_int("B"); Char c = 'c'; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); // some operations a = a + b + c; b = a + b + c; b = 5; c = c + 'x'; c = 'y'; c = 'z' + c; EXPECT_EQ(1, a.get_version()); EXPECT_EQ(2, b.get_version()); EXPECT_EQ(3, c.get_version()); a = a; b = b; c = c; EXPECT_EQ(1, a.get_version()); EXPECT_EQ(2, b.get_version()); EXPECT_EQ(3, c.get_version()); }
TEST(IfTest, VersionAfterThenWithExtraVar) { bool ok; Int i = any_int("I"); Int j = any_int("J"); If branch(i < 5); branch.track(i); branch.track(j); ok = branch.begin_then(); EXPECT_TRUE(ok); i = i + 1; EXPECT_EQ(VZERO + 1, i.get_version()); EXPECT_EQ(VZERO, j.get_version()); branch.end(); // version increase due to join operation EXPECT_EQ(VZERO + 2, i.get_version()); EXPECT_EQ(VZERO, j.get_version()); }
TEST(IfTest, VersionAfterThenElseWithExtraVar) { bool ok; Int i = any_int("I"); Int j = any_int("J"); If branch(i < 5); branch.track(i); branch.track(j); ok = branch.begin_then(); EXPECT_TRUE(ok); i = i + 1; EXPECT_EQ(VZERO + 1, i.get_version()); EXPECT_EQ(VZERO, j.get_version()); ok = branch.begin_else(); EXPECT_TRUE(ok); EXPECT_EQ(VZERO + 2, i.get_version()); // j has not been modified inside the "then" branch. EXPECT_EQ(VZERO, j.get_version()); i = i + 2; EXPECT_EQ(VZERO + 3, i.get_version()); EXPECT_EQ(VZERO, j.get_version()); branch.end(); // version increase due to join operation EXPECT_EQ(VZERO + 4, i.get_version()); // j has been neither modified inside the "then" nor "else" branch. EXPECT_EQ(VZERO, j.get_version()); }
TEST(VersionTest, GetVersion) { Int a = 3; Int b = any_int("B"); Char c = 'c'; EXPECT_EQ(0, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); a = b + 2 + c; EXPECT_EQ(1, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); a = 4 + b + c; EXPECT_EQ(2, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(0, c.get_version()); c = a + b; EXPECT_EQ(2, a.get_version()); EXPECT_EQ(0, b.get_version()); EXPECT_EQ(1, c.get_version()); b = 5; EXPECT_EQ(2, a.get_version()); EXPECT_EQ(1, b.get_version()); EXPECT_EQ(1, c.get_version()); b = a; EXPECT_EQ(2, a.get_version()); EXPECT_EQ(2, b.get_version()); EXPECT_EQ(1, c.get_version()); b = c; EXPECT_EQ(2, a.get_version()); EXPECT_EQ(3, b.get_version()); EXPECT_EQ(1, c.get_version()); }
TEST(VersionTest, InitWithValueRequiringCast) { Int a = make_value<char>('a'); EXPECT_EQ(0, a.get_version()); }