diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl index aa8ad124..3270606a 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl @@ -672,6 +672,26 @@ КонецФункции +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда +// Возвращает конструктор создания объекта XDTO +// +// Параметры: +// ИмяТипа - Строка - Имя типа объекта +// ПространствоИмен - Строка - Пространство имен типа +// Фабрика - ФабрикаXDTO - Используемая фабрика XDTO +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор объекта XDTO +Функция КонструкторОбъектаXDTO(ИмяТипа, ПространствоИмен, Фабрика = Неопределено) Экспорт + + Обработка = Обработки.ЮТКонструкторОбъектаXDTO.Создать(); + Обработка.Инициализировать(ИмяТипа, ПространствоИмен); + + Возврат Обработка; + +КонецФункции +#КонецЕсли + // Удаляет переданные объекта // // Параметры: diff --git a/exts/yaxunit/src/Configuration/Configuration.mdo b/exts/yaxunit/src/Configuration/Configuration.mdo index 89cf9fca..19e40949 100644 --- a/exts/yaxunit/src/Configuration/Configuration.mdo +++ b/exts/yaxunit/src/Configuration/Configuration.mdo @@ -122,6 +122,7 @@ DataProcessor.ЮТHTTPServiceRequest DataProcessor.ЮТHTTPСервисЗапрос DataProcessor.ЮТRecordSet + DataProcessor.ЮТКонструкторОбъектаXDTO DataProcessor.ЮТКонструкторТестовыхДанных DataProcessor.ЮТЮнитТесты diff --git a/exts/yaxunit/src/DataProcessors/ЮТКонструкторОбъектаXDTO/ObjectModule.bsl b/exts/yaxunit/src/DataProcessors/ЮТКонструкторОбъектаXDTO/ObjectModule.bsl new file mode 100644 index 00000000..dfcbb5a1 --- /dev/null +++ b/exts/yaxunit/src/DataProcessors/ЮТКонструкторОбъектаXDTO/ObjectModule.bsl @@ -0,0 +1,347 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2024 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда + +#Область ОписаниеПеременных + +Перем ТекущийОбъект; +Перем ТекущийТип; +Перем СтекОбъектов; +Перем Фабрика; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Устанавливает значение реквизита объекта. +// +// Параметры: +// ИмяРеквизита - Строка - Имя реквизита объекта +// Значение - Произвольный - Значение реквизита объекта +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор +Функция Установить(ИмяРеквизита, Значение) Экспорт + + ТекущийОбъект[ИмяРеквизита] = Значение; + + Возврат ЭтотОбъект; + +КонецФункции + +// Устанавливает фиктивное значение реквизита объекта. +// +// На основании типа реквизита генерируется фиктивное значение. +// +// * Для примитивных значение генерируется случайное значение +// * Для объектных типов создается новый объект +// * Для коллекций - генерируется случайно количество случайных элементов (на основании типа) +// +// Параметры: +// ИмяРеквизита - Строка - Имя реквизита объекта +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор +Функция Фикция(ИмяРеквизита) Экспорт + + Свойство = ТекущийТип.Свойства.Получить(ИмяРеквизита); + Значение = СлучайноеЗначениеСвойства(Свойство, 0); + Установить(ИмяРеквизита, Значение); + + Возврат ЭтотОбъект; + +КонецФункции + +// Заполняет обязательные реквизиты объекта фиктивными значениями +// +// На основании типа объекта определяются обязательные поля. +// Для них генерируются и устанавливаются фиктивные значение. +// +// * Для примитивных значение генерируется случайное значение +// * Для объектных типов создается новый объект +// * Для коллекций - генерируется случайно количество случайных элементов (на основании типа) +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор +Функция ФикцияОбязательныхПолей() Экспорт + + Для Каждого Свойство Из ТекущийТип.Свойства Цикл + + Если НЕ Свойство.ВозможноПустое И НеЗаполнено(Свойство, ТекущийОбъект[Свойство.Имя]) Тогда + УстановитьСлучайноеЗначениеСвойства(ТекущийОбъект, Свойство, 0); + КонецЕсли; + + КонецЦикла; + + Возврат ЭтотОбъект; + +КонецФункции + +// Заполняет неустановленные реквизиты объекта фиктивными значениями +// +// На основании типа объекта определяются обязательные поля. +// Для них генерируются и устанавливаются фиктивные значение. +// +// * Для примитивных значение генерируется случайное значение +// * Для объектных типов создается новый объект +// * Для коллекций - генерируется случайно количество случайных элементов (на основании типа) +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор +Функция ФикцияНезаполненных() Экспорт + + Для Каждого Свойство Из ТекущийТип.Свойства Цикл + + Если НеЗаполнено(Свойство, ТекущийОбъект[Свойство.Имя]) Тогда + УстановитьСлучайноеЗначениеСвойства(ТекущийОбъект, Свойство, 0); + КонецЕсли; + + КонецЦикла; + + Возврат ЭтотОбъект; + +КонецФункции + +// Возвращает основной объект XDTO +// +// Возвращаемое значение: +// ОбъектXDTO +Функция ДанныеОбъекта() Экспорт + + Возврат СтекОбъектов[0]; + +КонецФункции + +// Добавляет новый объект в реквизит-коллекцию +// +// Параметры: +// ИмяРеквизита - Строка - Имя реквизиты коллекции +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Добавить новый +Функция ДобавитьНовый(ИмяРеквизита) Экспорт + + Свойство = ТекущийТип.Свойства.Получить(ИмяРеквизита); + + Если НЕ ЭтоТипОбъектаXDTO(Свойство.Тип) Тогда + ВызватьИсключение СтрШаблон("Метод применяется только для свойств-объектов. Реквизит: %1 имеет тип %2", ИмяРеквизита, Свойство.Тип); + КонецЕсли; + + Коллекция = ТекущийОбъект[Свойство.Имя]; + ДобавитьНовыйОбъектВСтек(Свойство.Тип); + + Коллекция.Добавить(ТекущийОбъект); + + Возврат ЭтотОбъект; + +КонецФункции + +// Переходит на уровень выше по стеку. +// +// Возвращаемое значение: +// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Перейти к владельцу +Функция ПерейтиКВладельцу() Экспорт + + УдалитьПоследнийИзСтека(); + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура Инициализировать(ИмяТипаОбъекта, ПространствоИмен, ФабрикаОбъектов = Неопределено) Экспорт + + Если ФабрикаОбъектов = Неопределено Тогда + Фабрика = ФабрикаXDTO; + Иначе + Фабрика = ФабрикаОбъектов; + КонецЕсли; + + СтекОбъектов = Новый Массив(); + ТипОбъекта = Фабрика.Тип(ПространствоИмен, ИмяТипаОбъекта); + ДобавитьНовыйОбъектВСтек(ТипОбъекта); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ДобавитьНовыйОбъектВСтек(Тип) + + Объект = НовыйОбъект(Тип); + СтекОбъектов.Добавить(Объект); + ТекущийОбъект = Объект; + ТекущийТип = Тип; + +КонецПроцедуры + +Процедура УдалитьПоследнийИзСтека() + + ИндексПоследнего = СтекОбъектов.ВГраница(); + + ТекущийОбъект = СтекОбъектов[ИндексПоследнего - 1]; + ТекущийТип = ТекущийОбъект.Тип(); + + СтекОбъектов.Удалить(ИндексПоследнего); + +КонецПроцедуры + +Функция СлучайноеЗначениеСвойства(Свойство, Уровень = 0) + + ТипСвойства = Свойство.Тип; + Если ТипЗнч(ТипСвойства) = Тип("ТипЗначенияXDTO") Тогда + Возврат СлучайноеЗначениеПримитипа(Свойство); + ИначеЕсли Уровень < 3 Тогда + Возврат СлучайноеЗначениеОбъекта(Свойство, Уровень + 1); + КонецЕсли; + +КонецФункции + +Функция СлучайноеЗначениеПримитипа(Свойство) + + Тип = Свойство.Тип; + + Если Тип.Имя = "string" И СтрНайти(НРег(Свойство.Имя), "uid") Тогда + Возврат ЮТест.Данные().УникальнаяСтрока(); + ИначеЕсли Тип.Имя = "string" Тогда + Возврат ЮТест.Данные().СлучайнаяСтрока(); + ИначеЕсли Тип.Имя = "boolean" Тогда + Возврат ЮТест.Данные().СлучайноеБулево(); + ИначеЕсли Тип.Имя = "integer" Тогда + Возврат ЮТест.Данные().СлучайноеЧисло(); + ИначеЕсли Тип.Имя = "decimal" Тогда + Возврат ЮТест.Данные().СлучайноеЧисло(, , 3); + ИначеЕсли Тип.Имя = "time" Тогда + Возврат ЮТест.Данные().СлучайноеВремя(); + ИначеЕсли Тип.Имя = "date" Тогда + Возврат НачалоДня(ЮТест.Данные().СлучайнаяДата()); + ИначеЕсли Тип.Имя = "dateTime" Тогда + Возврат ЮТест.Данные().СлучайнаяДата(); + ИначеЕсли Тип.БазовыйТип.Имя = "AnyRef" Тогда + Возврат ЮТест.Данные().УникальнаяСтрока(); + ИначеЕсли ЗначениеЗаполнено(Тип.Фасеты) И Тип.Фасеты[0].Вид = ВидФасетаXDTO.Перечисление Тогда + Возврат СлучайноеЗначениеПеречисления(Тип); + Иначе + ВызватьИсключение "Неподдерживаемый тип примитива XDTO: " + Тип; + КонецЕсли; + +КонецФункции + +Функция СлучайноеЗначениеОбъекта(Свойство, Уровень) + + Пакет = НовыйОбъект(Свойство.Тип); + ЗаполнитьПакетСлучайнымиЗначениями(Пакет, Уровень); + + Возврат Пакет; + +КонецФункции + +Процедура ЗаполнитьПакетСлучайнымиЗначениями(Пакет, Уровень = 0) + + Тип = Пакет.Тип(); + Для Каждого Свойство Из Тип.Свойства Цикл + + Если НеЗаполнено(Свойство, Пакет[Свойство.Имя]) Тогда + Продолжить; + КонецЕсли; + + УстановитьСлучайноеЗначениеСвойства(Пакет, Свойство, Уровень); + + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьСлучайноеЗначениеСвойства(Пакет, Свойство, Уровень) + + ЭтоСписок = ЭтоСписок(Свойство); + + Если ЭтоСписок Тогда + СписокСлучайныхЗначений(Пакет[Свойство.Имя], Свойство, Уровень); + Иначе + Пакет[Свойство.Имя] = СлучайноеЗначениеСвойства(Свойство, Уровень); + КонецЕсли; + +КонецПроцедуры + +Функция НеЗаполнено(Свойство, Значение) + + ЭтоСписок = ЭтоСписок(Свойство); + + Если ЭтоСписок И Значение.Количество() Тогда + Возврат Значение.Количество() = 0; + Иначе + Возврат НЕ ЗначениеЗаполнено(Значение); + КонецЕсли; + +КонецФункции + +Функция ЭтоСписок(Свойство) + + Возврат Свойство.ВерхняяГраница = -1 ИЛИ Свойство.ВерхняяГраница > 1; + +КонецФункции + +Процедура СписокСлучайныхЗначений(Список, Свойство, Уровень) + + Если Свойство.ВерхняяГраница = -1 Тогда + Количество = ЮТест.Данные().СлучайноеЧисло(Свойство.НижняяГраница, 10); + Иначе + Количество = ЮТест.Данные().СлучайноеЧисло(Свойство.НижняяГраница, Свойство.ВерхняяГраница); + КонецЕсли; + + Для Инд = 0 По Количество Цикл + Значение = СлучайноеЗначениеСвойства(Свойство, Уровень); + Список.Добавить(Значение); + КонецЦикла; + +КонецПроцедуры + +Функция НовыйОбъект(Тип) + + Возврат Фабрика.Создать(Тип); + +КонецФункции + +Функция ЭтоТипОбъектаXDTO(ТипСвойства) + + Возврат ТипЗнч(ТипСвойства) = Тип("ТипОбъектаXDTO"); + +КонецФункции + +Функция СлучайноеЗначениеПеречисления(Тип) + + Значения = Новый Массив(); + + Для Каждого Фасет Из Тип.Фасеты Цикл + Если Фасет.Вид = ВидФасетаXDTO.Перечисление Тогда + Значения.Добавить(Фасет.Значение); + КонецЕсли; + КонецЦикла; + + Возврат ЮТест.Данные().СлучайноеЗначениеИзСписка(Значения); + +КонецФункции + +#КонецОбласти + +#КонецЕсли diff --git a/exts/yaxunit/src/DataProcessors/ЮТКонструкторОбъектаXDTO/ЮТКонструкторОбъектаXDTO.mdo b/exts/yaxunit/src/DataProcessors/ЮТКонструкторОбъектаXDTO/ЮТКонструкторОбъектаXDTO.mdo new file mode 100644 index 00000000..c8450bc1 --- /dev/null +++ b/exts/yaxunit/src/DataProcessors/ЮТКонструкторОбъектаXDTO/ЮТКонструкторОбъектаXDTO.mdo @@ -0,0 +1,13 @@ + + + + + + + ЮТКонструкторОбъектаXDTO + + ru + Конструктор объекта XDTO + + true + diff --git a/tests/src/CommonModules/Обр_ЮТКонструкторОбъектаXDTO_МО/Module.bsl b/tests/src/CommonModules/Обр_ЮТКонструкторОбъектаXDTO_МО/Module.bsl new file mode 100644 index 00000000..0d4d195f --- /dev/null +++ b/tests/src/CommonModules/Обр_ЮТКонструкторОбъектаXDTO_МО/Module.bsl @@ -0,0 +1,157 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2024 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИсполняемыеСценарии() Экспорт + + ЮТТесты + .ДобавитьТест("Установить") + .ДобавитьТест("Фикция") + .ДобавитьТест("ФикцияОбязательныхПолей") + .ДобавитьТест("ФикцияНезаполненных") + .ДобавитьТест("ДобавитьНовый") + .ДобавитьТест("ПерейтиКВладельцу") + ; + +КонецПроцедуры + +Процедура Установить() Экспорт + + Номер = ЮТест.Данные().СлучайнаяСтрока(9); + Сумма = ЮТест.Данные().СлучайноеЧисло(); + Покупатель = ЮТест.Данные().СоздатьЭлемент(Справочники.Контрагенты); + + Объект = НовыйКонструктор() + .Установить("Number", Номер) + .Установить("Сумма", Сумма) + .Установить("Покупатель", Покупатель) + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Объект) + .ИмеетТип(Тип("ОбъектXDTO")) + .Свойство("Number").Равно(Номер) + .Свойство("Сумма").Равно(Сумма) + .Свойство("Покупатель").Равно(Покупатель) + ; + +КонецПроцедуры + +Процедура Фикция() Экспорт + + Объект = НовыйКонструктор() + .Фикция("Number") + .Фикция("Сумма") + .Фикция("Покупатель") + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Объект) + .ИмеетТип(Тип("ОбъектXDTO")) + .Свойство("Number").Заполнено() + .Свойство("Сумма").Заполнено() + .Свойство("Покупатель").Заполнено() + ; + +КонецПроцедуры + +Процедура ФикцияОбязательныхПолей() Экспорт + + Дата = ЮТест.Данные().СлучайнаяДата(); + + Объект = НовыйКонструктор() + .Установить("Date", Дата) + .ФикцияОбязательныхПолей() + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Объект) + .ИмеетТип(Тип("ОбъектXDTO")) + .Свойство("Number").Заполнено() + .Свойство("Date").Равно(Дата) + .Свойство("Сумма").Заполнено() + .Свойство("Покупатель").Заполнено() + .Свойство("Товары").Заполнено() + ; + +КонецПроцедуры + +Процедура ФикцияНезаполненных() Экспорт + + Дата = ЮТест.Данные().СлучайнаяДата(); + + Объект = НовыйКонструктор() + .Установить("Date", Дата) + .ФикцияНезаполненных() + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Объект) + .ИмеетТип(Тип("ОбъектXDTO")) + .Свойство("Number").Заполнено() + .Свойство("Date").Равно(Дата) + .Свойство("Сумма").Заполнено() + .Свойство("Покупатель").Заполнено() + .Свойство("Товары").Заполнено() + ; + +КонецПроцедуры + +Процедура ДобавитьНовый() Экспорт + + Объект = НовыйКонструктор() + .ДобавитьНовый("Товары") + .Фикция("Цена") + .Фикция("Количество") + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Объект) + .ИмеетТип(Тип("ОбъектXDTO")) + .Свойство("Товары").ИмеетДлину(1) + .Свойство("Товары[0].Цена").Заполнено() + .Свойство("Товары[0].Сумма").НеЗаполнено(); + +КонецПроцедуры + +Процедура ПерейтиКВладельцу() Экспорт + + Объект = НовыйКонструктор() + .ДобавитьНовый("Товары") + .ПерейтиКВладельцу() + .Фикция("Сумма") + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Объект) + .ИмеетТип(Тип("ОбъектXDTO")) + .Свойство("Товары").ИмеетДлину(1) + .Свойство("Товары[0].Сумма").НеЗаполнено() + .Свойство("Сумма").Заполнено() + ; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НовыйКонструктор() + + Тип = СериализаторXDTO.XMLТип(Тип("ДокументОбъект.Заказ")); + + Возврат ЮТест.Данные().КонструкторОбъектаXDTO(Тип.ИмяТипа, Тип.URIПространстваИмен); + +КонецФункции + +#КонецОбласти diff --git a/tests/src/CommonModules/Обр_ЮТКонструкторОбъектаXDTO_МО/Обр_ЮТКонструкторОбъектаXDTO_МО.mdo b/tests/src/CommonModules/Обр_ЮТКонструкторОбъектаXDTO_МО/Обр_ЮТКонструкторОбъектаXDTO_МО.mdo new file mode 100644 index 00000000..663eab4e --- /dev/null +++ b/tests/src/CommonModules/Обр_ЮТКонструкторОбъектаXDTO_МО/Обр_ЮТКонструкторОбъектаXDTO_МО.mdo @@ -0,0 +1,5 @@ + + + Обр_ЮТКонструкторОбъектаXDTO_МО + true + diff --git a/tests/src/Configuration/Configuration.mdo b/tests/src/Configuration/Configuration.mdo index c4a17479..283b955c 100644 --- a/tests/src/Configuration/Configuration.mdo +++ b/tests/src/Configuration/Configuration.mdo @@ -27,6 +27,7 @@ CommonModule.Интеграция CommonModule.Обр_ЮТHTTPСервисЗапрос CommonModule.Обр_ЮТRecordSet_МО + CommonModule.Обр_ЮТКонструкторОбъектаXDTO_МО CommonModule.ОМ_Мокито CommonModule.ОМ_МокитоОбучение CommonModule.ОМ_МокитоСлужебный