Предположим, мне нужно написать простой DFA в Go (dfa.go
ниже подсчитывает, является ли число вхождений "A" нечетным)
Однако при написании тестов (dfa_test.go
), Я не могу достичь 100% покрытия (используя go test -cover
), потому что строка 33 не может быть покрыта. Удаление этой строки определенно решает проблему, но я все еще хочу, чтобы код pani c при неправильной реализации DFA (например, если я изменяю его на подсчет числа A по модулю 3, легко ошибиться)
Так что же является хорошей практикой программирования при написании DFA в Go?
dfa.go
:
package dfa
func DFA(input string) int {
/*
Transitions:
(0, 'A') -> 1
(0, 'B') -> 0
(1, 'A') -> 0
(1, 'B') -> 1
*/
state := 0 // start state
for _, i := range input {
switch {
case state == 0:
switch i {
case 'A':
state = 1
case 'B':
state = 0
default:
panic("Invalid input")
}
case state == 1:
switch i {
case 'A':
state = 0
case 'B':
state = 1
default:
panic("Invalid input")
}
default:
panic("Invalid state") // line 33
}
}
return state
}
dfa_test.go
:
package dfa
import (
"testing"
)
func TestDFA(t *testing.T) {
if DFA("AABBAABBABA") != 0 {
t.Errorf("error")
}
func() {
defer func() {
if recover() == nil {
t.Errorf("error")
}
}()
DFA("AC")
}()
func() {
defer func() {
if recover() == nil {
t.Errorf("error")
}
}()
DFA("C")
}()
}