Эпик №1: базовый уровень языка #
К сдаче третьей итерации — то есть первого эпика целиком — ваш проект должен выполнять два новых требования:
- Если вы пишете интерпретатор со своей VM, то нужно описать спецификацию вирутальной машины
- Если вы пишете компилятор или интерпретатор на C#, то нужно провести анализ покрытия кода тестами
Для компиляторов на C++/LLVM новых требований нет.
Требование №1. Спецификация виртуальной машины #
Если вы разрабатываете интерпретатор со своей виртуальной машиной, то вы должны добавить файл 04_virtual_machine.md, который содержит:
- диаграмму, показывающую структуру вашей виртуальной машины
- текстовые пояснения к диаграмме
- список всех инструкций виртуальной машины с подробным описанием поведения каждой из них
Пример такой спецификации есть в PsTiger.
Диаграммы #
Диаграммы можно оформлять на языке Mermaid либо добавлять как изображения, экспортированные из Drawio
https://mermaid.js.org/syntax/classDiagram.html#syntax
Mermaid-диаграммы вставляются в markdown как блоки кода:
```mermaid
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +string owner
BankAccount : +decimal balance
BankAccount : +deposit(decimal amount)
BankAccount : +withdrawal(decimal amount)
```
Если вы предпочитаете drawio, то рекомендуется установить оффлайн приложение: https://www.drawio.com/
- Диаграммы из Drawio можно экспортировать в формате PNG
- Изображения в markdown добавляются так:
, например:
Требование №2. Анализ покрытия кода тестами #
Если вы разрабатываете проект на C#, то вы должны:
- Добавить возможность запуска тестов с анализом покрытия кода: см. Анализ покрытия тестами кода для C#/.NET.
- Провести как минимум один такой анализ и покрыть тестами существенные фрагменты кода, которые не были покрыты ранее
Как определить, что покрывать тестами #
Существенными фрагментами кода мы считаем все методы и участки кода с нетривиальным поведением — например, чтение экранированных символов в литералах строк.
Несущественные фрагменты кода можно тестами не покрывать.
Точно не требуют покрытия тестами:
- Выброс исключений, которые не должны возникать при нормальной работе компилятора
- Фрагменты кода в 1-2 строки, используемые для утилитарных целей
- Код, используемый только в тестах (однако такой код лучше разместить где-то в каталоге
tests/)
Стратегия тестирования #
Вы должны сделать фокус на приёмочные тесты, запускающие интерпретатор целиком:
- Для C# тесты должны строиться на XUnit. По желанию можно использовать языки Gherkin с помощью фреймворка Reqnroll.
- Каждая итерация сопровождается доработками приёмочных тестов
- Нужно сделать два вида приёмочных тестов
- тесты отдельных функций языка — можно поместить их в подкаталоге
Features/ - тесты полноценных программ — можно поместить их в подкаталоге
Programs/
- тесты отдельных функций языка — можно поместить их в подкаталоге