1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-11-30 08:36:50 +02:00
Загрузка из markdown
This commit is contained in:
alkoleft 2023-09-03 04:40:15 +03:00
parent 371a281582
commit c7ea8862e9
6 changed files with 224 additions and 75 deletions

View File

@ -858,6 +858,22 @@
КонецПроцедуры
// Возвращяет макет
//
// Параметры:
// ИмяМакета - Строка - Возможные значения
// * Общий макет, например, ОбщийМакет.ЮТМетаданные
// * Макет объекта метаданных, например, Справочник.Товары.ПечатнаяФорма
// * Область макета, например, Справочник.Товары.ПечатнаяФорма.Шапка, ОбщийМакет.ЮТМетаданные.Заголовок
//
// Возвращаемое значение:
// ТабличныйДокумент, ТекстовыйДокумент, ДвоичныеДанные - Макет или его область
Функция Макет(ИмяМакета) Экспорт
Возврат ЮТОбщийВызовСервера.Макет(ИмяМакета);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -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 @@
ОписаниеОбъектаМетаданных = ОписаниеКолонки.ОписаниеОбъектаМетаданных;
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда
Если ОписаниеОбъектаМетаданных <> Неопределено И ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда
ИмяРеквизита = "Наименование";
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда
ИмяРеквизита = "Код";

View File

@ -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)
;
#КонецЕсли
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,5 @@
| Товар | Цена | Количество | Сумма |
|---------|-------|------------|-------|
| Товар 1 | 100 | 1 | 100 |
| Товар 2 | 2 000 | 1 | 2000 |
| Услуга | 300,9 | 1 | 300,9 |

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2e31e77f-a18c-4b2d-bc19-f038eb6ec143">
<name>ЮТ_ТестовыеДанныеMarkdown</name>
<synonym>
<key>ru</key>
<value>Ю т тестовые данные markdown</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -23,6 +23,7 @@
<languageCode>ru</languageCode>
</languages>
<commonTemplates>CommonTemplate.ЮТ_МакетТестовыхДанных</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_ТестовыеДанныеMarkdown</commonTemplates>
<commonModules>CommonModule.Интеграция</commonModules>
<commonModules>CommonModule.Обр_ЮТHTTPСервисЗапрос</commonModules>
<commonModules>CommonModule.ОМ_Мокито</commonModules>