Skip to content

Commit 4c99323

Browse files
committed
fix EvilBeaver#1707: совместимость и обработка ошибок в ЗаписатьТипДокумента
1 parent 0cd65f0 commit 4c99323

2 files changed

Lines changed: 142 additions & 10 deletions

File tree

src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the
1313
using System.Xml;
1414
using OneScript.Contexts;
1515
using OneScript.Exceptions;
16+
using OneScript.Localization;
1617
using OneScript.Types;
1718
using OneScript.Values;
1819
using ScriptEngine.Machine;
@@ -292,17 +293,49 @@ private static (string prefix, string localName) splitName(string nameOrLocalNam
292293
[ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")]
293294
public void WriteDocumentType(string name, string varArg2, string varArg3 = null, string varArg4 = null)
294295
{
295-
if(varArg4 != null)
296-
{
297-
_writer.WriteDocType(name, varArg2, varArg3, varArg4);
296+
if (string.IsNullOrWhiteSpace(name))
297+
throw RuntimeException.InvalidNthArgumentValue(1);
298+
299+
try
300+
{
301+
if (varArg4 != null)
302+
{
303+
if (string.IsNullOrEmpty(varArg2))
304+
{
305+
varArg2 = null;
306+
if (string.Empty.Equals(varArg3))
307+
varArg3 = null;
308+
}
309+
else if (string.IsNullOrEmpty(varArg3)) // (A1,A2,,A4)
310+
throw NoSystemIdException();
311+
312+
if (string.Empty.Equals(varArg4))
313+
varArg4 = null;
314+
315+
_writer.WriteDocType(name, varArg2, varArg3, varArg4);
316+
}
317+
else if (varArg3 != null)
318+
{
319+
if (string.Empty.Equals(varArg2))
320+
varArg2 = null;
321+
322+
if (string.Empty.Equals(varArg3))
323+
varArg3 = null;
324+
325+
_writer.WriteDocType(name, null, varArg2, varArg3);
326+
}
327+
else
328+
{
329+
_writer.WriteDocType(name, null, null, varArg2);
330+
}
298331
}
299-
else if(varArg3 != null)
300-
{
301-
_writer.WriteDocType(name, null, varArg2, varArg3);
332+
catch (ArgumentException)
333+
{
334+
throw RuntimeException.InvalidNthArgumentValue(1);
302335
}
303-
else
304-
{
305-
_writer.WriteDocType(name, null, null, varArg2);
336+
catch (InvalidOperationException)
337+
{
338+
throw WrongOrderException();
306339
}
307340
}
308341

@@ -490,5 +523,19 @@ public static XmlWriterImpl Create()
490523
}
491524

492525
public XmlWriter GetNativeWriter() => _writer;
493-
}
526+
527+
public static RuntimeException WrongOrderException()
528+
{
529+
return new RuntimeException
530+
("Ошибочный порядок записи XML",
531+
"Wrong order of XML record");
532+
}
533+
534+
public static RuntimeException NoSystemIdException()
535+
{
536+
return new RuntimeException
537+
("Отсутствует системный идентификатор",
538+
"System ID missing");
539+
}
540+
}
494541
}

tests/xmlwrite.os

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444

4545
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента");
4646

47+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра");
48+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра");
49+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой");
50+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала");
51+
4752
Возврат ВсеТесты;
4853

4954
КонецФункции
@@ -759,3 +764,83 @@
759764
ЧтениеXML.Прочитать();
760765
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла, ТипУзла, Сообщение);
761766
КонецПроцедуры
767+
768+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра() Экспорт
769+
Варианты = Новый Массив();
770+
Варианты.Добавить("А,,,:<!DOCTYPE А>");
771+
//Варианты.Добавить("А,B,,:");
772+
Варианты.Добавить("А,,C,:<!DOCTYPE А SYSTEM ""C"">");
773+
Варианты.Добавить("А,B,C,:<!DOCTYPE А PUBLIC ""B"" ""C"">");
774+
Варианты.Добавить("А,,,D:<!DOCTYPE А[D]>");
775+
//Варианты.Добавить("А,B,,D:");
776+
Варианты.Добавить("А,,C,D:<!DOCTYPE А SYSTEM ""C""[D]>");
777+
Варианты.Добавить("А,B,C,D:<!DOCTYPE А PUBLIC ""B"" ""C""[D]>");
778+
779+
ЗаписьXML = Новый ЗаписьXML;
780+
Для Каждого Пара Из Варианты Цикл
781+
АргРез = СтрРазделить(Пара,":");
782+
Арг = СтрРазделить(АргРез[0],",");
783+
784+
ЗаписьXML.УстановитьСтроку();
785+
ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2],Арг[3]);
786+
Результат = ЗаписьXML.Закрыть();
787+
юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,","));
788+
КонецЦикла;
789+
790+
КонецПроцедуры
791+
792+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра() Экспорт
793+
Варианты = Новый Массив();
794+
Варианты.Добавить("А,,:<!DOCTYPE А>");
795+
Варианты.Добавить("А,B,:<!DOCTYPE А SYSTEM ""B"">");
796+
Варианты.Добавить("А,,C:<!DOCTYPE А[C]>");
797+
Варианты.Добавить("А,B,C:<!DOCTYPE А SYSTEM ""B""[C]>");
798+
799+
ЗаписьXML = Новый ЗаписьXML;
800+
Для Каждого Пара Из Варианты Цикл
801+
АргРез = СтрРазделить(Пара,":");
802+
Арг = СтрРазделить(АргРез[0],",");
803+
804+
ЗаписьXML.УстановитьСтроку();
805+
ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2]);
806+
Результат = ЗаписьXML.Закрыть();
807+
юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,","));
808+
КонецЦикла;
809+
810+
КонецПроцедуры
811+
812+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой() Экспорт
813+
ЗаписьXML = Новый ЗаписьXML;
814+
ЗаписьXML.УстановитьСтроку();
815+
816+
БылоИсключение = Ложь;
817+
Попытка
818+
ЗаписьXML.ЗаписатьТипДокумента("A","B",,"D");
819+
Исключение
820+
Ошибка = ИнформацияОбОшибке().Описание;
821+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Отсутствует системный идентификатор"), 0, "Неверный вид ошибки: "+Ошибка);
822+
БылоИсключение = Истина;
823+
КонецПопытки;
824+
ЗаписьXML.Закрыть();
825+
826+
юТест.ПроверитьИстину(БылоИсключение, "ЗаписьТипаДокумента_4ПараметраСОшибкой");
827+
КонецПроцедуры
828+
829+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала() Экспорт
830+
831+
ЗаписьXML = Новый ЗаписьXML;
832+
ЗаписьXML.УстановитьСтроку();
833+
ЗаписьXML.ЗаписатьНачалоЭлемента("a");
834+
835+
БылоИсключение = Ложь;
836+
Попытка
837+
ЗаписьXML.ЗаписатьТипДокумента("A","B");
838+
Исключение
839+
Ошибка = ИнформацияОбОшибке().Описание;
840+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Ошибочный порядок записи XML"), 0, "Неверный вид ошибки: "+Ошибка);
841+
БылоИсключение = Истина;
842+
КонецПопытки;
843+
ЗаписьXML.Закрыть();
844+
845+
юТест.ПроверитьИстину(БылоИсключение, "ЗаписьТипаДокумента_ОшибкаПослеНачала");
846+
КонецПроцедуры

0 commit comments

Comments
 (0)