diff --git a/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs index abb1b3d48..e553591fc 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs @@ -313,18 +313,51 @@ private static (string prefix, string localName) splitName(string nameOrLocalNam [ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")] public void WriteDocumentType(string name, string varArg2, string varArg3 = null, string varArg4 = null) { - CheckIfOpen(); - if (varArg4 != null) - { - _writer.WriteDocType(name, varArg2, varArg3, varArg4); + CheckIfOpen(); + + if (string.IsNullOrWhiteSpace(name)) + throw RuntimeException.InvalidNthArgumentValue(1); + + try + { + if (varArg4 != null) + { + if (string.IsNullOrEmpty(varArg2)) + { + varArg2 = null; + if (string.Empty.Equals(varArg3)) + varArg3 = null; + } + else if (string.IsNullOrEmpty(varArg3)) // (A1,A2,,A4) + throw NoSystemIdException(); + + if (string.Empty.Equals(varArg4)) + varArg4 = null; + + _writer.WriteDocType(name, varArg2, varArg3, varArg4); + } + else if (varArg3 != null) + { + if (string.Empty.Equals(varArg2)) + varArg2 = null; + + if (string.Empty.Equals(varArg3)) + varArg3 = null; + + _writer.WriteDocType(name, null, varArg2, varArg3); + } + else + { + _writer.WriteDocType(name, null, null, varArg2); + } } - else if(varArg3 != null) - { - _writer.WriteDocType(name, null, varArg2, varArg3); + catch (ArgumentException) + { + throw RuntimeException.InvalidNthArgumentValue(1); } - else - { - _writer.WriteDocType(name, null, null, varArg2); + catch (InvalidOperationException) + { + throw WrongOrderException(); } } @@ -521,7 +554,21 @@ public static RuntimeException CopyingNotSupportedException(XmlNodeType nodeType return new RuntimeException ($"Копирование узла типа {nodeType} не поддерживается", $"Copying a node of type {nodeType} is not supported"); - } + } + + public static RuntimeException WrongOrderException() + { + return new RuntimeException + ("Ошибочный порядок записи XML", + "Wrong order of XML record"); + } + + public static RuntimeException NoSystemIdException() + { + return new RuntimeException + ("Отсутствует системный идентификатор", + "System ID missing"); + } } } diff --git a/tests/xmlwrite.os b/tests/xmlwrite.os index 0d2c426f5..b978d332a 100644 --- a/tests/xmlwrite.os +++ b/tests/xmlwrite.os @@ -47,6 +47,12 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЗакрытиеПустого"); ВсеТесты.Добавить("ТестДолжен_ПроверитьТипВозвратаЗакрыть_ИзФайла"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени"); + Возврат ВсеТесты; КонецФункции @@ -780,3 +786,101 @@ юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("Строка")); юТест.ПроверитьРавенство(Результат, ""); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра() Экспорт + Варианты = Новый Массив(); + Варианты.Добавить("А,,,:"); + //Варианты.Добавить("А,B,,:"); + Варианты.Добавить("А,,C,:"); + Варианты.Добавить("А,B,C,:"); + Варианты.Добавить("А,,,D:"); + //Варианты.Добавить("А,B,,D:"); + Варианты.Добавить("А,,C,D:"); + Варианты.Добавить("А,B,C,D:"); + + ЗаписьXML = Новый ЗаписьXML; + Для Каждого Пара Из Варианты Цикл + АргРез = СтрРазделить(Пара,":"); + Арг = СтрРазделить(АргРез[0],","); + + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2],Арг[3]); + Результат = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,",")); + КонецЦикла; + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра() Экспорт + Варианты = Новый Массив(); + Варианты.Добавить("А,,:"); + Варианты.Добавить("А,B,:"); + Варианты.Добавить("А,,C:"); + Варианты.Добавить("А,B,C:"); + + ЗаписьXML = Новый ЗаписьXML; + Для Каждого Пара Из Варианты Цикл + АргРез = СтрРазделить(Пара,":"); + Арг = СтрРазделить(АргРез[0],","); + + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2]); + Результат = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,",")); + КонецЦикла; + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой() Экспорт + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + + БылоИсключение = Ложь; + Попытка + ЗаписьXML.ЗаписатьТипДокумента("A","B",,"D"); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + юТест.ПроверитьНеРавенство(Найти(Ошибка,"Отсутствует системный идентификатор"), 0, "Неверный вид ошибки: "+Ошибка); + БылоИсключение = Истина; + КонецПопытки; + ЗаписьXML.Закрыть(); + + юТест.ПроверитьИстину(БылоИсключение, "ЗаписьТипаДокумента_4ПараметраСОшибкой"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала() Экспорт + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьНачалоЭлемента("a"); + + БылоИсключение = Ложь; + Попытка + ЗаписьXML.ЗаписатьТипДокумента("A","B"); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + юТест.ПроверитьНеРавенство(Найти(Ошибка,"Ошибочный порядок записи XML"), 0, "Неверный вид ошибки: "+Ошибка); + БылоИсключение = Истина; + КонецПопытки; + ЗаписьXML.Закрыть(); + + юТест.ПроверитьИстину(БылоИсключение, "ЗаписьТипаДокумента_ОшибкаПослеНачала"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени() Экспорт + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + + БылоИсключение = Ложь; + Попытка + ЗаписьXML.ЗаписатьТипДокумента("%$#A","B"); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + юТест.ПроверитьНеРавенство(Найти(Ошибка,"Неверное значение аргумента номер 1"), 0, "Неверный вид ошибки: "+Ошибка); + БылоИсключение = Истина; + КонецПопытки; + ЗаписьXML.Закрыть(); + + юТест.ПроверитьИстину(БылоИсключение, "ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени"); +КонецПроцедуры