Песочница

Повторное сравнение сохранённых решений

Сравните сохранённые отчёты о решениях и отличите изменившийся возврат от ошибки, для которой сравнение невозможно.

Подготовьте Native Лиспекс и npm CLI, Node.js и Bash. В NATIVE укажите абсолютный путь к исполняемому файлу Native. В NPM_CLI укажите путь к bin/lispex.js установленного npm-пакета. Сначала пример запускает Native для создания отчётов. Затем команда npm vouch replay сравнивает сохранённые отчёты.

Подготовьте два случая

В новом рабочем каталоге создайте каталоги для отчётов.

SH
mkdir -p corpus/expected candidate

Команда ничего не печатает и завершается с кодом 0. Сохраните четыре файла целиком в UTF-8 с переводами строк LF и одним завершающим переводом строки.

refund-old.lspx

LISPEX
(if (<= input 14) '(decision allow) '(decision deny late))

refund-new.lspx

LISPEX
(if (<= input 13) '(decision allow) '(decision deny late))

fault.lspx

LISPEX
(/ input 0)

input.datum

14

Старое правило допускает возврат на 14-й день. Новое допускает его до 13-го дня включительно. Оба запуска fault.lspx пытаются выполнить деление на ноль.

Сохраните перечень случаев в corpus/manifest.json. Корпус — это набор случаев, выбранный до сравнения результатов.

JSON
{
  "decision_gallery": "csk.profile-decision-gallery/v0",
  "cases": [
    {
      "stem": "refund",
      "expected_transcript": [
        "(decision allow)"
      ]
    },
    {
      "stem": "fault",
      "expected_transcript": []
    }
  ]
}

Каждое значение stem задаёт имя JSON-файла без расширения в corpus/expected. Поле expected_transcript перечисляет ожидаемые записанные значения.

Запишите результаты обоих правил

Запустите каждый исходник с одним и тем же файлом input.datum.

SH
"$NATIVE" diff-receipt --input input.datum refund-old.lspx > corpus/expected/refund.json
"$NATIVE" diff-receipt --input input.datum refund-new.lspx > candidate/refund.json
"$NATIVE" diff-receipt --input input.datum fault.lspx > corpus/expected/fault.json
"$NATIVE" diff-receipt --input input.datum fault.lspx > candidate/fault.json

Первые две команды завершаются с кодом 0. Последние две возвращают код 1, поскольку деление на ноль препятствует сравнению. Каждая команда записывает полный отчёт csk.differential-receipt/v0 в указанный файл; stderr остаётся пустым.

Отчётcomparison.statusЗаписанный результат
corpus/expected/refund.jsonagree(decision allow)
candidate/refund.jsonagree(decision deny late)
Оба файла fault.jsonnot-comparableПустой список результатов и диагностика E313

Здесь agree означает совпадение двух способов выполнения внутри одного запуска. Native вычисляет исходник и построенное из него представление Meaning. Следующая команда сравнивает старый запуск с новым.

Сравните сохранённые отчёты

SH
node "$NPM_CLI" vouch replay corpus --against candidate > replay-report.json

Команда завершается с кодом 1, создаёт replay-report.json и печатает в stderr:

replay found behavioral differences
- refund: reference-transcript, meaning-env-transcript

Формат отчёта — csk.replay-report/v0. Поле summary целиком:

JSON
{
  "status": "changed",
  "exit_code": 1,
  "total": 2,
  "byte_changed": 1,
  "decision_changed": 1,
  "not_projectable": 2,
  "faults": 1
}

Одно решение о возврате изменилось. Один случай содержит ошибку выполнения. not_projectable: 2 учитывает старую и новую записи этого случая с ошибкой.

Прочитайте каждый случай

ПолеВозвратОшибка
old.statusagreenot-comparable
new.statusagreenot-comparable
changedtruefalse
decision.decision_changedtruenull

Для refund поле decision.old.datum равно (decision allow). Поле decision.new.datum равно (decision deny late). Для fault обе стороны решения имеют status: "not_projected" и причину not-attempted-runtime-or-meaning-fault.

changed: false у случая с ошибкой означает, что сравниваемые поля отчёта остались прежними. not-comparable означает, что выполнение не дало результатов, пригодных для сравнения. decision_changed: null означает, что сравнить значения решений не удалось. Прочитайте эти поля вместе, прежде чем принимать результат.

Выберите данные для сравнения

В corpus/expected находятся прежние отчёты. --against candidate выбирает каталог новых отчётов. Сохраняйте оба набора, байты исходников и входа, а также идентификаторы исполняемых файлов.

Значение --againstДействие npm-команды
Каталог отчётовПроверяет согласованность отчётов, затем сравнивает записанные результаты, статус сравнения, хеши входа и состав случаев
Версия, например 1.20.0Проверяет записанную версию движка, привязку входа, совпадение и результаты по перечню случаев

При указании версии команда читает существующие записи. Для получения результатов другого правила или исполняемого файла запустите Native отдельно. Статус отчёта принимает значения unchanged, changed или failed-precondition. Даже отчёт unchanged может содержать ошибки: читайте также faults, not_projectable и сведения о случаях. Код 0 означает отсутствие различий при выбранном сравнении. Код 1 сообщает о различии или нарушении предварительных условий. Ошибки использования и чтения файлов дают код 2.

Команда npm проверяет сохранённые данные. Аутентификация Ваучера и новая проверка допуска в Native выполняются отдельно. Вызывающее приложение определяет актуальность запросов и разрешений, а также возможность их повторного использования. Оно же разрешает и выполняет внешние действия.

Ваучер Лиспекса · Отчёты Ваучера · Что делает приложение после решения