TEST_F(TestDFA, Complement) { 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 complement; ASSERT_NO_THROW(complement = ~instance); EXPECT_EQ(3, instance.size()); EXPECT_EQ(3, complement.size()); EXPECT_TRUE(instance.accepts()); EXPECT_FALSE(complement.accepts()); instance.read("a"); complement.read("a"); EXPECT_FALSE(instance.accepts()); EXPECT_TRUE(complement.accepts()); instance.read("a"); complement.read("a"); EXPECT_FALSE(instance.accepts()); EXPECT_TRUE(complement.accepts()); instance.read("a"); complement.read("a"); EXPECT_TRUE(instance.accepts()); EXPECT_FALSE(complement.accepts()); }
TEST_F(TestDFA, EquivalentStateRemoval) { instance << "q0"; instance << "q1"; instance << "q2"; instance << "q3"; instance << "q4"; instance << "q5"; instance.addTransition("q0", "q1", 'a'); instance.addTransition("q1", "q2", 'b'); instance.addTransition("q2", "q2", 'c'); instance.addTransition("q3", "q3", 'd'); instance.addTransition("q3", "q4", 'a'); instance.addTransition("q4", "q5", 'a'); instance.addTransition("q5", "q3", 'a'); instance.accept("q2"); EXPECT_EQ(6, instance.size()); instance.read("abc"); EXPECT_TRUE(instance.accepts()); instance.read("d"); EXPECT_FALSE(instance.accepts()); DFA other = instance.withoutDeadStates(); EXPECT_EQ(3, other.size()); EXPECT_EQ(other.initialState(), instance.initialState()); other.read("abc"); EXPECT_TRUE(other.accepts()); other.read("d"); EXPECT_FALSE(other.accepts()); }
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()); }