Я пишу компилятор Tiger
в C#
и собираюсь перевести код Tiger
в IL
.
Реализуя семантическую проверку каждого узла в моем AST, я создал для этого множество модульных тестов. Это довольно просто, потому что мой метод CheckSemantic
выглядит так:
public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
поэтому, если я хочу написать модульный тест для семантической проверки некоторого узла, все, что мне нужно сделать, это создать AST и вызвать этот метод. Тогда я могу сделать что-то вроде:
Assert.That(errors.Count == 0);
or
Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));
но я начинаю генерацию кода в этот момент, и я не знаю, что может быть хорошей практикой при написании модульных тестов для этой фазы.
Я использую класс ILGenerator
. Я подумал о следующем:
- Сгенерируйте код примера программы, который я хочу протестировать
- Сохраните сгенерированный код как
test.exe
- Выполните
text.exe
и сохраните вывод вresults
- Выступить против
results
но мне интересно, есть ли лучший способ сделать это?