Go Лучшая практика внедрения DFA - PullRequest
0 голосов
/ 28 марта 2020

Предположим, мне нужно написать простой 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")
    }()
}
...