假设我需要在Go中编写一个简单的DFA(下面的dfa.go
用来计算“ A”的出现次数是否为奇数)
但是,在编写测试(dfa_test.go
时,我无法达到100%的覆盖率(使用go test -cover
),因为第33行无法覆盖。删除此行肯定可以解决问题,但是当DFA实现不正确时,我仍然希望代码崩溃(例如,如果我将其更改为对A模3的数量进行计数,很容易出错)
那么在Go中编写DFA时有什么好的编程习惯?
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")
}()
}