From e26f1228957fc3b57e5884be4001e463d7c8f18f Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 23 Aug 2026 16:27:43 +0300 Subject: [PATCH] =?UTF-8?q?docs(tests):=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20fakePlatform=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=20=D0=BA=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раннер получил новое поле — формат кейса обязан его описывать, иначе следующий автор снова напишет .cmd руками и пометит кейс osOnly. Отдельно сказано, что таким кейсам osOnly не нужен, и почему: именно забытый -posix двойник давал дыру, из-за которой на маке выполнялся один кейс из двенадцати. Co-Authored-By: Claude Opus 5 --- tests/skills/README.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/skills/README.md b/tests/skills/README.md index 4256f47cb..8c667ea38 100644 --- a/tests/skills/README.md +++ b/tests/skills/README.md @@ -370,7 +370,8 @@ ibcmd-проход автоматически `○ skipped`, если рядом | `noSnapshot` | нет | Непустая строка с причиной — кейс объявляет, что эталон не нужен (см. «Эталоны») | | `idempotent` | нет | `true` — повторный прогон с теми же аргументами должен дать байт-в-байт тот же `workDir` | | `runtimeOnly` | нет | `"powershell"` / `"python"` — кейс имеет смысл только на одном порте, на другом `○ skipped` | -| `osOnly` | нет | `"win32"` / `"darwin"` / `"linux"` — кейс работает только на этой ОС (напр. фейк платформы написан как `.cmd`), на других `○ skipped`. Принимает и массив: `["darwin","linux"]` | +| `osOnly` | нет | `"win32"` / `"darwin"` / `"linux"` — кейс работает только на этой ОС, на других `○ skipped`. Принимает и массив: `["darwin","linux"]`. Для фейка платформы **не нужен**: см. `fakePlatform` | +| `fakePlatform` | нет | `{ "log": "…", "exit": 0 }` — кейсу нужна фейковая платформа (см. ниже) | | `cwd` | нет | `"workDir"` — запустить навык из рабочего каталога (нужно, если кейс кладёт туда `.v8-project.json`) | | `skipValidation` | нет | `true` — не запускать `postValidate` из `_skill.json` (только при `--with-validation`) | | `skipPlatformVerify` | нет | Непустая строка с причиной — `verify-snapshots.mjs` пропускает кейс. Нужен, когда фикстура не является конфигурацией, которую можно загрузить (напр. фрагмент расширения). Объект `{"reason": "…", "platforms": ["8.3.27.1688"]}` — пропуск только на перечисленных сборках платформы: кейс валиден, но конкретная сборка его не принимает, а на остальных стендах проверка должна остаться | @@ -421,6 +422,33 @@ ibcmd-проход автоматически `○ skipped`, если рядом `preserves` и эталон **дополняют** друг друга: первый следит за байтовым стилем файла, второй — за структурой содержимого. Наличие одного не отменяет необходимости другого. +### Фейковая платформа (`fakePlatform`) + +Кейс объявляет, что платформа должна положить в `/Out` и с каким кодом выйти. Раннер сам кладёт +`fake.cmd` (Windows) или `fake.sh` с битом исполнения (*nix), пишет `log.txt` и заглушку базы +`ib/1Cv8.1CD`, а в `args_extra` подставляет путь вместо `{fakePlatform}`: + +```json +{ + "name": "Тихий отказ в логе: платформа вернула 0, навык предупреждает", + "fakePlatform": { "log": "Загрузка…\r\nНеверное свойство…\r\n", "exit": 0 }, + "args_extra": ["-V8Path", "{fakePlatform}", "-InfoBasePath", "{workDir}/ib"], + "expect": { "stdoutContains": "[warning] platform reported success" } +} +``` + +| Поле | По умолчанию | Описание | +|------|--------------|----------| +| `log` | `""` | Содержимое `/Out`. Пишется как есть — с BOM и CRLF, если объявлены: настоящий `/Out` выглядит именно так | +| `exit` | `0` | Код возврата фейка | +| `baseStub` | `true` | `false` — не создавать `ib/1Cv8.1CD` (для кейсов, проверяющих отказ на отсутствующей базе) | + +**Не ставьте таким кейсам `osOnly`.** Смысл поля в том, что один кейс проверяется на обеих ОС: +раньше сценарий писался под `.cmd`, помечался `osOnly: win32` и требовал `-posix` двойника, а +забытый двойник означал дыру — у `db-repo` на маке выполнялся один кейс из двенадцати. + +Пути в `args_extra` пишите через `/`: он работает на обеих ОС. + ### Шаги `preRun` Массив шагов, выполняемых до запуска проверяемого навыка: