From 7d40a508807b6d00a23bda493a75028a96042f0c Mon Sep 17 00:00:00 2001 From: alkoleft Date: Sun, 24 Mar 2024 02:03:03 +0300 Subject: [PATCH] #283 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Предикат "ВСписке" --- .../ЮТЗапросыСлужебныйВызовСервера/Module.bsl | 4 +- .../src/CommonModules/ЮТПредикаты/Module.bsl | 32 ++++++++++ .../Module.bsl | 2 + .../ЮТСообщенияСлужебный/Module.bsl | 2 + .../Module.bsl | 22 +++++++ .../CommonModules/ЮТУтверждения/Module.bsl | 16 +++++ .../src/CommonModules/ОМ_ЮТЗапросы/Module.bsl | 58 ++++++++++++++++--- .../CommonModules/ОМ_ЮТУтверждения/Module.bsl | 22 ++++++- 8 files changed, 147 insertions(+), 11 deletions(-) diff --git a/exts/yaxunit/src/CommonModules/ЮТЗапросыСлужебныйВызовСервера/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТЗапросыСлужебныйВызовСервера/Module.bsl index b58cdce4..94b9e279 100644 --- a/exts/yaxunit/src/CommonModules/ЮТЗапросыСлужебныйВызовСервера/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТЗапросыСлужебныйВызовСервера/Module.bsl @@ -161,7 +161,7 @@ Строки.Добавить(СтрСоединить(ВыбираемыеПоля, "," + Символы.ПС)); Строки.Добавить("ИЗ " + ОписаниеЗапроса.ИмяТаблицы); - + Условия = СформироватьУсловия(ОписаниеЗапроса.Условия, ОписаниеЗапроса.ИмяТаблицы, Запрос); Если Условия.Количество() Тогда @@ -299,6 +299,8 @@ Шаблон = "ТИПЗНАЧЕНИЯ(%1) = &%2"; ИначеЕсли Выражение = ВыраженияПредикатов.Содержит Тогда Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%"""; + ИначеЕсли Выражение = ВыраженияПредикатов.ВСписке Тогда + Шаблон = "%1 В (&%2)"; ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда // TODO Реализовать ВызватьИсключение "Проверка заполненности пока не поддерживается"; diff --git a/exts/yaxunit/src/CommonModules/ЮТПредикаты/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТПредикаты/Module.bsl index 132bba93..d6721454 100644 --- a/exts/yaxunit/src/CommonModules/ЮТПредикаты/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТПредикаты/Module.bsl @@ -41,6 +41,22 @@ КонецФункции +// Устанавливает имя свойства, все последующие проверки будут относится к нему. +// Это алиас для см. Реквизит +// +// Параметры: +// ИмяСвойства - Строка - Имя реквизита +// - Число - Индекс коллекции +// - Произвольный - Ключ соответствия +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Свойство(ИмяСвойства) Экспорт + + Возврат Реквизит(ИмяСвойства); + +КонецФункции + // Добавляет предикат, проверяющий равенство объекта (свойства) указанному значению // // Параметры: @@ -295,6 +311,21 @@ КонецФункции +// Добавляет условие, что проверяемое значение (или значение его свойства) входит в список значений +// +// Параметры: +// Значения - Массив из Произвольный - Значения для проверки +// - СписокЗначений из Произвольный - Значения для проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ВСписке(Значения) Экспорт + + ДобавитьПредикат(Выражения().ВСписке, Значения); + Возврат ЮТПредикаты; + +КонецФункции + // Возвращает набор сформированных утверждений. // // Рекомендуется использовать этот метод, если планируется отложенная проверка предикатов. Например, вы хотите сформировать два набору предикатов @@ -358,6 +389,7 @@ Выражения.Вставить("НеСодержит", "НеСодержит"); Выражения.Вставить("СодержитСтрокуПоШаблону", "СодержитСтрокуПоШаблону"); Выражения.Вставить("НеСодержитСтрокуПоШаблону", "НеСодержитСтрокуПоШаблону"); + Выражения.Вставить("ВСписке", "ВСписке"); Возврат Новый ФиксированнаяСтруктура(Выражения); diff --git a/exts/yaxunit/src/CommonModules/ЮТПредикатыСлужебныйКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТПредикатыСлужебныйКлиентСервер/Module.bsl index a286787c..53034b53 100644 --- a/exts/yaxunit/src/CommonModules/ЮТПредикатыСлужебныйКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТПредикатыСлужебныйКлиентСервер/Module.bsl @@ -142,6 +142,8 @@ Шаблон = "содержит %1"; ИначеЕсли Выражение = Выражения.СодержитСтрокуПоШаблону Тогда Шаблон = "содержит подстроку соответствующую шаблону %1"; + ИначеЕсли Выражение = Выражения.ВСписке Тогда + Шаблон = "в списке %1"; Иначе ВызватьИсключение "Не описан шаблон сообщения для выражения предиката " + Выражение; КонецЕсли; diff --git a/exts/yaxunit/src/CommonModules/ЮТСообщенияСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСообщенияСлужебный/Module.bsl index e147972b..57d3c356 100644 --- a/exts/yaxunit/src/CommonModules/ЮТСообщенияСлужебный/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТСообщенияСлужебный/Module.bsl @@ -109,7 +109,9 @@ // в противном случае, будет возвращен текст шаблона без изменений. // Функция ПодставитьПредставлениеЗначенияВШаблон(ШаблонСтроки, ЗначениеПараметра) Экспорт + Возврат СтрЗаменить(ШаблонСтроки, "%1", ПредставлениеЗначения(ЗначениеПараметра)); + КонецФункции #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТСравнениеСлужебныйКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСравнениеСлужебныйКлиентСервер/Module.bsl index 9f5a5cdc..3729f5d9 100644 --- a/exts/yaxunit/src/CommonModules/ЮТСравнениеСлужебныйКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТСравнениеСлужебныйКлиентСервер/Module.bsl @@ -481,6 +481,10 @@ Результат = ПроверитьСоответствуетШаблону(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки); + ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ВСписке Тогда + + Результат = ПроверитьВСписке(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки); + Иначе ВызватьИсключение СтрШаблон("Неизвестное выражение предиката `%1`", Выражение.ВидСравнения); @@ -630,6 +634,24 @@ КонецФункции +Функция ПроверитьВСписке(РезультатПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки) + + ТипыПараметровСоответствуют = ПроверитьТипЗначения(РезультатПроверки, ОжидаемоеЗначение, "Массив, ФиксированныйМассив, СписокЗначений"); + + Если Не ТипыПараметровСоответствуют Тогда + Возврат Неопределено; + КонецЕсли; + + ТипСписка = ТипЗнч(ОжидаемоеЗначение); + + Если ЮТТипыДанныхСлужебный.ЭтоМассива(ТипСписка) Тогда + Возврат ОжидаемоеЗначение.Найти(ПроверяемоеЗначение) <> Неопределено; + Иначе + Возврат ОжидаемоеЗначение.НайтиПоЗначению(ПроверяемоеЗначение) <> Неопределено; + КонецЕсли; + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl index 645b6ce6..6c70f2bc 100644 --- a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl @@ -483,6 +483,22 @@ КонецФункции +// Проверяет значение (или его свойство), оно должно входить в указанный список. +// +// Параметры: +// Значения - Массив из Произвольный - Значения для проверки +// - СписокЗначений из Произвольный - Значения для проверки +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ВСписке(Значения, ОписаниеПроверки = Неопределено) Экспорт + + ПроверитьПредикат(ЮТПредикаты.Выражения().ВСписке, Значения, ОписаниеПроверки); + Возврат ЮТУтверждения; + +КонецФункции + #КонецОбласти // Проверяет наличие свойств и их значения у проверяемого объекта (или его свойства). diff --git a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl index 0be07778..f60a79bf 100644 --- a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl @@ -1,6 +1,6 @@ //©///////////////////////////////////////////////////////////////////////////©// // -// Copyright 2021-2023 BIA-Technologies Limited Liability Company +// 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. @@ -31,6 +31,7 @@ .ДобавитьТест("ЗначенияРеквизитовЗаписи") .ДобавитьТест("ЗначениеРеквизитаЗаписи") .ДобавитьТест("ДвиженияДокумента") + .ДобавитьТест("Записи_Условие_ВСписке") ; КонецПроцедуры @@ -117,23 +118,19 @@ Процедура РезультатЗапроса() Экспорт - Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары") - .Фикция("Наименование") - .Фикция("Поставщик"); - Ссылка = Конструктор.Записать(); - ДанныеСправочника = Конструктор.ДанныеОбъекта(); + Товар = НовыйТовар(); ОписаниеЗапроса = ЮТЗапросы.ОписаниеЗапроса(); ОписаниеЗапроса.ИмяТаблицы = "Справочник.Товары"; ОписаниеЗапроса.Условия.Добавить("Ссылка = &Ссылка"); ОписаниеЗапроса.Условия.Добавить("НЕ ПометкаУдаления"); - ОписаниеЗапроса.ЗначенияПараметров.Вставить("Ссылка", Ссылка); + ОписаниеЗапроса.ЗначенияПараметров.Вставить("Ссылка", Товар); ОписаниеЗапроса.ВыбираемыеПоля.Добавить("Наименование"); ОписаниеЗапроса.ВыбираемыеПоля.Добавить("1+1 КАК Число"); ЮТест.ОжидаетЧто(ЮТЗапросы.РезультатЗапроса(ОписаниеЗапроса)) .ИмеетДлину(1) - .Свойство("[0].Наименование").Равно(ДанныеСправочника.Наименование) + .Свойство("[0].Наименование").Равно(Товар.Наименование) .Свойство("[0].Число").Равно(2); КонецПроцедуры @@ -395,4 +392,49 @@ КонецПроцедуры +Процедура Записи_Условие_ВСписке() Экспорт + + ИмяТаблицы = "Справочник.Товары"; + ВидТовар = ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар"); + ВидУслуга = ПредопределенноеЗначение("Перечисление.ВидыТоваров.Услуга"); + Товар = НовыйТовар(ВидТовар); + Услуга = НовыйТовар(ВидУслуга); + + Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат() + .Свойство("Вид").ВСписке(ЮТКоллекции.ЗначениеВМассиве(ВидТовар, ВидУслуга))); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетДлину(2) + .ЛюбойЭлементСодержитСвойствоСоЗначением("Ссылка", Товар) + .ЛюбойЭлементСодержитСвойствоСоЗначением("Ссылка", Услуга); + + Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат() + .Свойство("Вид").ВСписке(ЮТКоллекции.ЗначениеВМассиве(ВидТовар))); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетДлину(1) + .Свойство("[0].Ссылка", Товар); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НовыйТовар(ВидТовара = Неопределено) + + Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары") + .Фикция("Наименование") + .Фикция("Поставщик"); + + Если ЗначениеЗаполнено(ВидТовара) Тогда + Конструктор.Установить("Вид", ВидТовара); + Иначе + Конструктор.Фикция("Вид"); + КонецЕсли; + + Возврат Конструктор.Записать(); + +КонецФункции + #КонецОбласти diff --git a/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl b/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl index e5adf7a4..a6403d1e 100644 --- a/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl @@ -77,7 +77,15 @@ .ДобавитьТест("ЛюбойЭлементСоответствуетПредикату") .ДобавитьТест("СодержитПредикат") .ДобавитьТест("НеСодержитПредикат") - .ДобавитьТест("ФорматированныеСтроки") + .ДобавитьТест("ФорматированныеСтроки"); + + Массив = ЮТКоллекции.ЗначениеВМассиве(0, 1, "2"); + Список = Новый СписокЗначений(); + Список.ЗагрузитьЗначения(Массив); + + ЮТТесты.ДобавитьТест("ВСписке") + .СПараметрами(Массив) + .СПараметрами(Список) ; КонецПроцедуры @@ -2375,6 +2383,16 @@ КонецПроцедуры +Процедура ВСписке(Коллекция) Экспорт + + ЮТест.ОжидаетЧто(0) + .ВСписке(Коллекция); + + Ошибка = ОшибкаУтверждения(-1, "ВСписке", Коллекция); + ПроверитьОшибкуУтверждения(Ошибка, СтрШаблон("проверяемое значение `-1` в списке `%1`, но это не так.", Коллекция)); + +КонецПроцедуры + Процедура ФорматированныеСтроки() Экспорт Строка = Новый ФорматированнаяСтрока("Тестовая строка"); @@ -2399,9 +2417,9 @@ Функция ОшибкаУтверждения(ПроверяемоеЗначение, Утверждение, Параметр) Параметры = ЮТКоллекции.ЗначениеВМассиве(Параметр); - ЮТест.ОжидаетЧто(ПроверяемоеЗначение); Ошибка = ЮТМетодыСлужебный.ВыполнитьМетод("ЮТУтверждения." + Утверждение, Параметры); + Возврат Ошибка; КонецФункции