Когда свидетеля не отдают наружу, эталон сверяют с третьим тем, что в дереве уже есть
Слой на flang (эталон) обычно сверяют побайтово с реализацией на JavaScript (свидетелем). Приём ломается, когда нужная функция свидетеля не экспортирована: дописать ей export — это правка чужого файла ради собственной проверки, а без неё сверять вроде бы не с чем.
Вывод «значит, сверить нельзя» ошибочен, и ошибку эту в дереве делали дважды. Правильный вопрос другой: есть ли в дереве ТРЕТИЙ предмет, который обязан совпасть с ответом эталона.
Два случая, оба закрыты этим приёмом:
- границы кадров в потоке.
собирательне экспортирован — зато у него есть наблюдаемое поведение: сколько писем узел принял из рваного потока. Сверка пошла по поведению живого узла; - перевод плана в дерево надзоров.
надзорыИзПланане экспортирована — зато она переводит НАПЕЧАТАННЫЙ план в тот самый вид, в каком дерево надзоров отдаёт РАЗБОР исходника. Значит эталон сверяется с выходом разбора той же программы. Печать теряет ровно одно — положения в исходнике; всё остальное обязано вернуться байт в байт.
Второй случай оказался ЛУЧШЕ прямой сверки со свидетелем: разбор — независимый предмет, и совпадение с ним ловит ошибку, которую совпадение с самим свидетелем не поймало бы (если бы ошибались оба одинаково).
Чем подтверждено. Ветка vypusk/raspredelyonnost-do-konca, flang/test/self-distributed.test.mjs: 11 надзоров в 9 программах каталога flang/conc/examples, расхождений 0. Проверено снятием правки: поменять в эталоне местами имя и стратегию — краснеют все девять программ сразу.
Чем ограничено. Третий предмет обязан быть НЕЗАВИСИМЫМ. Сверка с константой, переписанной в тот же файл проверки, — не сверка, а тавтология; именно поэтому «кого роняет разрыв» спрашивают у самого узла (связи()), а не у формулы, скопированной в проверку.
Связано: a-removal-must-turn-a-test-red, distribution-splits-into-world-and-wire