From 132850b512551dc7a8860a4aa8b2b0e646d6552c Mon Sep 17 00:00:00 2001 From: alkoleft Date: Fri, 27 Oct 2023 01:40:30 +0300 Subject: [PATCH] #179 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверка коллекции на содержание предиката --- .../ЮТПредикатыКлиентСервер/Module.bsl | 33 +++++----- .../CommonModules/ЮТУтверждения/Module.bsl | 64 +++++++++++++++++-- .../CommonModules/ОМ_ЮТУтверждения/Module.bsl | 53 +++++++++++++++ 3 files changed, 128 insertions(+), 22 deletions(-) diff --git a/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl index 0718cb0d..177d075a 100644 --- a/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl @@ -99,28 +99,17 @@ Представления = Новый Массив(); Предикаты = НаборПредикатов(Предикаты); + ИмяРеквизита = Неопределено; Для Каждого Выражение Из Предикаты Цикл - Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства)); + НеДобавлятьИмяРеквизита = ИмяРеквизита = Выражение.ИмяРеквизита; + ИмяРеквизита = Выражение.ИмяРеквизита; + Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства, НеДобавлятьИмяРеквизита)); КонецЦикла; Возврат СтрСоединить(Представления, Разделитель); КонецФункции -Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства) Экспорт - - Если ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда - ПроверяемоеЗначение = ""; - Иначе - ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " "; - КонецЕсли; - - Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение); - - Возврат СтрШаблон("%1%2", ПроверяемоеЗначение, Выражение); - -КонецФункции - Функция ШаблонВыражения(Знач Выражение) Экспорт Отрицание = СтрНачинаетсяС(Выражение, "Не"); @@ -206,6 +195,20 @@ #Область СлужебныеПроцедурыИФункции +Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства, НеДобавлятьИмяРеквизита) + + Если НеДобавлятьИмяРеквизита ИЛИ ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда + ПроверяемоеЗначение = ""; + Иначе + ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " "; + КонецЕсли; + + Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение); + + Возврат СтрШаблон("%1%2", ПроверяемоеЗначение, Выражение); + +КонецФункции + Функция ЭтоПредикатОбщийМодуль(ТипПредикатов, Предикаты) Возврат ТипПредикатов = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты; diff --git a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl index ed61699c..ab8fd756 100644 --- a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl @@ -578,18 +578,25 @@ // - ФиксированныйМассив - по наличию равного значения // - ФиксированнаяСтруктура - по наличию равного значения // - ФиксированноеСоответствие - по наличию равного значения +// - Произвольный итерируемый объект для проверки на соответствие предикату // // При сравнении также проверяется совпадение типов // // Параметры: // ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) содержит указанное значение +// - см. ЮТест.Предикат - Модуль настройки предикатов, см. ЮТест.Предикат // ОписаниеПроверки - Строка - Описание конкретной проверки // // Возвращаемое значение: // ОбщийМодуль - Этот модуль для замыкания Функция Содержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт - ПроверитьПредикат(ЮТПредикаты.Выражения().Содержит, ОжидаемоеЗначение, ОписаниеПроверки); + Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ОжидаемоеЗначение) Тогда + ПроверитьСодержаниеПредиката(ОжидаемоеЗначение, ОписаниеПроверки, Ложь); + Иначе + ПроверитьПредикат(ЮТПредикаты.Выражения().Содержит, ОжидаемоеЗначение, ОписаниеПроверки); + КонецЕсли; + Возврат ЮТУтверждения; КонецФункции @@ -606,18 +613,25 @@ // - ФиксированныйМассив - по отсутствию равного значения // - ФиксированнаяСтруктура - по отсутствию равного значения // - ФиксированноеСоответствие - по отсутствию равного значения +// - Произвольный итерируемый объект для проверки на соответствие предикату // // При сравнении также проверяется совпадение типов // // Параметры: // ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) НЕ содержит указанное +// - см. ЮТест.Предикат - Модуль настройки предикатов, см. ЮТест.Предикат // ОписаниеПроверки - Строка - Описание конкретной проверки // // Возвращаемое значение: // ОбщийМодуль - Этот модуль для замыкания Функция НеСодержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт - ПроверитьПредикат(ЮТПредикаты.Выражения().НеСодержит, ОжидаемоеЗначение, ОписаниеПроверки); + Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ОжидаемоеЗначение) Тогда + ПроверитьСодержаниеПредиката(ОжидаемоеЗначение, ОписаниеПроверки, Истина); + Иначе + ПроверитьПредикат(ЮТПредикаты.Выражения().НеСодержит, ОжидаемоеЗначение, ОписаниеПроверки); + КонецЕсли; + Возврат ЮТУтверждения; КонецФункции @@ -1836,15 +1850,51 @@ Иначе ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(Сообщение); КонецЕсли; - + КонецЦикла; - + ВызватьИсключение "Провальный результат проверки не содержит сообщения"; - + КонецЕсли; - + КонецПроцедуры - + +Процедура ПроверитьСодержаниеПредиката(Предикат, ОписаниеПроверки, Реверс) + + Контекст = Контекст(); + УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст); + + ПараметрыСообщенийОбОшибке = ПараметрыСообщенийОбОшибке(ПроверяемоеЗначение, ОписаниеПроверки); + + Успешно = Ложь; + + Для Каждого Элемент Из ПроверяемоеЗначение Цикл + + РезультатПроверки = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Элемент, Предикат, ПараметрыСообщенийОбОшибке); + Если РезультатПроверки.Успешно Тогда + Успешно = Истина; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если Реверс Тогда + Успешно = НЕ Успешно; + КонецЕсли; + + Если НЕ Успешно Тогда + Сообщение = "содержит элемент, значение которого " + ЮТПредикатыКлиентСервер.ПредставлениеПредикатов(Предикат, " и "); + + Если Реверс Тогда + Сообщение = "не " + Сообщение; + КонецЕсли; + + СгенерироватьОшибкуУтверждения(Сообщение, ПроверяемоеЗначение); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl b/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl index d8da62d1..e371325a 100644 --- a/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl @@ -74,6 +74,8 @@ .ДобавитьТест("СоответствуетПредикату") .ДобавитьТест("КаждыйЭлементСоответствуетПредикату") .ДобавитьТест("ЛюбойЭлементСоответствуетПредикату") + .ДобавитьТест("СодержитПредикат") + .ДобавитьТест("НеСодержитПредикат") ; КонецПроцедуры @@ -2299,10 +2301,61 @@ КонецПроцедуры +Процедура СодержитПредикат() Экспорт + + Структура = Новый Структура("Свойство, Свойство2", 1, 2); + Коллекция = ЮТОбщий.ЗначениеВМассиве("1", 1, Структура); + + ЮТест.ОжидаетЧто(Коллекция) + .Содержит(ЮТест.Предикат().Равно(1), "Предикат из общего модуля") + .Содержит(ЮТест.Предикат().Равно(1).Получить(), "Сохраненный предикат") + .Содержит(ЮТест.Предикат().Реквизит("Свойство").Равно(1), "Проверка свойства") + ; + + Ошибка = ОшибкаУтверждения(Коллекция, "Содержит", ЮТест.Предикат().Равно(2)); + ПроверитьОшибкуУтверждения(Ошибка, "проверяемое значение `Массив` содержит элемент, значение которого равно `2`"); + + Ошибка = ОшибкаУтверждения(Коллекция, "Содержит", ЮТест.Предикат().Реквизит("Свойство").Равно(2)); + ПроверитьОшибкуУтверждения(Ошибка, "элемент, значение которого содержит свойство `Свойство`, которое равно `2`"); + + Ошибка = ОшибкаУтверждения(Коллекция, "Содержит", ЮТест.Предикат().Реквизит("Свойство").Равно(1).ИмеетТип("Строка")); + ПроверитьОшибкуУтверждения(Ошибка, "элемент, значение которого содержит свойство `Свойство`, которое равно `1` и имеет тип `Строка`"); + + ЮТест.ОжидаетЧто(Структура) + .Содержит(ЮТест.Предикат().Реквизит("Ключ").Равно("Свойство2"), "Проверка структуры"); + +КонецПроцедуры + +Процедура НеСодержитПредикат() Экспорт + + Структура = Новый Структура("Свойство, Свойство2", 1, 2); + Коллекция = ЮТОбщий.ЗначениеВМассиве("1", 1, Структура); + + ЮТест.ОжидаетЧто(Коллекция) + .НеСодержит(ЮТест.Предикат().Равно(2), "Предикат из общего модуля") + .НеСодержит(ЮТест.Предикат().Равно(2).Получить(), "Сохраненный предикат") + .НеСодержит(ЮТест.Предикат().Реквизит("Свойство").Равно(2), "Проверка свойства") + ; + + Ошибка = ОшибкаУтверждения(Коллекция, "НеСодержит", ЮТест.Предикат().Равно(1)); + ПроверитьОшибкуУтверждения(Ошибка, "проверяемое значение `Массив` не содержит элемент, значение которого равно `1`"); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции +Функция ОшибкаУтверждения(ПроверяемоеЗначение, Утверждение, Параметр) + + Параметры = ЮТОбщий.ЗначениеВМассиве(Параметр); + + ЮТест.ОжидаетЧто(ПроверяемоеЗначение); + Ошибка = ЮТОбщий.ВыполнитьМетод("ЮТУтверждения." + Утверждение, Параметры); + Возврат Ошибка; + +КонецФункции + Процедура ПроверитьОшибкуУтверждения(ИнформацияОбОшибке, ОжидаемоеОписание) Если ИнформацияОбОшибке = Неопределено Тогда