Merge branch 'dev' into feature/web-test-runner

This commit is contained in:
Nick Shirokov
2026-05-02 19:08:28 +03:00
30 changed files with 448 additions and 61 deletions
+15 -1
View File
@@ -14,10 +14,23 @@ node tests/skills/runner.mjs --verbose # подробн
node tests/skills/runner.mjs --update-snapshots # обновить эталоны
node tests/skills/runner.mjs --runtime python # запуск на PY-версиях
node tests/skills/runner.mjs --json report.json # JSON-отчёт
node tests/skills/runner.mjs --concurrency 4 # ограничить параллельность
node tests/skills/runner.mjs --with-validation # + платформенная валидация
node tests/skills/runner.mjs --help # полный список опций
```
Exit code: 0 = все прошли, 1 = есть падения.
### Платформенная верификация снапшотов
```bash
node tests/skills/verify-snapshots.mjs --skill form-compile # один навык
node tests/skills/verify-snapshots.mjs --case table # один кейс
node tests/skills/verify-snapshots.mjs --help # полный список опций
```
Перепрогоняет навык из DSL кейса и грузит результат в 1С — отлавливает случаи, когда снапшоты обновили, но платформа уже не принимает выход.
## Что делать при падении
1. Смотри **case id** в выводе — это путь к файлу кейса (можно перезапустить: `node runner.mjs <case-id>`)
@@ -194,7 +207,8 @@ node tests/skills/runner.mjs cases/meta-compile/enum --update-snapshots # од
```
tests/skills/
runner.mjs # тест-раннер
runner.mjs # тест-раннер (snapshot-сравнение)
verify-snapshots.mjs # платформенная верификация снапшотов
README.md # этот файл
.cache/ # кэш фикстур (в .gitignore)
cases/
@@ -6,11 +6,13 @@
<v8:content>Денежные средства</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Список" id="1">
<DataPath>Список</DataPath>
<CommandBarLocation>None</CommandBarLocation>
<RowPictureDataPath>Список.DefaultPicture</RowPictureDataPath>
<ContextMenu name="СписокКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СписокКоманднаяПанель" id="3">
<Autofill>false</Autofill>
@@ -6,6 +6,7 @@
<v8:content>Валюты</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<UsualGroup name="ГруппаШапка" id="1">
@@ -34,6 +35,7 @@
</UsualGroup>
<CheckBoxField name="ЗагружаетсяИзИнтернета" id="11">
<DataPath>Объект.ЗагружаетсяИзИнтернета</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ЗагружаетсяИзИнтернетаКонтекстноеМеню" id="12"/>
<ExtendedTooltip name="ЗагружаетсяИзИнтернетаРасширеннаяПодсказка" id="13"/>
</CheckBoxField>
@@ -80,6 +82,7 @@
<v8:Type>cfg:CatalogObject.Валюты</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
<SavedData>true</SavedData>
</Attribute>
</Attributes>
</Form>
@@ -6,6 +6,7 @@
<v8:content>Валюты</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Список" id="1">
@@ -6,6 +6,7 @@
<v8:content>Виды номенклатуры</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<UsualGroup name="ГруппаШапка" id="1">
@@ -50,6 +51,7 @@
<v8:Type>cfg:ChartOfCharacteristicTypesObject.ВидыНоменклатуры</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
<SavedData>true</SavedData>
</Attribute>
</Attributes>
</Form>
@@ -6,6 +6,7 @@
<v8:content>Хозрасчетный</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<UsualGroup name="ГруппаШапка" id="1">
@@ -53,6 +54,7 @@
</InputField>
<CheckBoxField name="Забалансовый" id="16">
<DataPath>Объект.OffBalance</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ЗабалансовыйКонтекстноеМеню" id="17"/>
<ExtendedTooltip name="ЗабалансовыйРасширеннаяПодсказка" id="18"/>
</CheckBoxField>
@@ -68,11 +70,13 @@
<ChildItems>
<CheckBoxField name="Валютный" id="21">
<DataPath>Объект.Валютный</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ВалютныйКонтекстноеМеню" id="22"/>
<ExtendedTooltip name="ВалютныйРасширеннаяПодсказка" id="23"/>
</CheckBoxField>
<CheckBoxField name="Количественный" id="24">
<DataPath>Объект.Количественный</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="КоличественныйКонтекстноеМеню" id="25"/>
<ExtendedTooltip name="КоличественныйРасширеннаяПодсказка" id="26"/>
</CheckBoxField>
@@ -93,16 +97,19 @@
</InputField>
<CheckBoxField name="ТолькоОбороты" id="36">
<DataPath>Объект.ExtDimensionTypes.TurnoversOnly</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ТолькоОборотыКонтекстноеМеню" id="37"/>
<ExtendedTooltip name="ТолькоОборотыРасширеннаяПодсказка" id="38"/>
</CheckBoxField>
<CheckBoxField name="Валютный" id="39">
<DataPath>Объект.ExtDimensionTypes.Валютный</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ВалютныйКонтекстноеМеню" id="40"/>
<ExtendedTooltip name="ВалютныйРасширеннаяПодсказка" id="41"/>
</CheckBoxField>
<CheckBoxField name="Количественный" id="42">
<DataPath>Объект.ExtDimensionTypes.Количественный</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="КоличественныйКонтекстноеМеню" id="43"/>
<ExtendedTooltip name="КоличественныйРасширеннаяПодсказка" id="44"/>
</CheckBoxField>
@@ -6,6 +6,7 @@
<v8:content>Хозрасчетный</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Список" id="1">
@@ -111,6 +111,7 @@
</InputField>
<CheckBoxField name="Исправление" id="46">
<DataPath>Объект.Исправление</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ИсправлениеКонтекстноеМеню" id="47"/>
<ExtendedTooltip name="ИсправлениеРасширеннаяПодсказка" id="48"/>
</CheckBoxField>
@@ -242,6 +243,7 @@
<v8:Type>cfg:DocumentObject.АктВыполненныхВнутреннихРабот</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
<SavedData>true</SavedData>
</Attribute>
</Attributes>
</Form>
@@ -6,11 +6,13 @@
<v8:content>Акт выполненных внутренних работ</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Список" id="1">
<DataPath>Список</DataPath>
<CommandBarLocation>None</CommandBarLocation>
<RowPictureDataPath>Список.DefaultPicture</RowPictureDataPath>
<ContextMenu name="СписокКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СписокКоманднаяПанель" id="3">
<Autofill>false</Autofill>
@@ -6,6 +6,7 @@
<v8:content>Обмен данными</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<UsualGroup name="ГруппаШапка" id="1">
@@ -67,6 +68,7 @@
<v8:Type>cfg:ExchangePlanObject.ОбменДанными</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
<SavedData>true</SavedData>
</Attribute>
</Attributes>
</Form>
@@ -6,11 +6,13 @@
<v8:content>Цены номенклатуры</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Список" id="1">
<DataPath>Список</DataPath>
<CommandBarLocation>None</CommandBarLocation>
<RowPictureDataPath>Список.DefaultPicture</RowPictureDataPath>
<ContextMenu name="СписокКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СписокКоманднаяПанель" id="3">
<Autofill>false</Autofill>
@@ -6,6 +6,7 @@
<v8:content>Адреса магазинов</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<WindowOpeningMode>LockOwnerWindow</WindowOpeningMode>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
@@ -6,6 +6,7 @@
<v8:content>Курсы валют</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<WindowOpeningMode>LockOwnerWindow</WindowOpeningMode>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
@@ -6,6 +6,7 @@
<v8:content>Разные типы</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="Строка" id="1">
@@ -37,6 +38,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Строка" id="14">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Строка</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -46,6 +53,12 @@
</Type>
</Attribute>
<Attribute name="Число" id="15">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Число</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
@@ -56,6 +69,12 @@
</Type>
</Attribute>
<Attribute name="Дата" id="16">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Дата</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
@@ -64,6 +83,12 @@
</Type>
</Attribute>
<Attribute name="Булево" id="17">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Булево</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
@@ -6,6 +6,7 @@
<v8:content>Бригады</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<ChildItems>
<Button name="ИзменитьВыделенные" id="1">
@@ -19,6 +20,7 @@
<Table name="Список" id="3">
<DataPath>Список</DataPath>
<CommandBarLocation>None</CommandBarLocation>
<RowPictureDataPath>Список.DefaultPicture</RowPictureDataPath>
<ContextMenu name="СписокКонтекстноеМеню" id="4"/>
<AutoCommandBar name="СписокКоманднаяПанель" id="5">
<Autofill>false</Autofill>
@@ -50,6 +52,12 @@
</Attributes>
<Commands>
<Command name="ИзменитьВыделенные" id="13">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Изменить выделенные</v8:content>
</v8:item>
</Title>
<Action>ИзменитьВыделенные</Action>
</Command>
</Commands>
@@ -6,6 +6,7 @@
<v8:content>Товар</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="Наименование" id="1">
@@ -37,6 +38,7 @@
<v8:Type>cfg:CatalogObject.Товары</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
<SavedData>true</SavedData>
</Attribute>
</Attributes>
</Form>
@@ -6,6 +6,7 @@
<v8:content>Форма с командами</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>false</Autofill>
</AutoCommandBar>
@@ -27,6 +28,7 @@
<DataPath>Результат</DataPath>
<ReadOnly>true</ReadOnly>
<MultiLine>true</MultiLine>
<AutoMaxWidth>false</AutoMaxWidth>
<Height>8</Height>
<ContextMenu name="РезультатКонтекстноеМеню" id="7"/>
<ExtendedTooltip name="РезультатРасширеннаяПодсказка" id="8"/>
@@ -40,6 +42,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Результат" id="10">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Результат</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -51,6 +59,12 @@
</Attributes>
<Commands>
<Command name="Выполнить" id="11">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Выполнить</v8:content>
</v8:item>
</Title>
<Action>ВыполнитьОбработка</Action>
<Shortcut>Ctrl+Enter</Shortcut>
</Command>
@@ -6,11 +6,13 @@
<v8:content>Товары</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Список" id="1">
<DataPath>Список</DataPath>
<CommandBarLocation>None</CommandBarLocation>
<RowPictureDataPath>Список.DefaultPicture</RowPictureDataPath>
<ContextMenu name="СписокКонтекстноеМеню" id="2"/>
<AutoCommandBar name="СписокКоманднаяПанель" id="3">
<Autofill>false</Autofill>
@@ -6,6 +6,7 @@
<v8:content>События</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<Events>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
@@ -49,6 +50,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Организация" id="11">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Организация</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -58,6 +65,12 @@
</Type>
</Attribute>
<Attribute name="Период" id="12">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Период</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
@@ -38,6 +38,7 @@
</InputField>
<CheckBoxField name="ПерваяСтрокаЗаголовок" id="6">
<DataPath>ПерваяСтрокаЗаголовок</DataPath>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ПерваяСтрокаЗаголовокКонтекстноеМеню" id="7"/>
<ExtendedTooltip name="ПерваяСтрокаЗаголовокРасширеннаяПодсказка" id="8"/>
</CheckBoxField>
@@ -53,6 +54,7 @@
</Title>
<ReadOnly>true</ReadOnly>
<MultiLine>true</MultiLine>
<AutoMaxWidth>false</AutoMaxWidth>
<Height>8</Height>
<ContextMenu name="РезультатКонтекстноеМеню" id="10"/>
<ExtendedTooltip name="РезультатРасширеннаяПодсказка" id="11"/>
@@ -81,6 +83,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="ИмяФайла" id="19">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Имя файла</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -90,11 +98,23 @@
</Type>
</Attribute>
<Attribute name="ПерваяСтрокаЗаголовок" id="20">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Первая строка заголовок</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
<Attribute name="Результат" id="21">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Результат</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -106,6 +126,12 @@
</Attributes>
<Commands>
<Command name="Загрузить" id="22">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузить</v8:content>
</v8:item>
</Title>
<Action>ЗагрузитьОбработка</Action>
<Shortcut>Ctrl+Enter</Shortcut>
</Command>
@@ -6,6 +6,7 @@
<v8:content>Группы</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>false</Autofill>
</AutoCommandBar>
@@ -73,6 +74,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Поле1" id="16">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле1</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -82,6 +89,12 @@
</Type>
</Attribute>
<Attribute name="Поле2" id="17">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле2</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
@@ -92,6 +105,12 @@
</Type>
</Attribute>
<Attribute name="Поле3" id="18">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле3</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
@@ -6,6 +6,7 @@
<v8:content>Поля ввода</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<InputField name="ОбычноеПоле" id="1">
@@ -28,6 +29,7 @@
</v8:item>
</Title>
<MultiLine>true</MultiLine>
<AutoMaxWidth>false</AutoMaxWidth>
<Height>5</Height>
<ContextMenu name="МногострочноеПолеКонтекстноеМеню" id="5"/>
<ExtendedTooltip name="МногострочноеПолеРасширеннаяПодсказка" id="6"/>
@@ -81,6 +83,7 @@
<v8:content>Включено</v8:content>
</v8:item>
</Title>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ФлагКонтекстноеМеню" id="17"/>
<ExtendedTooltip name="ФлагРасширеннаяПодсказка" id="18"/>
</CheckBoxField>
@@ -93,6 +96,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="ОбычноеПоле" id="20">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Обычное поле</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -102,6 +111,12 @@
</Type>
</Attribute>
<Attribute name="МногострочноеПоле" id="21">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Многострочное поле</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -111,6 +126,12 @@
</Type>
</Attribute>
<Attribute name="ПолеПароля" id="22">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле пароля</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -120,6 +141,12 @@
</Type>
</Attribute>
<Attribute name="ПолеСКнопками" id="23">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле с кнопками</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -129,6 +156,12 @@
</Type>
</Attribute>
<Attribute name="ПолеПодсказка" id="24">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле подсказка</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -138,6 +171,12 @@
</Type>
</Attribute>
<Attribute name="Флаг" id="25">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Флаг</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
@@ -6,5 +6,6 @@
<v8:content>Минимальная форма</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
</Form>
@@ -83,6 +83,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Параметр1" id="20">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Параметр1</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -92,6 +98,12 @@
</Type>
</Attribute>
<Attribute name="Итог" id="21">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Итог</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -103,9 +115,21 @@
</Attributes>
<Commands>
<Command name="Назад" id="22">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Назад</v8:content>
</v8:item>
</Title>
<Action>НазадОбработка</Action>
</Command>
<Command name="Далее" id="23">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Далее</v8:content>
</v8:item>
</Title>
<Action>ДалееОбработка</Action>
</Command>
</Commands>
@@ -6,6 +6,7 @@
<v8:content>Тест синонимов</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<ChildItems>
<Button name="Кн1" id="1">
@@ -37,6 +38,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Поле" id="10">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
@@ -48,9 +55,21 @@
</Attributes>
<Commands>
<Command name="Кн1" id="11">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Кн1</v8:content>
</v8:item>
</Title>
<Action>Кн1</Action>
</Command>
<Command name="Кн2" id="12">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Кн2</v8:content>
</v8:item>
</Title>
<Action>Кн2</Action>
</Command>
</Commands>
@@ -6,6 +6,7 @@
<v8:content>Просмотр данных</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Table name="Данные" id="1">
@@ -43,6 +44,12 @@
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Данные" id="17">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Данные</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>v8:ValueTable</v8:Type>
</Type>
+23 -1
View File
@@ -18,11 +18,32 @@ const CACHE = resolve(ROOT, '.cache');
// ─── CLI args ───────────────────────────────────────────────────────────────
function printHelp() {
console.log(`skill-test-runner — Snapshot-based regression tests for 1C skill scripts
Usage:
node tests/skills/runner.mjs [filter] [options]
Arguments:
filter Substring to match case id (e.g. "form-compile" or "form-compile/table")
Options:
--update-snapshots Overwrite snapshot files with current actual output
--runtime <ps|python> Which script port to run (default: powershell)
--json <path> Write JSON report to <path>
--concurrency <N> Number of parallel workers (default: cpu count)
--with-validation Run platform validation (1cv8 design checks) after compile
-v, --verbose Verbose output
-h, --help, /? Show this help and exit
`);
}
function parseArgs(argv) {
const args = { filter: null, updateSnapshots: false, runtime: 'powershell', jsonReport: null, verbose: false, concurrency: cpus().length, withValidation: false };
const args = { filter: null, updateSnapshots: false, runtime: 'powershell', jsonReport: null, verbose: false, concurrency: cpus().length, withValidation: false, help: false };
const rest = argv.slice(2);
for (let i = 0; i < rest.length; i++) {
const a = rest[i];
if (a === '-h' || a === '--help' || a === '/?' || a === '/help' || a === '?') { args.help = true; continue; }
if (a === '--update-snapshots') { args.updateSnapshots = true; continue; }
if (a === '--runtime' && rest[i + 1]) { args.runtime = rest[++i]; continue; }
if (a === '--json' && rest[i + 1]) { args.jsonReport = rest[++i]; continue; }
@@ -1042,6 +1063,7 @@ function printIntegrationReport(results, opts) {
async function main() {
const opts = parseArgs(process.argv);
if (opts.help) { printHelp(); return; }
mkdirSync(CACHE, { recursive: true });
// Load platform context for platform-dependent tests
+21 -1
View File
@@ -23,11 +23,30 @@ const REPORT_DIR = resolve(REPO_ROOT, 'debug/snapshot-verify');
// ─── CLI args ───────────────────────────────────────────────────────────────
function printHelp() {
console.log(`verify-snapshots — Platform verification of skill test snapshots
Reruns skill scripts from test-case DSL, then loads results into 1C platform.
Usage:
node tests/skills/verify-snapshots.mjs [options]
Options:
--skill <name> Run only cases for the given skill (e.g. form-compile)
--case <name> Run only the case with this name
--runtime <ps|python> Which script port to run (default: powershell)
--keep Keep generated work directories on disk after run
-v, --verbose Verbose output
-h, --help, /? Show this help and exit
`);
}
function parseArgs(argv) {
const args = { skill: null, caseName: null, runtime: 'powershell', keep: false, verbose: false };
const args = { skill: null, caseName: null, runtime: 'powershell', keep: false, verbose: false, help: false };
const rest = argv.slice(2);
for (let i = 0; i < rest.length; i++) {
const a = rest[i];
if (a === '-h' || a === '--help' || a === '/?' || a === '/help' || a === '?') { args.help = true; continue; }
if (a === '--skill' && rest[i + 1]) { args.skill = rest[++i]; continue; }
if (a === '--case' && rest[i + 1]) { args.caseName = rest[++i]; continue; }
if (a === '--runtime' && rest[i + 1]) { args.runtime = rest[++i]; continue; }
@@ -1034,6 +1053,7 @@ function writeReport(results) {
async function main() {
const opts = parseArgs(process.argv);
if (opts.help) { printHelp(); return; }
const v8ctx = loadV8Context();
if (!v8ctx) {