TEST_F(TestDFA, DeadStateRemoval) { instance << "q0"; instance << "q1"; instance << "q2"; instance << "q3"; instance.addTransition("q0", "q1", 'a'); instance.addTransition("q1", "q2", 'b'); instance.addTransition("q2", "q2", 'c'); instance.addTransition("q3", "q3", 'd'); EXPECT_EQ(4, instance.size()); DFA other = instance.withoutDeadStates(); EXPECT_EQ(0, other.size()); instance.accept("q1"); other = instance.withoutDeadStates(); EXPECT_EQ(2, other.size()); EXPECT_EQ(other.initialState(), instance.initialState()); instance.accept("q3"); other = instance.withoutDeadStates(); EXPECT_EQ(3, other.size()); EXPECT_EQ(other.initialState(), instance.initialState()); DFA empty; ASSERT_NO_THROW(empty.withoutDeadStates()); EXPECT_EQ(0, empty.withoutDeadStates().size()); }
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, UselessStateRemoval) { instance << "q0"; instance << "q1"; instance << "q2"; instance << "q3"; instance.accept("q1"); instance.addTransition("q0", "q1", 'a'); instance.addTransition("q1", "q2", 'b'); instance.addTransition("q2", "q2", 'c'); instance.addTransition("q3", "q3", 'd'); EXPECT_EQ(4, instance.size()); DFA other = instance.withoutUselessStates(); EXPECT_EQ(2, other.size()); EXPECT_EQ(other.initialState(), instance.initialState()); }
TEST_F(TestDFA, Minimization) { instance << "q0"; instance << "q1"; instance << "q2"; instance << "q3"; instance << "q4"; instance << "q5"; instance.accept("q3"); instance.addTransition("q0", "q1", 'a'); instance.addTransition("q0", "q2", 'b'); instance.addTransition("q1", "q2", 'b'); instance.addTransition("q2", "q1", 'b'); instance.addTransition("q1", "q3", 'c'); instance.addTransition("q2", "q3", 'c'); instance.addTransition("q3", "q4", 'a'); instance.addTransition("q4", "q4", 'b'); instance.addTransition("q5", "q2", 'a'); DFA minimized; ASSERT_NO_THROW(minimized = instance.minimized()); EXPECT_EQ(3, minimized.size()); EXPECT_EQ(minimized.initialState().getName(), instance.initialState().getName()); }