From 8770ef940bbd4bcf0e1e6305d9adca5647f3d7ed Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 15 Aug 2026 13:54:57 +0300 Subject: [PATCH] =?UTF-8?q?test(mxl):=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=B5=D0=B9=D1=81=D0=B0=D0=BC=D0=B8=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ключ control возился дословно, но проверялся только косвенно — через платформенную фикстуру стенда. Теперь у него свои кейсы на обе стороны (сборка блоба из DSL и раундтрип), строка в описании ячейки с пометкой «раундтрип, не для ручного авторинга» и проверка в валидаторе: значение и настройки элемента управления бывают только у ячейки-поля ввода — на корпусе ни одного вхождения в обычной ячейке. Проверки ячеек со значением заодно перестали зависеть от наличия таких форматов в макете: раньше блок целиком пропускался, когда ни одного формата с признаком значения нет, — то есть ровно в том случае, который эта проверка и ловит. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/mxl-compile/reference/dsl-spec.md | 4 +- .../mxl-validate/scripts/mxl-validate.ps1 | 84 +++++++++-------- .../mxl-validate/scripts/mxl-validate.py | 91 ++++++++++++------- docs/mxl-dsl-spec.md | 4 +- .../value-control-settings/Template.xml | 71 +++++++++++++++ .../mxl-compile/value-control-settings.json | 31 +++++++ .../roundtrip-control-settings.json | 51 +++++++++++ .../roundtrip-control-settings/Template.xml | 71 +++++++++++++++ .../roundtrip-control-settings/back.json | 21 +++++ .../error-value-tags-without-flag.json | 7 ++ .../value-tags-without-flag/Template.xml | 38 ++++++++ 11 files changed, 399 insertions(+), 74 deletions(-) create mode 100644 tests/skills/cases/mxl-compile/snapshots/value-control-settings/Template.xml create mode 100644 tests/skills/cases/mxl-compile/value-control-settings.json create mode 100644 tests/skills/cases/mxl-decompile/roundtrip-control-settings.json create mode 100644 tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/Template.xml create mode 100644 tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/back.json create mode 100644 tests/skills/cases/mxl-validate/error-value-tags-without-flag.json create mode 100644 tests/skills/cases/mxl-validate/fixtures/value-tags-without-flag/Template.xml diff --git a/.claude/skills/mxl-compile/reference/dsl-spec.md b/.claude/skills/mxl-compile/reference/dsl-spec.md index bbf10aa3..4f7f123b 100644 --- a/.claude/skills/mxl-compile/reference/dsl-spec.md +++ b/.claude/skills/mxl-compile/reference/dsl-spec.md @@ -152,7 +152,8 @@ | `{ ... }` | Обычная ячейка **без** `col`; нужна для `style`, `detail`, `template` | Объект-элемент трактуется по его ключам: если среди них есть ключ ячейки (`span`, `rowspan`, -`style`, `param`, `detail`, `text`, `template`, `valueType`, `controlType`, `value`) — объект +`style`, `param`, `detail`, `text`, `template`, `valueType`, `controlType`, `value`, +`control`) — объект описывает свойства ячейки. Иначе он целиком считается её текстом, а его ключи — идентификаторами языков. @@ -186,6 +187,7 @@ | `valueType` | нет | — | Тип значения: ячейка становится полем ввода (см. ниже) | | `controlType` | нет | `input` | Элемент управления поля ввода: `input` или `checkbox`. Только вместе с `valueType` | | `value` | нет | — | Значение в поле ввода. Только вместе с `valueType` | +| `control` | нет | — | Настройки элемента управления в записи платформы (base64). Раундтрип, не для ручного авторинга | ### Содержимое ячейки diff --git a/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 b/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 index 1d4365c1..fc64e5f0 100644 --- a/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 +++ b/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 @@ -1,4 +1,4 @@ -# mxl-validate v1.3 — Validate 1C spreadsheet +# mxl-validate v1.4 — Validate 1C spreadsheet # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Alias('Path')] @@ -449,43 +449,53 @@ for ($i = 0; $i -lt $formatNodes.Count; $i++) { } } +foreach ($ri in $root.SelectNodes("d:rowsItem", $nsMgr)) { + if ($stopped) { break } + $row = $ri.SelectSingleNode("d:row", $nsMgr) + if (-not $row) { continue } + $idxNode = $ri.SelectSingleNode("d:index", $nsMgr) + $rn = if ($idxNode) { $idxNode.InnerText } else { '?' } + $rowFmt = $row.SelectSingleNode("d:formatIndex", $nsMgr) + if ($rowFmt -and $valueFormatIdx.ContainsKey([int]$rowFmt.InnerText)) { + Report-Warn "Row ${rn}: formatIndex points to a value format (cell-only property)" + } + foreach ($cGroup in $row.SelectNodes("d:c", $nsMgr)) { + $cell = $cGroup.SelectSingleNode("d:c", $nsMgr) + if (-not $cell) { continue } + $fNode = $cell.SelectSingleNode("d:f", $nsMgr) + if (-not $fNode -or -not $valueFormatIdx.ContainsKey([int]$fNode.InnerText)) { + # Значение и настройки элемента управления бывают только у ячейки-поля ввода: + # на корпусе ни одного и ни одного в обычной ячейке. + if ($cell.SelectSingleNode("d:v", $nsMgr)) { + Report-Error "Row ${rn}: cell carries value but its format has no containsValue" + } + if ($cell.SelectSingleNode("d:control", $nsMgr)) { + Report-Error "Row ${rn}: cell carries control settings but its format has no containsValue" + } + continue + } + if ($cell.SelectSingleNode("d:tl", $nsMgr)) { + Report-Error "Row ${rn}: cell contains a value and text at the same time" + } + } +} +foreach ($cols in $root.SelectNodes("d:columns", $nsMgr)) { + foreach ($ci in $cols.SelectNodes("d:columnsItem", $nsMgr)) { + $col = $ci.SelectSingleNode("d:column", $nsMgr) + if (-not $col) { continue } + $fmtNode = $col.SelectSingleNode("d:formatIndex", $nsMgr) + if ($fmtNode -and $valueFormatIdx.ContainsKey([int]$fmtNode.InnerText)) { + $colIdxNode = $ci.SelectSingleNode("d:index", $nsMgr) + $colIdxText = if ($colIdxNode) { $colIdxNode.InnerText } else { '?' } + Report-Warn "Column ${colIdxText}: formatIndex points to a value format (cell-only property)" + } + } +} +$dfi = $root.SelectSingleNode("d:defaultFormatIndex", $nsMgr) +if ($dfi -and $valueFormatIdx.ContainsKey([int]$dfi.InnerText)) { + Report-Warn "defaultFormatIndex points to a value format (cell-only property)" +} if ($valueFormatIdx.Count -gt 0) { - foreach ($ri in $root.SelectNodes("d:rowsItem", $nsMgr)) { - if ($stopped) { break } - $row = $ri.SelectSingleNode("d:row", $nsMgr) - if (-not $row) { continue } - $idxNode = $ri.SelectSingleNode("d:index", $nsMgr) - $rn = if ($idxNode) { $idxNode.InnerText } else { '?' } - $rowFmt = $row.SelectSingleNode("d:formatIndex", $nsMgr) - if ($rowFmt -and $valueFormatIdx.ContainsKey([int]$rowFmt.InnerText)) { - Report-Warn "Row ${rn}: formatIndex points to a value format (cell-only property)" - } - foreach ($cGroup in $row.SelectNodes("d:c", $nsMgr)) { - $cell = $cGroup.SelectSingleNode("d:c", $nsMgr) - if (-not $cell) { continue } - $fNode = $cell.SelectSingleNode("d:f", $nsMgr) - if (-not $fNode -or -not $valueFormatIdx.ContainsKey([int]$fNode.InnerText)) { continue } - if ($cell.SelectSingleNode("d:tl", $nsMgr)) { - Report-Error "Row ${rn}: cell contains a value and text at the same time" - } - } - } - foreach ($cols in $root.SelectNodes("d:columns", $nsMgr)) { - foreach ($ci in $cols.SelectNodes("d:columnsItem", $nsMgr)) { - $col = $ci.SelectSingleNode("d:column", $nsMgr) - if (-not $col) { continue } - $fmtNode = $col.SelectSingleNode("d:formatIndex", $nsMgr) - if ($fmtNode -and $valueFormatIdx.ContainsKey([int]$fmtNode.InnerText)) { - $colIdxNode = $ci.SelectSingleNode("d:index", $nsMgr) - $colIdxText = if ($colIdxNode) { $colIdxNode.InnerText } else { '?' } - Report-Warn "Column ${colIdxText}: formatIndex points to a value format (cell-only property)" - } - } - } - $dfi = $root.SelectSingleNode("d:defaultFormatIndex", $nsMgr) - if ($dfi -and $valueFormatIdx.ContainsKey([int]$dfi.InnerText)) { - Report-Warn "defaultFormatIndex points to a value format (cell-only property)" - } Report-OK "Value cells: $($valueFormatIdx.Count) value formats" } diff --git a/.claude/skills/mxl-validate/scripts/mxl-validate.py b/.claude/skills/mxl-validate/scripts/mxl-validate.py index 0217f8a1..392f6f46 100644 --- a/.claude/skills/mxl-validate/scripts/mxl-validate.py +++ b/.claude/skills/mxl-validate/scripts/mxl-validate.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python3 -# mxl-validate v1.3 — Validate 1C spreadsheet document Template.xml +#!/usr/bin/env python3 +# mxl-validate v1.4 — Validate 1C spreadsheet document Template.xml # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates spreadsheet Template.xml: height, palette refs, column/row indices, areas, merges.""" import sys, os, argparse @@ -430,40 +430,61 @@ def main(): if kinds != ['xs:boolean'] and kinds != ['xs:decimal']: r.warn(f'Format {i}: checkbox control on a type other than Boolean or Number') - if value_format_idx: - for ri in root.findall(f'{{{NS_D}}}rowsItem'): - if r.stopped: - break - row = ri.find(f'{{{NS_D}}}row') - if row is None: + for ri in root.findall(f'{{{NS_D}}}rowsItem'): + if r.stopped: + break + row = ri.find(f'{{{NS_D}}}row') + if row is None: + continue + idx_node = ri.find(f'{{{NS_D}}}index') + rn = idx_node.text if idx_node is not None else '?' + row_fmt = row.find(f'{{{NS_D}}}formatIndex') + if row_fmt is not None and row_fmt.text and int(row_fmt.text) in value_format_idx: + r.warn(f'Row {rn}: formatIndex points to a value format (cell-only property)') + for c_group in row.findall(f'{{{NS_D}}}c'): + cell = c_group.find(f'{{{NS_D}}}c') + if cell is None: continue - idx_node = ri.find(f'{{{NS_D}}}index') - rn = idx_node.text if idx_node is not None else '?' - row_fmt = row.find(f'{{{NS_D}}}formatIndex') - if row_fmt is not None and row_fmt.text and int(row_fmt.text) in value_format_idx: - r.warn(f'Row {rn}: formatIndex points to a value format (cell-only property)') - for c_group in row.findall(f'{{{NS_D}}}c'): - cell = c_group.find(f'{{{NS_D}}}c') - if cell is None: - continue - f_node = cell.find(f'{{{NS_D}}}f') - if f_node is None or not f_node.text or int(f_node.text) not in value_format_idx: - continue - if cell.find(f'{{{NS_D}}}tl') is not None: - r.error(f'Row {rn}: cell contains a value and text at the same time') - for cols in root.findall(f'{{{NS_D}}}columns'): - for ci in cols.findall(f'{{{NS_D}}}columnsItem'): - col = ci.find(f'{{{NS_D}}}column') - if col is None: - continue - fmt_node = col.find(f'{{{NS_D}}}formatIndex') - if fmt_node is not None and fmt_node.text and int(fmt_node.text) in value_format_idx: - col_idx_node = ci.find(f'{{{NS_D}}}index') - col_idx_text = col_idx_node.text if col_idx_node is not None else '?' - r.warn(f'Column {col_idx_text}: formatIndex points to a value format (cell-only property)') - dfi = root.find(f'{{{NS_D}}}defaultFormatIndex') - if dfi is not None and dfi.text and int(dfi.text) in value_format_idx: - r.warn('defaultFormatIndex points to a value format (cell-only property)') + f_node = cell.find(f'{{{NS_D}}}f') + if f_node is None or not f_node.text or int(f_node.text) not in value_format_idx: + continue + if cell.find(f'{{{NS_D}}}tl') is not None: + r.error(f'Row {rn}: cell contains a value and text at the same time') + # Значение и настройки элемента управления бывают только у ячейки-поля ввода: на корпусе + # ни одного и ни одного в обычной ячейке. + for ri in root.findall(f'{{{NS_D}}}rowsItem'): + if r.stopped: + break + row = ri.find(f'{{{NS_D}}}row') + if row is None: + continue + idx_node = ri.find(f'{{{NS_D}}}index') + rn = idx_node.text if idx_node is not None else '?' + for c_group in row.findall(f'{{{NS_D}}}c'): + cell = c_group.find(f'{{{NS_D}}}c') + if cell is None: + continue + f_node = cell.find(f'{{{NS_D}}}f') + is_value = f_node is not None and f_node.text and int(f_node.text) in value_format_idx + if is_value: + continue + for tag, what in (('v', 'value'), ('control', 'control settings')): + if cell.find(f'{{{NS_D}}}{tag}') is not None: + r.error(f'Row {rn}: cell carries {what} but its format has no containsValue') + for cols in root.findall(f'{{{NS_D}}}columns'): + for ci in cols.findall(f'{{{NS_D}}}columnsItem'): + col = ci.find(f'{{{NS_D}}}column') + if col is None: + continue + fmt_node = col.find(f'{{{NS_D}}}formatIndex') + if fmt_node is not None and fmt_node.text and int(fmt_node.text) in value_format_idx: + col_idx_node = ci.find(f'{{{NS_D}}}index') + col_idx_text = col_idx_node.text if col_idx_node is not None else '?' + r.warn(f'Column {col_idx_text}: formatIndex points to a value format (cell-only property)') + dfi = root.find(f'{{{NS_D}}}defaultFormatIndex') + if dfi is not None and dfi.text and int(dfi.text) in value_format_idx: + r.warn('defaultFormatIndex points to a value format (cell-only property)') + if value_format_idx: r.ok(f'Value cells: {len(value_format_idx)} value formats') # --- Finalize --- diff --git a/docs/mxl-dsl-spec.md b/docs/mxl-dsl-spec.md index 76d9cf0c..dbf1d73b 100644 --- a/docs/mxl-dsl-spec.md +++ b/docs/mxl-dsl-spec.md @@ -152,7 +152,8 @@ | `{ ... }` | Обычная ячейка **без** `col`; нужна для `style`, `detail`, `template` | Объект-элемент трактуется по его ключам: если среди них есть ключ ячейки (`span`, `rowspan`, -`style`, `param`, `detail`, `text`, `template`, `valueType`, `controlType`, `value`) — объект +`style`, `param`, `detail`, `text`, `template`, `valueType`, `controlType`, `value`, +`control`) — объект описывает свойства ячейки. Иначе он целиком считается её текстом, а его ключи — идентификаторами языков. @@ -186,6 +187,7 @@ | `valueType` | нет | — | Тип значения: ячейка становится полем ввода (см. ниже) | | `controlType` | нет | `input` | Элемент управления поля ввода: `input` или `checkbox`. Только вместе с `valueType` | | `value` | нет | — | Значение в поле ввода. Только вместе с `valueType` | +| `control` | нет | — | Настройки элемента управления в записи платформы (base64). Раундтрип, не для ручного авторинга | ### Содержимое ячейки diff --git a/tests/skills/cases/mxl-compile/snapshots/value-control-settings/Template.xml b/tests/skills/cases/mxl-compile/snapshots/value-control-settings/Template.xml new file mode 100644 index 00000000..0952093c --- /dev/null +++ b/tests/skills/cases/mxl-compile/snapshots/value-control-settings/Template.xml @@ -0,0 +1,71 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 2 + + + 0 + + + + 1 + 77u/MiwxLDM4MWVkNjI0LTkyMTctNGU2My04NWRiLWM0YzNjYjg3ZGFhZSwNCnsN +Cns5LA0KeyJQYXR0ZXJuIiwNCnsiUyJ9DQp9LA0Kew0Kew0KezE2LDEsDQp7Myw0 +LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCns3LDMsMCwxLDEwMH0sMCwNCnsz +LDQsDQp7MH0NCn0sDQp7Myw0LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCnsz +LDMsDQp7LTd9DQp9LA0KezMsMywNCnstMjF9DQp9LA0KezMsMSwNCnstMTh9LDAs +MCwwfSwNCnsxLDB9LDAsMCwxMDAsMCwwfSwzMCwwLDAsMSwwLDAsMSwxLDEsMCwx +LDAsMCwwLDAsMCw0LDAsDQp7IlUifSwNCnsiVSJ9LCIiLDAsMSwwLDAsMCwwLA0K +ezQsMCwNCnswfSwiIiwtMSwtMSwxLDAsIiJ9LA0KezQsMCwNCnswfSwiIiwtMSwt +MSwxLDAsIiJ9LDAsMCwwLA0KezAsMCwwfSwNCnsxLDB9LDAsMCwwLDAsMCwwLDAs +MTY3NzcyMTUsMn0NCn0sDQp7MSwNCns5YTc2NDNkMi0xOWU5LTQ1ZTItODg5My0y +ODBiYzkxOTVhOTcsDQp7NCwNCnsiVSJ9LA0KeyJVIn0sMCwiIiwwLDB9DQp9DQp9 +LA0KezB9LDAsMSwwLA0KezEsMH0sMH0NCn0sMA== + + + + + 1 + + + + + true + 2 + 1 + 1 + + Настройки + + Rows + 0 + 0 + -1 + -1 + + + + true + + xs:decimal + + 10 + 2 + Any + + + 35af3d93-d7c7-4a2e-a8eb-bac87a1a3f26 + + + 10 + + \ No newline at end of file diff --git a/tests/skills/cases/mxl-compile/value-control-settings.json b/tests/skills/cases/mxl-compile/value-control-settings.json new file mode 100644 index 00000000..50ef64fd --- /dev/null +++ b/tests/skills/cases/mxl-compile/value-control-settings.json @@ -0,0 +1,31 @@ +{ + "name": "Ячейка-поле ввода: настройки элемента управления", + "input": { + "columns": 2, + "areas": [ + { + "name": "Настройки", + "rows": [ + { + "cells": [ + { + "col": 1, + "valueType": "Number(10,2)", + "controlType": "checkbox", + "control": "77u/MiwxLDM4MWVkNjI0LTkyMTctNGU2My04NWRiLWM0YzNjYjg3ZGFhZSwNCnsN\nCns5LA0KeyJQYXR0ZXJuIiwNCnsiUyJ9DQp9LA0Kew0Kew0KezE2LDEsDQp7Myw0\nLA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCns3LDMsMCwxLDEwMH0sMCwNCnsz\nLDQsDQp7MH0NCn0sDQp7Myw0LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCnsz\nLDMsDQp7LTd9DQp9LA0KezMsMywNCnstMjF9DQp9LA0KezMsMSwNCnstMTh9LDAs\nMCwwfSwNCnsxLDB9LDAsMCwxMDAsMCwwfSwzMCwwLDAsMSwwLDAsMSwxLDEsMCwx\nLDAsMCwwLDAsMCw0LDAsDQp7IlUifSwNCnsiVSJ9LCIiLDAsMSwwLDAsMCwwLA0K\nezQsMCwNCnswfSwiIiwtMSwtMSwxLDAsIiJ9LA0KezQsMCwNCnswfSwiIiwtMSwt\nMSwxLDAsIiJ9LDAsMCwwLA0KezAsMCwwfSwNCnsxLDB9LDAsMCwwLDAsMCwwLDAs\nMTY3NzcyMTUsMn0NCn0sDQp7MSwNCns5YTc2NDNkMi0xOWU5LTQ1ZTItODg5My0y\nODBiYzkxOTVhOTcsDQp7NCwNCnsiVSJ9LA0KeyJVIn0sMCwiIiwwLDB9DQp9DQp9\nLA0KezB9LDAsMSwwLA0KezEsMH0sMH0NCn0sMA==" + }, + { + "col": 2, + "valueType": "Number(10,2)", + "controlType": "checkbox" + } + ] + } + ] + } + ] + }, + "params": { + "outputPath": "Template.xml" + } +} diff --git a/tests/skills/cases/mxl-decompile/roundtrip-control-settings.json b/tests/skills/cases/mxl-decompile/roundtrip-control-settings.json new file mode 100644 index 00000000..1e24d1c0 --- /dev/null +++ b/tests/skills/cases/mxl-decompile/roundtrip-control-settings.json @@ -0,0 +1,51 @@ +{ + "name": "Roundtrip — настройки элемента управления", + "preRun": [ + { + "script": "mxl-compile/scripts/mxl-compile", + "input": { + "columns": 2, + "areas": [ + { + "name": "Настройки", + "rows": [ + { + "cells": [ + { + "col": 1, + "valueType": "Number(10,2)", + "controlType": "checkbox", + "control": "77u/MiwxLDM4MWVkNjI0LTkyMTctNGU2My04NWRiLWM0YzNjYjg3ZGFhZSwNCnsN\nCns5LA0KeyJQYXR0ZXJuIiwNCnsiUyJ9DQp9LA0Kew0Kew0KezE2LDEsDQp7Myw0\nLA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCns3LDMsMCwxLDEwMH0sMCwNCnsz\nLDQsDQp7MH0NCn0sDQp7Myw0LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCnsz\nLDMsDQp7LTd9DQp9LA0KezMsMywNCnstMjF9DQp9LA0KezMsMSwNCnstMTh9LDAs\nMCwwfSwNCnsxLDB9LDAsMCwxMDAsMCwwfSwzMCwwLDAsMSwwLDAsMSwxLDEsMCwx\nLDAsMCwwLDAsMCw0LDAsDQp7IlUifSwNCnsiVSJ9LCIiLDAsMSwwLDAsMCwwLA0K\nezQsMCwNCnswfSwiIiwtMSwtMSwxLDAsIiJ9LA0KezQsMCwNCnswfSwiIiwtMSwt\nMSwxLDAsIiJ9LDAsMCwwLA0KezAsMCwwfSwNCnsxLDB9LDAsMCwwLDAsMCwwLDAs\nMTY3NzcyMTUsMn0NCn0sDQp7MSwNCns5YTc2NDNkMi0xOWU5LTQ1ZTItODg5My0y\nODBiYzkxOTVhOTcsDQp7NCwNCnsiVSJ9LA0KeyJVIn0sMCwiIiwwLDB9DQp9DQp9\nLA0KezB9LDAsMSwwLA0KezEsMH0sMH0NCn0sMA==" + }, + { + "col": 2, + "valueType": "Number(10,2)", + "controlType": "checkbox" + } + ] + } + ] + } + ] + }, + "args": { + "-JsonPath": "{inputFile}", + "-OutputPath": "Template.xml" + }, + "cwd": "{workDir}" + } + ], + "params": { + "templatePath": "Template.xml" + }, + "args_extra": [ + "-OutputPath", + "{workDir}/back.json" + ], + "expect": { + "files": [ + "back.json" + ], + "stdoutContains": "[OK] Decompiled:" + } +} diff --git a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/Template.xml b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/Template.xml new file mode 100644 index 00000000..0952093c --- /dev/null +++ b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/Template.xml @@ -0,0 +1,71 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 2 + + + 0 + + + + 1 + 77u/MiwxLDM4MWVkNjI0LTkyMTctNGU2My04NWRiLWM0YzNjYjg3ZGFhZSwNCnsN +Cns5LA0KeyJQYXR0ZXJuIiwNCnsiUyJ9DQp9LA0Kew0Kew0KezE2LDEsDQp7Myw0 +LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCns3LDMsMCwxLDEwMH0sMCwNCnsz +LDQsDQp7MH0NCn0sDQp7Myw0LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCnsz +LDMsDQp7LTd9DQp9LA0KezMsMywNCnstMjF9DQp9LA0KezMsMSwNCnstMTh9LDAs +MCwwfSwNCnsxLDB9LDAsMCwxMDAsMCwwfSwzMCwwLDAsMSwwLDAsMSwxLDEsMCwx +LDAsMCwwLDAsMCw0LDAsDQp7IlUifSwNCnsiVSJ9LCIiLDAsMSwwLDAsMCwwLA0K +ezQsMCwNCnswfSwiIiwtMSwtMSwxLDAsIiJ9LA0KezQsMCwNCnswfSwiIiwtMSwt +MSwxLDAsIiJ9LDAsMCwwLA0KezAsMCwwfSwNCnsxLDB9LDAsMCwwLDAsMCwwLDAs +MTY3NzcyMTUsMn0NCn0sDQp7MSwNCns5YTc2NDNkMi0xOWU5LTQ1ZTItODg5My0y +ODBiYzkxOTVhOTcsDQp7NCwNCnsiVSJ9LA0KeyJVIn0sMCwiIiwwLDB9DQp9DQp9 +LA0KezB9LDAsMSwwLA0KezEsMH0sMH0NCn0sMA== + + + + + 1 + + + + + true + 2 + 1 + 1 + + Настройки + + Rows + 0 + 0 + -1 + -1 + + + + true + + xs:decimal + + 10 + 2 + Any + + + 35af3d93-d7c7-4a2e-a8eb-bac87a1a3f26 + + + 10 + + \ No newline at end of file diff --git a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/back.json b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/back.json new file mode 100644 index 00000000..e723058f --- /dev/null +++ b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-control-settings/back.json @@ -0,0 +1,21 @@ +{ + "columns": 2, + "defaultWidth": 10, + "fonts": {}, + "styles": {}, + "areas": [ + { + "name": "Настройки", + "rows": [ + [ + { + "valueType": "Number(10,2)", + "controlType": "checkbox", + "control": "77u/MiwxLDM4MWVkNjI0LTkyMTctNGU2My04NWRiLWM0YzNjYjg3ZGFhZSwNCnsN\nCns5LA0KeyJQYXR0ZXJuIiwNCnsiUyJ9DQp9LA0Kew0Kew0KezE2LDEsDQp7Myw0\nLA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCns3LDMsMCwxLDEwMH0sMCwNCnsz\nLDQsDQp7MH0NCn0sDQp7Myw0LA0KezB9DQp9LA0KezMsNCwNCnswfQ0KfSwNCnsz\nLDMsDQp7LTd9DQp9LA0KezMsMywNCnstMjF9DQp9LA0KezMsMSwNCnstMTh9LDAs\nMCwwfSwNCnsxLDB9LDAsMCwxMDAsMCwwfSwzMCwwLDAsMSwwLDAsMSwxLDEsMCwx\nLDAsMCwwLDAsMCw0LDAsDQp7IlUifSwNCnsiVSJ9LCIiLDAsMSwwLDAsMCwwLA0K\nezQsMCwNCnswfSwiIiwtMSwtMSwxLDAsIiJ9LA0KezQsMCwNCnswfSwiIiwtMSwt\nMSwxLDAsIiJ9LDAsMCwwLA0KezAsMCwwfSwNCnsxLDB9LDAsMCwwLDAsMCwwLDAs\nMTY3NzcyMTUsMn0NCn0sDQp7MSwNCns5YTc2NDNkMi0xOWU5LTQ1ZTItODg5My0y\nODBiYzkxOTVhOTcsDQp7NCwNCnsiVSJ9LA0KeyJVIn0sMCwiIiwwLDB9DQp9DQp9\nLA0KezB9LDAsMSwwLA0KezEsMH0sMH0NCn0sMA==" + }, + { "valueType": "Number(10,2)", "controlType": "checkbox" } + ] + ] + } + ] +} \ No newline at end of file diff --git a/tests/skills/cases/mxl-validate/error-value-tags-without-flag.json b/tests/skills/cases/mxl-validate/error-value-tags-without-flag.json new file mode 100644 index 00000000..15b28fee --- /dev/null +++ b/tests/skills/cases/mxl-validate/error-value-tags-without-flag.json @@ -0,0 +1,7 @@ +{ + "name": "Ошибка: значение и настройки элемента управления у ячейки без признака значения", + "setup": "fixture:value-tags-without-flag", + "params": { "templatePath": "Template.xml" }, + "expectError": true, + "expect": { "stdoutContains": "but its format has no containsValue" } +} diff --git a/tests/skills/cases/mxl-validate/fixtures/value-tags-without-flag/Template.xml b/tests/skills/cases/mxl-validate/fixtures/value-tags-without-flag/Template.xml new file mode 100644 index 00000000..aede7406 --- /dev/null +++ b/tests/skills/cases/mxl-validate/fixtures/value-tags-without-flag/Template.xml @@ -0,0 +1,38 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 2 + + + 0 + + + + 0 + значение без признака + + + + + 1 + MSwx + + + + + true + 1 + 1 + + 72 + +