У меня есть конечный автомат с относительно небольшим набором состояний и входов, и я хочу тщательно проверить переходы.
Переходы кодируются с использованием Map<State, Map<Input, State>>
, код выглядит примерно так:
enum State {
S1,
// ...
}
enum Input {
I1,
// ...
}
class StateMachine {
State current;
Map<State, Map<Input, State>> transitions = {
S1: {
I1: S2,
// ...
},
// ...
};
State changeState(Input x) {
if (transitions[current] == null)
throw Error('Unknows state ${current}');
if (transitions[current][x] == null)
throw Error('Unknown transition from state ${current} with input ${x}');
current = transitions[current][x];
return current;
}
void execute() {
// ...
}
}
Чтобы проверить это, я вижу 3 подхода:
1) Напишите партию стандартного кода для проверки каждой комбинации
2) Автоматизация создания тестов: мне кажется, это лучший подход, но в конечном итоге это будет использовать структуру, идентичную Map, используемой в StateMachine. Что я должен делать? Скопировать карту в тестовый файл или импортировать ее из файла реализации? Последнее делает тестовый файл зависимым от реализации и не выглядит хорошей идеей.
3) Проверить карту на равенство, та же проблема, что и раньше: равенство с самим собой или с копией? Этот подход по сути то, что я делаю с другими 2, но не похоже на канонический тест