1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-20 18:48:36 +02:00
Конструктор объектов XDTO
This commit is contained in:
alkoleft 2024-03-07 00:08:02 +03:00
parent be14375c5a
commit 1b6d9ad94a
4 changed files with 332 additions and 0 deletions

View File

@ -551,6 +551,25 @@
КонецФункции
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
// Возвращает конструктор создания объекта XDTO
//
// Параметры:
// ИмяТипа - Строка - Имя типа объекта
// ПространствоИмен - Строка - Пространство имен типа
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор объекта XDTO
Функция КонструкторОбъектаXDTO(ИмяТипа, ПространствоИмен) Экспорт
Обработка = Обработки.ЮТКонструкторОбъектаXDTO.Создать();
Обработка.Инициализировать(ИмяТипа, ПространствоИмен);
Возврат Обработка;
КонецФункции
#КонецЕсли
// Удаляет переданные объекта
//
// Параметры:

View File

@ -121,6 +121,7 @@
<dataProcessors>DataProcessor.ЮТHTTPServiceRequest</dataProcessors>
<dataProcessors>DataProcessor.ЮТHTTPСервисЗапрос</dataProcessors>
<dataProcessors>DataProcessor.ЮТRecordSet</dataProcessors>
<dataProcessors>DataProcessor.ЮТКонструкторОбъектаXDTO</dataProcessors>
<dataProcessors>DataProcessor.ЮТКонструкторТестовыхДанных</dataProcessors>
<dataProcessors>DataProcessor.ЮТЮнитТесты</dataProcessors>
</mdclass:Configuration>

View File

@ -0,0 +1,299 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// 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" Тогда
Возврат ЮТест.Данные().СлучайнаяДата();
Иначе
ВызватьИсключение "Неподдерживаемый тип примитива XDTO: " + Тип;
КонецЕсли;
КонецФункции
Функция СлучайноеЗначениеОбъекта(Свойство, Уровень)
Пакет = НовыйОбъект(Свойство.Тип);
ЗаполнитьПакетСлучайнымиЗначениями(Пакет, Уровень);
Возврат Пакет;
КонецФункции
Процедура ЗаполнитьПакетСлучайнымиЗначениями(Пакет, Уровень = 0)
Тип = Пакет.Тип();
Для Каждого Свойство Из Тип.Свойства Цикл
ЭтоСписок = Свойство.ВерхняяГраница = -1 ИЛИ Свойство.ВерхняяГраница > 1;
Если ЭтоСписок И Пакет[Свойство.Имя].Количество() Тогда
Продолжить;
ИначеЕсли ЭтоСписок Тогда
СписокСлучайныхЗначений(Пакет[Свойство.Имя], Свойство, Уровень);
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Пакет[Свойство.Имя]) Тогда
Продолжить;
КонецЕсли;
Значение = СлучайноеЗначениеСвойства(Свойство, Уровень);
Если Значение <> Неопределено Тогда
Пакет[Свойство.Имя] = Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СписокСлучайныхЗначений(Список, Свойство, Уровень)
Если Свойство.ВерхняяГраница = -1 Тогда
Количество = ЮТест.Данные().СлучайноеЧисло(Свойство.НижняяГраница, 10);
Иначе
Количество = ЮТест.Данные().СлучайноеЧисло(Свойство.НижняяГраница, Свойство.ВерхняяГраница);
КонецЕсли;
Для Инд = 0 По Количество Цикл
Значение = СлучайноеЗначениеСвойства(Свойство, Уровень);
Список.Добавить(Значение);
КонецЦикла;
КонецПроцедуры
Функция НовыйОбъект(Тип)
Возврат ФабрикаXDTO.Создать(Тип);
КонецФункции
Функция ЭтоТипОбъектаXDTO(ТипСвойства)
Возврат ТипЗнч(ТипСвойства) = Тип("ТипОбъектаXDTO");
КонецФункции
#КонецОбласти
#КонецЕсли

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8ea1fd8e-8352-4973-a357-c64ccb1b9b5c">
<producedTypes>
<objectType typeId="4d0c09ec-ea56-4aef-852c-42a99d491406" valueTypeId="ac59e2e1-acef-483b-b47d-b9aa6bcde7cd"/>
<managerType typeId="f43e3751-6657-41b5-a060-07b0bcd9b2c0" valueTypeId="66b97e8e-5ab2-4e0b-8e10-a14a755c4e0b"/>
</producedTypes>
<name>ЮТКонструкторОбъектаXDTO</name>
<synonym>
<key>ru</key>
<value>Конструктор объекта XDTO</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
</mdclass:DataProcessor>