test(8 навыков): байтовые проверки канона там, где их не было (#57)

Из ~46 навыков-эмиттеров XML восемь не имели ни одной проверки `preserves`:
form-edit, form-remove, meta-remove, skd-edit, template-remove, xdto-edit,
support-edit, cfe-patch-method. Шесть из них правились в предыдущем коммите,
и канон у них держался на том, что правка была механической, а не на проверке.

Ожидания писались ПО КАНОНУ, а не по текущему поведению — и это сразу вскрыло
три дефекта:

1. form-remove очищал слот формы через InnerText="" / text="" — получалась
   пустая пара <DefaultObjectForm></DefaultObjectForm>. Платформа пустых пар
   не пишет (0 на 476 942 XML). Теперь IsEmpty / text=None.

2. Опустевший <ChildObjects> оставался парой, разнесённой по строкам, —
   в PS-порту form-remove и template-remove. Корпус: 1394 самозакрывающихся
   <ChildObjects/> на acc+erp, пустых пар 0 в обеих формах.

3. template-add писал пустой макет парой <SpreadsheetDocument></...>.
   Во всей выгрузке acc_8.3.27 (65 040 XML) многострочных пустых пар нет
   ни для одного тега.

Заодно усилена сама проверка noEmptyPairs: она ловила только СМЕЖНЫЕ теги,
поэтому дефект №2 проходил мимо неё. Добавлен вариант с переводом строки
внутри; дискриминатором служит сам перевод строки — значащий пробельный
текст-узел (<xr:FillValue xsi:type="xs:string">   </xr:FillValue>) его не
содержит и под проверку не попадает.

support-edit покрыт частично (BOM у ParentConfigurations.bin — проверено, что
платформа пишет его с BOM во всех трёх выгрузках), cfe-patch-method — BOM+EOL
у .bsl: хвостовой перевод строки у модулей неканоничен (1235 с ним, 766 без),
поэтому не утверждается.

Регресс: 647/647 ps1, 644/647 py (3 skipped). Эталоны переснятые: три места,
каждое — ровно ожидаемая пара строк.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-06 13:05:27 +03:00
co-authored by Claude Opus 5
parent a3f2a18dbf
commit a7406d0982
20 changed files with 141 additions and 31 deletions
@@ -27,5 +27,12 @@
"methodName": "ПриЗаписи",
"interceptorType": "Before"
},
"expect": { "stdoutContains": "&Перед(\"ПриЗаписи\")" }
"expect": {
"stdoutContains": "&Перед(\"ПриЗаписи\")",
"preserves": {
"file": "Ext/Catalogs/Товары/Ext/ObjectModule.bsl",
"bom": true,
"eol": "crlf"
}
}
}
@@ -1,3 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<SpreadsheetDocument xmlns="http://v8.1c.ru/spreadsheet/document" xmlns:ss="http://v8.1c.ru/spreadsheet/document" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema">
</SpreadsheetDocument>
<SpreadsheetDocument xmlns="http://v8.1c.ru/spreadsheet/document" xmlns:ss="http://v8.1c.ru/spreadsheet/document" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
@@ -25,5 +25,17 @@
{ "name": "СуммаИтого", "type": "decimal(15,2)" },
{ "name": "ДатаНачала", "type": "date" }
]
},
"expect": {
"preserves": {
"file": "DataProcessors/Реквизиты/Forms/Форма/Ext/Form.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
+11 -1
View File
@@ -14,6 +14,16 @@
"objectName": "Catalogs/Товары",
"formName": "ФормаЭлемента",
"expect": {
"stdoutContains": "Форма ФормаЭлемента удалена"
"stdoutContains": "Форма ФормаЭлемента удалена",
"preserves": {
"file": "Catalogs/Товары.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
@@ -60,7 +60,7 @@
<SearchStringModeOnInputByString>Begin</SearchStringModeOnInputByString>
<FullTextSearchOnInputByString>DontUse</FullTextSearchOnInputByString>
<ChoiceDataGetModeOnInputByString>Directly</ChoiceDataGetModeOnInputByString>
<DefaultObjectForm></DefaultObjectForm>
<DefaultObjectForm/>
<DefaultFolderForm/>
<DefaultListForm/>
<DefaultChoiceForm/>
@@ -86,7 +86,6 @@
<UpdateDataHistoryImmediatelyAfterWrite>false</UpdateDataHistoryImmediatelyAfterWrite>
<ExecuteAfterWriteDataHistoryVersionProcessing>false</ExecuteAfterWriteDataHistoryVersionProcessing>
</Properties>
<ChildObjects>
</ChildObjects>
<ChildObjects/>
</Catalog>
</MetaDataObject>
+13 -1
View File
@@ -8,5 +8,17 @@
}
],
"params": { "object": "Catalog.Удалить" },
"args_extra": ["-Force"]
"args_extra": ["-Force"],
"expect": {
"preserves": {
"file": "Configuration.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
@@ -17,5 +17,17 @@
"templatePath": "Template.xml",
"operation": "add-field",
"value": "Цена: decimal(15,2)"
},
"expect": {
"preserves": {
"file": "Template.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
@@ -9,6 +9,10 @@
"editable"
],
"expect": {
"stdoutContains": "редактируется с сохранением поддержки"
"stdoutContains": "редактируется с сохранением поддержки",
"preserves": {
"file": "Ext/ParentConfigurations.bin",
"bom": true
}
}
}
@@ -1,3 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<SpreadsheetDocument xmlns="http://v8.1c.ru/spreadsheet/document" xmlns:ss="http://v8.1c.ru/spreadsheet/document" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema">
</SpreadsheetDocument>
<SpreadsheetDocument xmlns="http://v8.1c.ru/spreadsheet/document" xmlns:ss="http://v8.1c.ru/spreadsheet/document" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
+13 -1
View File
@@ -10,5 +10,17 @@
"args": { "-ObjectName": "МояОбработка", "-TemplateName": "Макет", "-TemplateType": "SpreadsheetDocument", "-SrcDir": "{workDir}" }
}
],
"params": { "objectName": "МояОбработка", "templateName": "Макет" }
"params": { "objectName": "МояОбработка", "templateName": "Макет" },
"expect": {
"preserves": {
"file": "МояОбработка.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
@@ -23,7 +23,6 @@
<DefaultForm/>
<AuxiliaryForm/>
</Properties>
<ChildObjects>
</ChildObjects>
<ChildObjects/>
</ExternalDataProcessor>
</MetaDataObject>
@@ -29,7 +29,6 @@
<VariantsStorage/>
<SettingsStorage/>
</Properties>
<ChildObjects>
</ChildObjects>
<ChildObjects/>
</ExternalReport>
</MetaDataObject>
+11 -1
View File
@@ -25,6 +25,16 @@
"expect": {
"files": [
"XDTOPackages/types.xml"
]
],
"preserves": {
"file": "XDTOPackages/types.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}