Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 58 additions & 11 deletions src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}

Expand Down Expand Up @@ -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");
}

}
}
104 changes: 104 additions & 0 deletions tests/xmlwrite.os
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗакрытиеПустого");
ВсеТесты.Добавить("ТестДолжен_ПроверитьТипВозвратаЗакрыть_ИзФайла");

ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени");

Возврат ВсеТесты;

КонецФункции
Expand Down Expand Up @@ -780,3 +786,101 @@
юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("Строка"));
юТест.ПроверитьРавенство(Результат, "");
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра() Экспорт
Варианты = Новый Массив();
Варианты.Добавить("А,,,:<!DOCTYPE А>");
//Варианты.Добавить("А,B,,:");
Варианты.Добавить("А,,C,:<!DOCTYPE А SYSTEM ""C"">");
Варианты.Добавить("А,B,C,:<!DOCTYPE А PUBLIC ""B"" ""C"">");
Варианты.Добавить("А,,,D:<!DOCTYPE А[D]>");
//Варианты.Добавить("А,B,,D:");
Варианты.Добавить("А,,C,D:<!DOCTYPE А SYSTEM ""C""[D]>");
Варианты.Добавить("А,B,C,D:<!DOCTYPE А PUBLIC ""B"" ""C""[D]>");

ЗаписьXML = Новый ЗаписьXML;
Для Каждого Пара Из Варианты Цикл
АргРез = СтрРазделить(Пара,":");
Арг = СтрРазделить(АргРез[0],",");

ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2],Арг[3]);
Результат = ЗаписьXML.Закрыть();
юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,","));
КонецЦикла;

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра() Экспорт
Варианты = Новый Массив();
Варианты.Добавить("А,,:<!DOCTYPE А>");
Варианты.Добавить("А,B,:<!DOCTYPE А SYSTEM ""B"">");
Варианты.Добавить("А,,C:<!DOCTYPE А[C]>");
Варианты.Добавить("А,B,C:<!DOCTYPE А SYSTEM ""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.Закрыть();

юТест.ПроверитьИстину(БылоИсключение, "ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени");
КонецПроцедуры