class DFATests(unittest.TestCase):
    def setUp(self):
        """delta table
           L = {w | w ∈ Σ*={a, b} and |w| is pair}

           delta |   a   |   b   |
           ------|-------|-------|
           *->q0 |   q1  |  q1   |
              q1 |   q0  |  q0   |
           ----------------------|
        """
        self.delta = {'q0': {'a': {'q1'}, 'b': {'q1'}}, 'q1': {'a': {'q0'}, 'b': {'q0'}}}

        initial_state = 'q0'
        accept_states = ['q0']
        self.dfa = DFA(self.delta, initial_state, accept_states)

    def test_accept_sentence_abab(self):
        """
        DFA accept sentence 'abab'
        """
        is_accept = self.dfa.validate_sentence('abab')
        self.assertTrue(is_accept)

    def test_reject_sentence_ababa(self):
        """
        DFA reject sentence 'ababa'
        """
        is_accept = self.dfa.validate_sentence('ababa')
        self.assertFalse(is_accept)

    def test_get_alphabet_from_DFA(self):
        """
        get alphabeth from DFA
        alphabeth = {a, b}
        """
        sigma = self.dfa.get_alphabet()
        self.assertSetEqual({'a', 'b'}, sigma)

    def test_get_states_from_DFA(self):
        """
        get states from DFA
        states {q0, q1}
        """
        states = self.dfa.get_states()
        self.assertSetEqual({'q0', 'q1'}, states)
    def setUp(self):
        """delta table
           L = {w | w ∈ Σ*={a, b} and |w| is pair}

           delta |   a   |   b   |
           ------|-------|-------|
           *->q0 |   q1  |  q1   |
              q1 |   q0  |  q0   |
           ----------------------|
        """
        self.delta = {'q0': {'a': {'q1'}, 'b': {'q1'}}, 'q1': {'a': {'q0'}, 'b': {'q0'}}}

        initial_state = 'q0'
        accept_states = ['q0']
        self.dfa = DFA(self.delta, initial_state, accept_states)