TEST_F(TestDFA, Equivalence) { instance << "q0"; instance << "q1"; instance.addTransition("q0", "q1", 'a'); instance.accept("q1"); DFA copy; ASSERT_NO_THROW(copy = ~~instance); ASSERT_EQ(instance.size(), copy.size()); DFA almostEqual; almostEqual << "q0"; almostEqual << "q1"; almostEqual.addTransition("q0", "q1", 'b'); almostEqual.accept("q1"); bool r; ASSERT_NO_THROW(r = (copy == instance)); EXPECT_TRUE(r); EXPECT_EQ(2, instance.size()); EXPECT_EQ(2, copy.size()); ASSERT_NO_THROW(r = (almostEqual == instance)); EXPECT_FALSE(r); EXPECT_EQ(2, instance.size()); EXPECT_EQ(2, almostEqual.size()); }
TEST_F(TestDFA, Containment) { instance << "q0"; instance << "q1"; instance << "q2"; instance << "q3"; instance.addTransition("q0", "q1", 'a'); instance.addTransition("q0", "q1", 'b'); instance.addTransition("q1", "q2", 'a'); instance.addTransition("q1", "q2", 'b'); instance.addTransition("q2", "q3", 'a'); instance.addTransition("q2", "q3", 'b'); instance.addTransition("q3", "q0", 'a'); instance.addTransition("q3", "q0", 'b'); instance.accept("q0"); instance.accept("q2"); DFA second; second << "q0"; second << "q1"; second.addTransition("q0", "q1", 'a'); second.addTransition("q1", "q0", 'a'); second.accept("q0"); bool r1, r2; ASSERT_NO_THROW(r1 = instance.contains(second)); ASSERT_NO_THROW(r2 = second.contains(instance)); EXPECT_TRUE(r1); EXPECT_FALSE(r2); EXPECT_EQ(4, instance.size()); EXPECT_EQ(2, second.size()); }
TEST_F(TestDFA, Acceptance) { instance << "q0"; instance << "q1"; instance << "q2"; instance.addTransition("q0", "q1", 'a'); instance.addTransition("q1", "q2", 'b'); instance.addTransition("q2", "q1", 'b'); instance.accept("q2"); instance.read("ab"); EXPECT_TRUE(instance.accepts()); instance.reset(); instance.read("abb"); EXPECT_FALSE(instance.accepts()); DFA other; other << "q0"; other.accept("q0"); EXPECT_TRUE(other.accepts()); other.read("a"); EXPECT_FALSE(other.accepts()); other.reset(); EXPECT_TRUE(other.accepts()); }
TEST_F(TestDFA, Union) { instance << "q0"; instance << "q1"; instance << "q2"; instance.addTransition("q0", "q1", 'a'); instance.addTransition("q1", "q2", 'a'); instance.addTransition("q2", "q0", 'a'); instance.accept("q0"); DFA second; second << "q0"; second << "q1"; second.addTransition("q0", "q1", 'a'); second.addTransition("q1", "q0", 'a'); second.accept("q0"); DFA unionDFA = instance | second; EXPECT_EQ(3, instance.size()); EXPECT_EQ(2, second.size()); EXPECT_EQ(6, unionDFA.size()); EXPECT_TRUE(unionDFA.accepts()); unionDFA.read("a"); EXPECT_FALSE(unionDFA.accepts()); unionDFA.read("a"); EXPECT_TRUE(unionDFA.accepts()); unionDFA.read("a"); EXPECT_TRUE(unionDFA.accepts()); unionDFA.read("a"); EXPECT_TRUE(unionDFA.accepts()); unionDFA.read("a"); EXPECT_FALSE(unionDFA.accepts()); unionDFA.read("a"); EXPECT_TRUE(unionDFA.accepts()); }
TEST_F(TestDFA, Intersection) { instance << "q0"; instance << "q1"; instance << "q2"; instance.addTransition("q0", "q1", 'a'); instance.addTransition("q1", "q2", 'a'); instance.addTransition("q2", "q0", 'a'); instance.accept("q0"); DFA second; second << "q0"; second << "q1"; second.addTransition("q0", "q1", 'a'); second.addTransition("q1", "q0", 'a'); second.accept("q0"); DFA intersection = instance & second; EXPECT_EQ(3, instance.size()); EXPECT_EQ(2, second.size()); EXPECT_EQ(6, intersection.size()); EXPECT_TRUE(intersection.accepts()); intersection.read("a"); EXPECT_FALSE(intersection.accepts()); intersection.read("a"); EXPECT_FALSE(intersection.accepts()); intersection.read("a"); EXPECT_FALSE(intersection.accepts()); intersection.read("a"); EXPECT_FALSE(intersection.accepts()); intersection.read("a"); EXPECT_FALSE(intersection.accepts()); intersection.read("a"); EXPECT_TRUE(intersection.accepts()); }
TEST_F(TestDFA, RValueOperations) { DFA first; first << "q0" << "q1" << "q2"; first.addTransition("q0", "q1", 'a'); first.addTransition("q1", "q2", 'a'); first.addTransition("q2", "q0", 'a'); first.accept("q0"); DFA second; second << "q0" << "q1"; second.addTransition("q0", "q1", 'a'); second.addTransition("q1", "q0", 'a'); second.accept("q1"); EXPECT_NO_THROW(first & ~second); EXPECT_NO_THROW(first | ~second); EXPECT_NO_THROW(first == ~second); EXPECT_NO_THROW(first.contains(~second)); EXPECT_NO_THROW(second.contains(~first)); }