遵循DFA实施最佳做法

时间:2020-03-28 03:32:22

标签: go testing code-coverage dfa

假设我需要在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")
    }()
}

0 个答案:

没有答案