@@ -87,7 +87,7 @@ def test_deterministic(self):
8787 assert not dfa .accepts ([point ])
8888 assert not dfa .accepts ([plus ])
8989
90- def test_union (self ):
90+ def test_union0 (self ):
9191 """ Tests the union of two epsilon NFA """
9292 enfa0 = get_enfa_example0 ()
9393 enfa1 = get_enfa_example1 ()
@@ -101,7 +101,25 @@ def test_union(self):
101101 assert not enfa .accepts ([symb_a ])
102102 assert not enfa .accepts ([])
103103
104- def test_concatenate (self ):
104+ def test_union1 (self ):
105+ """
106+ Tests the union of three ENFAs.
107+ Union is (a*b)|(ab+)|c
108+ """
109+ enfa0 = get_enfa_example0 ()
110+ enfa1 = get_enfa_example1 ()
111+ enfa2 = get_enfa_example2 ()
112+ enfa = enfa0 | enfa2
113+ enfa |= enfa1
114+ accepted_words = list (enfa .get_accepted_words (3 ))
115+ assert ["b" ] in accepted_words
116+ assert ["a" , "b" ] in accepted_words
117+ assert ["a" , "a" , "b" ] in accepted_words
118+ assert ["a" , "b" , "b" ] in accepted_words
119+ assert ["c" ] in accepted_words
120+ assert len (accepted_words ) == 5
121+
122+ def test_concatenate0 (self ):
105123 """ Tests the concatenation of two epsilon NFA """
106124 enfa0 = get_enfa_example0 ()
107125 enfa1 = get_enfa_example1 ()
@@ -116,7 +134,23 @@ def test_concatenate(self):
116134 assert not enfa .accepts ([symb_b ])
117135 assert not enfa .accepts ([])
118136
119- def test_kleene (self ):
137+ def test_concatenate1 (self ):
138+ """
139+ Tests the concatenation of three ENFAs.
140+ Concatenation is a*bc((ab+)|c)
141+ """
142+ enfa0 = get_enfa_example0 ()
143+ enfa1 = get_enfa_example1 ()
144+ enfa2 = get_enfa_example2 ()
145+ enfa = enfa0 + enfa1
146+ enfa += enfa2
147+ accepted_words = list (enfa .get_accepted_words (4 ))
148+ assert ["b" , "c" , "c" ] in accepted_words
149+ assert ["a" , "b" , "c" , "c" ] in accepted_words
150+ assert ["b" , "c" , "a" , "b" ] in accepted_words
151+ assert len (accepted_words ) == 3
152+
153+ def test_kleene0 (self ):
120154 """ Tests the kleene star of an epsilon NFA """
121155 enfa0 = get_enfa_example0 ()
122156 symb_a = Symbol ("a" )
@@ -130,6 +164,23 @@ def test_kleene(self):
130164 assert not enfa .accepts ([symb_a ])
131165 assert not enfa .accepts ([symb_a , symb_b , symb_a ])
132166
167+ def test_kleene1 (self ):
168+ """
169+ Tests the kleene star of an ENFA.
170+ Expression is ((ab+)|c)*
171+ """
172+ enfa = get_enfa_example2 ()
173+ enfa = enfa .kleene_star ()
174+ accepted_words = list (enfa .get_accepted_words (3 ))
175+ assert [] in accepted_words
176+ assert ["a" , "b" ] in accepted_words
177+ assert ["a" , "b" , "b" ] in accepted_words
178+ assert ["a" , "b" , "c" ] in accepted_words
179+ assert ["c" , "a" , "b" ] in accepted_words
180+ for i in range (3 ):
181+ assert ["c" ] * (i + 1 ) in accepted_words
182+ assert len (accepted_words ) == 8
183+
133184 def test_complement (self ):
134185 """ Tests the complement operation """
135186 enfa = EpsilonNFA ()
@@ -544,7 +595,7 @@ def get_enfa_example0():
544595
545596
546597def get_enfa_example1 ():
547- """ Gives and example ENFA
598+ """ Gives an example ENFA
548599 Accepts c
549600 """
550601 enfa1 = EpsilonNFA ()
@@ -557,6 +608,21 @@ def get_enfa_example1():
557608 return enfa1
558609
559610
611+ def get_enfa_example2 ():
612+ """ Gives an example ENFA
613+ Accepts (ab+)|c
614+ """
615+ enfa = EpsilonNFA (start_states = {0 , 3 },
616+ final_states = {2 , 4 })
617+ enfa .add_transitions ([
618+ (0 , "a" , 1 ),
619+ (1 , "b" , 2 ),
620+ (2 , "b" , 2 ),
621+ (3 , "c" , 4 ),
622+ ])
623+ return enfa
624+
625+
560626def get_enfa_example0_bis ():
561627 """ A non minimal NFA, equivalent to example0 """
562628 enfa0 = EpsilonNFA ()
0 commit comments