From c7ea8862e95ea0e1e2bca8416f808373cd470b8d Mon Sep 17 00:00:00 2001 From: alkoleft Date: Sun, 3 Sep 2023 04:40:15 +0300 Subject: [PATCH] #133 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Загрузка из markdown --- .../src/CommonModules/ЮТОбщий/Module.bsl | 16 ++ .../Module.bsl | 153 +++++++++++++++--- .../ОМ_ЮТТестовыеДанные/Module.bsl | 115 +++++++------ .../ЮТ_ТестовыеДанныеMarkdown/Template.txt | 5 + .../ЮТ_ТестовыеДанныеMarkdown.mdo | 9 ++ tests/src/Configuration/Configuration.mdo | 1 + 6 files changed, 224 insertions(+), 75 deletions(-) create mode 100644 tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/Template.txt create mode 100644 tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/ЮТ_ТестовыеДанныеMarkdown.mdo diff --git a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl index 0b565a56..c1675916 100644 --- a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl @@ -858,6 +858,22 @@ КонецПроцедуры +// Возвращяет макет +// +// Параметры: +// ИмяМакета - Строка - Возможные значения +// * Общий макет, например, ОбщийМакет.ЮТМетаданные +// * Макет объекта метаданных, например, Справочник.Товары.ПечатнаяФорма +// * Область макета, например, Справочник.Товары.ПечатнаяФорма.Шапка, ОбщийМакет.ЮТМетаданные.Заголовок +// +// Возвращаемое значение: +// ТабличныйДокумент, ТекстовыйДокумент, ДвоичныеДанные - Макет или его область +Функция Макет(ИмяМакета) Экспорт + + Возврат ЮТОбщийВызовСервера.Макет(ИмяМакета); + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные_ТаблицыЗначений/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные_ТаблицыЗначений/Module.bsl index 76c6ed76..38e143b7 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные_ТаблицыЗначений/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные_ТаблицыЗначений/Module.bsl @@ -25,9 +25,7 @@ Если ТипДанныхМакета = Тип("ТабличныйДокумент") Тогда Результат = ЗагрузитьДанныеИзТабличногоДокумента(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения); - ИначеЕсли ТипДанныхМакета = Тип("ТекстовыйДокумент") Тогда - Результат = ЗагрузитьДанныеИзТекстовогоДокумента(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения); - ИначеЕсли ТипДанныхМакета = Тип("Строка") Тогда + ИначеЕсли ТипДанныхМакета = Тип("ТекстовыйДокумент") ИЛИ ТипДанныхМакета = Тип("Строка") Тогда Результат = ЗагрузитьДанныеИзСтроки(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения); Иначе ВызватьИсключение "Макет должен быть либо табличным, либо текстовым документом"; @@ -41,9 +39,15 @@ #Область СлужебныеПроцедурыИФункции -Функция ЗагрузитьДанныеИзТекстовогоДокумента(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения) +Функция ЗагрузитьДанныеИзТабличногоДокумента(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения) - Колонки = ОписаниеКолонок(ДанныеМакета, ОписанияТипов); + КолонкиМакета = Новый Массив(); + Для Инд = 1 По ДанныеМакета.ШиринаТаблицы Цикл + ИмяКолонки = ДанныеМакета.Область(1, Инд).Текст; + КолонкиМакета.Добавить(ИмяКолонки); + КонецЦикла; + + Колонки = ОписаниеКолонок(КолонкиМакета, ОписанияТипов); ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки); ПараметрыСоздания = ПараметрыЗаполнения.СозданиеОбъектовМетаданных; @@ -77,33 +81,69 @@ КонецФункции -Функция ЗагрузитьДанныеИзТабличногоДокумента(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения) +// Загрузить данные из текстового документа. +// +// Параметры: +// ДанныеМакета - ТекстовыйДокумент +// ОписанияТипов Описания типов +// ЗаменяемыеЗначения Заменяемые значения +// КэшЗначений Кэш значений +// ПараметрыЗаполнения Параметры заполнения +// +// Возвращаемое значение: +// ТаблицаЗначений - Загрузить данные из текстового документа +Функция ЗагрузитьДанныеИзСтроки(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения) Экспорт - Колонки = ОписаниеКолонок(ДанныеМакета, ОписанияТипов); + Разделитель = "|"; + Чтение = ПострочноеЧтение(ДанныеМакета); + + Пока СледующаяСтрока(Чтение) Цикл + + Строка = СокрЛП(Чтение.Строка); + + Если НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда + Продолжить; + КонецЕсли; + + КолонкиМакета = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина); + + СледующаяСтрока(Чтение); + Прервать; + + КонецЦикла; + + Колонки = ОписаниеКолонок(КолонкиМакета, ОписанияТипов); ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки); ПараметрыСоздания = ПараметрыЗаполнения.СозданиеОбъектовМетаданных; - + ТаблицаЗначений = Новый ТаблицаЗначений(); Для Каждого ОписаниеКолонки Из Колонки Цикл ТаблицаЗначений.Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.ОписаниеТипа); КонецЦикла; - Выборка = ВыборкаИзТабличногоДокумента(ДанныеМакета); - - Пока Выборка.Следующий() Цикл + Пока СледующаяСтрока(Чтение) Цикл - Строка = ТаблицаЗначений.Добавить(); + Строка = СокрЛП(Чтение.Строка); + + Если ПустаяСтрока(Строка) Тогда + Продолжить; + ИначеЕсли НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда + Прервать; + КонецЕсли; + + СтрокаДанных = ТаблицаЗначений.Добавить(); + Блоки = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина); Для Каждого ОписаниеКолонки Из Колонки Цикл - ЗначениеПредставления = Выборка[ОписаниеКолонки.Индекс]; + ЗначениеПредставления = Блоки[ОписаниеКолонки.Индекс]; Если ПустаяСтрока(ЗначениеПредставления) Тогда Продолжить; КонецЕсли; - Значение = ЗначениеЯчейки(Выборка, ЗначениеПредставления, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания); - Строка[ОписаниеКолонки.Имя] = Значение; + Значение = ЗначениеЯчейки(Блоки, ЗначениеПредставления, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания); + СтрокаДанных[ОписаниеКолонки.Имя] = Значение; КонецЦикла; @@ -113,6 +153,67 @@ КонецФункции +Функция ПострочноеЧтение(Текст) + + ПараметрыЧтения = Новый Структура; + + ПараметрыЧтения.Вставить("ИзТекстовогоДокумента", Ложь); + ПараметрыЧтения.Вставить("ИзЧтенияТекста", Ложь); + ПараметрыЧтения.Вставить("ДостиглиКонца", Ложь); + ПараметрыЧтения.Вставить("Строка", Неопределено); + + Если ТипЗнч(Текст) = Тип("ТекстовыйДокумент") Тогда + ПараметрыЧтения.ИзТекстовогоДокумента = Истина; + ПараметрыЧтения.Вставить("ТекстовыйДокумент", Текст); + ПараметрыЧтения.Вставить("КоличествоСтрок", Текст.КоличествоСтрок()); + ПараметрыЧтения.Вставить("ИндексСтроки", 0); + ИначеЕсли ТипЗнч(Текст) = Тип("Строка") Тогда + ПараметрыЧтения.ИзЧтенияТекста = Истина; + Кодировка = КодировкаТекста.UTF8; + Поток = ПолучитьДвоичныеДанныеИзСтроки(Текст, Кодировка).ОткрытьПотокДляЧтения(); + Чтение = Новый ЧтениеТекста(Поток, Кодировка); + ПараметрыЧтения.Вставить("Чтение", Чтение); + ПараметрыЧтения.Вставить("Поток", Поток); + Иначе + ВызватьИсключение "Неподдерживаемый параметр"; + КонецЕсли; + + Возврат ПараметрыЧтения; + +КонецФункции + +Функция СледующаяСтрока(ПараметрыЧтения) + + Если ПараметрыЧтения.ДостиглиКонца Тогда + ВызватьИсключение "Построчное чтение уже завершено. Обнаружена попытка чтения завершенного потока"; + КонецЕсли; + + Если ПараметрыЧтения.ИзТекстовогоДокумента Тогда + + ЮТОбщий.Инкремент(ПараметрыЧтения.ИндексСтроки); + Если ПараметрыЧтения.ИндексСтроки > ПараметрыЧтения.КоличествоСтрок Тогда + ПараметрыЧтения.ДостиглиКонца = Истина; + Возврат Ложь; + КонецЕсли; + ПараметрыЧтения.Строка = ПараметрыЧтения.ТекстовыйДокумент.ПолучитьСтроку(ПараметрыЧтения.ИндексСтроки); + + ИначеЕсли ПараметрыЧтения.ИзЧтенияТекста Тогда + + ПараметрыЧтения.Строка = ПараметрыЧтения.Чтение.ПрочитатьСтроку(); + + Если ПараметрыЧтения.Строка = Неопределено Тогда + ПараметрыЧтения.Чтение.Закрыть(); + ПараметрыЧтения.Поток.Закрыть(); + ПараметрыЧтения.ДостиглиКонца = Истина; + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент) ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы; @@ -134,30 +235,30 @@ ТипПараметра = ТипЗнч(Макет); ДанныеМакета = Неопределено; - Если ТипПараметра = Тип("ТабличныйДокумент") Тогда - ДанныеМакета = Макет; - ИначеЕсли ТипПараметра = Тип("Строка") И СтрНачинаетсяС(Макет, "|") Тогда + Если ТипПараметра = Тип("ТабличныйДокумент") + ИЛИ ТипПараметра = Тип("ТекстовыйДокумент") + ИЛИ ТипПараметра = Тип("Строка") И СтрНачинаетсяС(Макет, "|") Тогда ДанныеМакета = Макет; ИначеЕсли ТипПараметра = Тип("Строка") Тогда ДанныеМакета = ЮТОбщийВызовСервера.Макет(Макет); Иначе - ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.ТабличныйДокумент", Макет); + ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.ДанныеМакета", Макет); КонецЕсли; Возврат ДанныеМакета; КонецФункции -Функция ОписаниеКолонок(ТабличныйДокумент, ОписанияТипов) +Функция ОписаниеКолонок(КолонкиМакета, ОписанияТипов) Колонки = Новый Массив(); ВсеКолонки = Новый Массив(); ОсновныеКолонки = Новый Структура(); - Для Инд = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл + Для Инд = 0 По КолонкиМакета.ВГраница() Цикл - ИмяКолонки = ТабличныйДокумент.Область(1, Инд).Текст; + ИмяКолонки = КолонкиМакета[Инд]; ЧастиИмени = СтрРазделить(ИмяКолонки, "."); Если ПустаяСтрока(ИмяКолонки) ИЛИ ОписанияТипов[ЧастиИмени[0]] = Неопределено Тогда @@ -167,7 +268,7 @@ ЭтоВложенныйРеквизит = ЧастиИмени.Количество() = 2; ЭтоОсновнойРеквизит = ЧастиИмени.Количество() = 1; - ОписаниеКолонки = ОписаниеКолонки(Инд - 1); + ОписаниеКолонки = ОписаниеКолонки(Инд); Если ЭтоОсновнойРеквизит Тогда ОписаниеКолонки.Имя = ИмяКолонки; @@ -276,11 +377,11 @@ Возврат Значение; КонецЕсли; + ЗначенияРеквизитов = ЗначенияРеквизитов(СтрокаДанных, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания); Если ОписаниеКолонки.Составное Тогда - ЗначенияРеквизитов = ЗначенияРеквизитов(СтрокаДанных, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания); Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания); Иначе - Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, Неопределено, ПараметрыСоздания); + Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания); КонецЕсли; Если КэшироватьЗначение Тогда @@ -333,7 +434,7 @@ ОписаниеОбъектаМетаданных = ОписаниеКолонки.ОписаниеОбъектаМетаданных; - Если ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда + Если ОписаниеОбъектаМетаданных <> Неопределено И ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда ИмяРеквизита = "Наименование"; Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда ИмяРеквизита = "Код"; diff --git a/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl b/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl index cf71206e..d69b0616 100644 --- a/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl @@ -26,8 +26,8 @@ .ДобавитьТест("Удалить") .ДобавитьТест("ВариантыПараметров") .ДобавитьТест("СоздатьГруппу") - .ДобавитьТест("ЗагрузитьИзМакета") - .ДобавитьСерверныйТест("ТаблицаЗначенийИзТаблицыMarkDown") + .ДобавитьТест("ЗагрузитьИзМакета_ТабличныйДокумент") + .ДобавитьТест("ЗагрузитьИзМакета_MarkDown") .ДобавитьТест("СлучайныйИдентификатор") ; @@ -107,7 +107,7 @@ КонецПроцедуры -Процедура ЗагрузитьИзМакета() Экспорт +Процедура ЗагрузитьИзМакета_ТабличныйДокумент() Экспорт // Подготовка тестового окружения @@ -176,54 +176,71 @@ КонецПроцедуры -#Если Сервер Тогда - -Процедура ТаблицаЗначенийИзТаблицыMarkDown() Экспорт +Процедура ЗагрузитьИзМакета_MarkDown() Экспорт - // Подготовка тестового окружения + ИмяМакета = "ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown"; + Макет = ЮТОбщий.Макет(ИмяМакета); - ИсходныеДанные = - "| Товар | Цена | Количество | Сумма | - ||---------|-------|------------|-------| - || Товар 1 | 100 | 1 | 100 | - || Товар 2 | 2 000 | 1 | 2000 | - || Услуга | 300,9 | 1 | 300,9 | - |"; - - ОписанияТипов = Новый Соответствие; - ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); - ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); - ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); - ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); - - // Вызов тестируемого сценария - - ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета( - ИсходныеДанные, - ОписанияТипов - ); - - // Проверка поведения и результатов - - Ютест.ОжидаетЧто(ТаблицаРезультатов) - .ИмеетТип("ТаблицаЗначений") - .ИмеетДлину(3) - .Свойство("[0].Товар.Наименование").Равно("Товар 1") - .Свойство("[0].Количество").Равно(1) - .Свойство("[0].Цена").Равно(100) - .Свойство("[0].Сумма").Равно(100) - .Свойство("[1].Товар.Наименование").Равно("Товар 2") - .Свойство("[1].Количество").Равно(1) - .Свойство("[1].Цена").Равно(2000) - .Свойство("[1].Сумма").Равно(2000) - .Свойство("[2].Товар.Наименование").Равно("Услуга") - .Свойство("[2].Количество").Равно(1) - .Свойство("[2].Цена").Равно(300.9) - .Свойство("[2].Сумма").Равно(300.9) + Варианты = ЮТест.Варианты("Данные, Описание") + .Добавить(ИмяМакета, "По имени макета") + .Добавить(Макет, "Из текстового документа") + .Добавить(Макет.ПолучитьТекст(), "Из строки") ; - -КонецПроцедуры - -#КонецЕсли + Для Каждого Вариант Из Варианты.СписокВариантов() Цикл + + ОписанияТипов = Новый Соответствие; + ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); + ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); + ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); + ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); + + // Вызов тестируемого сценария + + ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета( + Вариант.Данные, + ОписанияТипов + ); + + // Проверка поведения и результатов + +#Если Сервер Тогда + Ютест.ОжидаетЧто(ТаблицаРезультатов, Вариант.Описание) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(3) + .Свойство("[0].Товар.Наименование").Равно("Товар 1") + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100) + .Свойство("[0].Сумма").Равно(100) + .Свойство("[1].Товар.Наименование").Равно("Товар 2") + .Свойство("[1].Количество").Равно(1) + .Свойство("[1].Цена").Равно(2000) + .Свойство("[1].Сумма").Равно(2000) + .Свойство("[2].Товар.Наименование").Равно("Услуга") + .Свойство("[2].Количество").Равно(1) + .Свойство("[2].Цена").Равно(300.9) + .Свойство("[2].Сумма").Равно(300.9) + ; +#Иначе + Ютест.ОжидаетЧто(ТаблицаРезультатов, Вариант.Описание) + .ИмеетТип("Массив") + .ИмеетДлину(3) + .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат() + .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары") + .Реквизит("Количество").Равно(1) + .Реквизит("Цена").Заполнено().ИмеетТип("Число") + .Реквизит("Сумма").Заполнено().ИмеетТип("Число")) + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100) + .Свойство("[0].Сумма").Равно(100) + .Свойство("[1].Цена").Равно(2000) + .Свойство("[1].Сумма").Равно(2000) + .Свойство("[2].Цена").Равно(300.9) + .Свойство("[2].Сумма").Равно(300.9) + ; +#КонецЕсли + КонецЦикла; + +КонецПроцедуры + #КонецОбласти diff --git a/tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/Template.txt b/tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/Template.txt new file mode 100644 index 00000000..d2255082 --- /dev/null +++ b/tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/Template.txt @@ -0,0 +1,5 @@ +| Товар | Цена | Количество | Сумма | +|---------|-------|------------|-------| +| Товар 1 | 100 | 1 | 100 | +| Товар 2 | 2 000 | 1 | 2000 | +| Услуга | 300,9 | 1 | 300,9 | \ No newline at end of file diff --git a/tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/ЮТ_ТестовыеДанныеMarkdown.mdo b/tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/ЮТ_ТестовыеДанныеMarkdown.mdo new file mode 100644 index 00000000..3cb33670 --- /dev/null +++ b/tests/src/CommonTemplates/ЮТ_ТестовыеДанныеMarkdown/ЮТ_ТестовыеДанныеMarkdown.mdo @@ -0,0 +1,9 @@ + + + ЮТ_ТестовыеДанныеMarkdown + + ru + Ю т тестовые данные markdown + + TextDocument + diff --git a/tests/src/Configuration/Configuration.mdo b/tests/src/Configuration/Configuration.mdo index 208bbe39..02b5d323 100644 --- a/tests/src/Configuration/Configuration.mdo +++ b/tests/src/Configuration/Configuration.mdo @@ -23,6 +23,7 @@ ru CommonTemplate.ЮТ_МакетТестовыхДанных + CommonTemplate.ЮТ_ТестовыеДанныеMarkdown CommonModule.Интеграция CommonModule.Обр_ЮТHTTPСервисЗапрос CommonModule.ОМ_Мокито