Skip to content

Commit a4bfb48

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

2 files changed

Lines changed: 162 additions & 11 deletions

File tree

src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -313,18 +313,51 @@ private static (string prefix, string localName) splitName(string nameOrLocalNam
313313
[ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")]
314314
public void WriteDocumentType(string name, string varArg2, string varArg3 = null, string varArg4 = null)
315315
{
316-
CheckIfOpen();
317-
if (varArg4 != null)
318-
{
319-
_writer.WriteDocType(name, varArg2, varArg3, varArg4);
316+
CheckIfOpen();
317+
318+
if (string.IsNullOrWhiteSpace(name))
319+
throw RuntimeException.InvalidNthArgumentValue(1);
320+
321+
try
322+
{
323+
if (varArg4 != null)
324+
{
325+
if (string.IsNullOrEmpty(varArg2))
326+
{
327+
varArg2 = null;
328+
if (string.Empty.Equals(varArg3))
329+
varArg3 = null;
330+
}
331+
else if (string.IsNullOrEmpty(varArg3)) // (A1,A2,,A4)
332+
throw NoSystemIdException();
333+
334+
if (string.Empty.Equals(varArg4))
335+
varArg4 = null;
336+
337+
_writer.WriteDocType(name, varArg2, varArg3, varArg4);
338+
}
339+
else if (varArg3 != null)
340+
{
341+
if (string.Empty.Equals(varArg2))
342+
varArg2 = null;
343+
344+
if (string.Empty.Equals(varArg3))
345+
varArg3 = null;
346+
347+
_writer.WriteDocType(name, null, varArg2, varArg3);
348+
}
349+
else
350+
{
351+
_writer.WriteDocType(name, null, null, varArg2);
352+
}
320353
}
321-
else if(varArg3 != null)
322-
{
323-
_writer.WriteDocType(name, null, varArg2, varArg3);
354+
catch (ArgumentException)
355+
{
356+
throw RuntimeException.InvalidNthArgumentValue(1);
324357
}
325-
else
326-
{
327-
_writer.WriteDocType(name, null, null, varArg2);
358+
catch (InvalidOperationException)
359+
{
360+
throw WrongOrderException();
328361
}
329362
}
330363

@@ -521,7 +554,21 @@ public static RuntimeException CopyingNotSupportedException(XmlNodeType nodeType
521554
return new RuntimeException
522555
($"Копирование узла типа {nodeType} не поддерживается",
523556
$"Copying a node of type {nodeType} is not supported");
524-
}
557+
}
558+
559+
public static RuntimeException WrongOrderException()
560+
{
561+
return new RuntimeException
562+
("Ошибочный порядок записи XML",
563+
"Wrong order of XML record");
564+
}
565+
566+
public static RuntimeException NoSystemIdException()
567+
{
568+
return new RuntimeException
569+
("Отсутствует системный идентификатор",
570+
"System ID missing");
571+
}
525572

526573
}
527574
}

tests/xmlwrite.os

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@
4747
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗакрытиеПустого");
4848
ВсеТесты.Добавить("ТестДолжен_ПроверитьТипВозвратаЗакрыть_ИзФайла");
4949

50+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра");
51+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра");
52+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой");
53+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала");
54+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени");
55+
5056
Возврат ВсеТесты;
5157

5258
КонецФункции
@@ -780,3 +786,101 @@
780786
юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("Строка"));
781787
юТест.ПроверитьРавенство(Результат, "");
782788
КонецПроцедуры
789+
790+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4Параметра() Экспорт
791+
Варианты = Новый Массив();
792+
Варианты.Добавить("А,,,:<!DOCTYPE А>");
793+
//Варианты.Добавить("А,B,,:");
794+
Варианты.Добавить("А,,C,:<!DOCTYPE А SYSTEM ""C"">");
795+
Варианты.Добавить("А,B,C,:<!DOCTYPE А PUBLIC ""B"" ""C"">");
796+
Варианты.Добавить("А,,,D:<!DOCTYPE А[D]>");
797+
//Варианты.Добавить("А,B,,D:");
798+
Варианты.Добавить("А,,C,D:<!DOCTYPE А SYSTEM ""C""[D]>");
799+
Варианты.Добавить("А,B,C,D:<!DOCTYPE А PUBLIC ""B"" ""C""[D]>");
800+
801+
ЗаписьXML = Новый ЗаписьXML;
802+
Для Каждого Пара Из Варианты Цикл
803+
АргРез = СтрРазделить(Пара,":");
804+
Арг = СтрРазделить(АргРез[0],",");
805+
806+
ЗаписьXML.УстановитьСтроку();
807+
ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2],Арг[3]);
808+
Результат = ЗаписьXML.Закрыть();
809+
юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,","));
810+
КонецЦикла;
811+
812+
КонецПроцедуры
813+
814+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_3Параметра() Экспорт
815+
Варианты = Новый Массив();
816+
Варианты.Добавить("А,,:<!DOCTYPE А>");
817+
Варианты.Добавить("А,B,:<!DOCTYPE А SYSTEM ""B"">");
818+
Варианты.Добавить("А,,C:<!DOCTYPE А[C]>");
819+
Варианты.Добавить("А,B,C:<!DOCTYPE А SYSTEM ""B""[C]>");
820+
821+
ЗаписьXML = Новый ЗаписьXML;
822+
Для Каждого Пара Из Варианты Цикл
823+
АргРез = СтрРазделить(Пара,":");
824+
Арг = СтрРазделить(АргРез[0],",");
825+
826+
ЗаписьXML.УстановитьСтроку();
827+
ЗаписьXML.ЗаписатьТипДокумента(Арг[0],Арг[1],Арг[2]);
828+
Результат = ЗаписьXML.Закрыть();
829+
юТест.ПроверитьРавенство(АргРез[1], Результат, "Ошибка для парамеров "+СтрСоединить(Арг,","));
830+
КонецЦикла;
831+
832+
КонецПроцедуры
833+
834+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_4ПараметраСОшибкой() Экспорт
835+
ЗаписьXML = Новый ЗаписьXML;
836+
ЗаписьXML.УстановитьСтроку();
837+
838+
БылоИсключение = Ложь;
839+
Попытка
840+
ЗаписьXML.ЗаписатьТипДокумента("A","B",,"D");
841+
Исключение
842+
Ошибка = ИнформацияОбОшибке().Описание;
843+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Отсутствует системный идентификатор"), 0, "Неверный вид ошибки: "+Ошибка);
844+
БылоИсключение = Истина;
845+
КонецПопытки;
846+
ЗаписьXML.Закрыть();
847+
848+
юТест.ПроверитьИстину(БылоИсключение, "ЗаписьТипаДокумента_4ПараметраСОшибкой");
849+
КонецПроцедуры
850+
851+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаПослеНачала() Экспорт
852+
853+
ЗаписьXML = Новый ЗаписьXML;
854+
ЗаписьXML.УстановитьСтроку();
855+
ЗаписьXML.ЗаписатьНачалоЭлемента("a");
856+
857+
БылоИсключение = Ложь;
858+
Попытка
859+
ЗаписьXML.ЗаписатьТипДокумента("A","B");
860+
Исключение
861+
Ошибка = ИнформацияОбОшибке().Описание;
862+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Ошибочный порядок записи XML"), 0, "Неверный вид ошибки: "+Ошибка);
863+
БылоИсключение = Истина;
864+
КонецПопытки;
865+
ЗаписьXML.Закрыть();
866+
867+
юТест.ПроверитьИстину(БылоИсключение, "ЗаписьТипаДокумента_ОшибкаПослеНачала");
868+
КонецПроцедуры
869+
870+
Процедура ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени() Экспорт
871+
872+
ЗаписьXML = Новый ЗаписьXML;
873+
ЗаписьXML.УстановитьСтроку();
874+
875+
БылоИсключение = Ложь;
876+
Попытка
877+
ЗаписьXML.ЗаписатьТипДокумента("%$#A","B");
878+
Исключение
879+
Ошибка = ИнформацияОбОшибке().Описание;
880+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Неверное значение аргумента номер 1"), 0, "Неверный вид ошибки: "+Ошибка);
881+
БылоИсключение = Истина;
882+
КонецПопытки;
883+
ЗаписьXML.Закрыть();
884+
885+
юТест.ПроверитьИстину(БылоИсключение, "ТестДолжен_ПроверитьЗаписьТипаДокумента_ОшибкаИмени");
886+
КонецПроцедуры

0 commit comments

Comments
 (0)