1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-20 18:48:36 +02:00
Проверка коллекции на содержание предиката
This commit is contained in:
alkoleft 2023-10-27 01:40:30 +03:00
parent 65486d65df
commit 132850b512
3 changed files with 128 additions and 22 deletions

View File

@ -99,28 +99,17 @@
Представления = Новый Массив();
Предикаты = НаборПредикатов(Предикаты);
ИмяРеквизита = Неопределено;
Для Каждого Выражение Из Предикаты Цикл
Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства));
НеДобавлятьИмяРеквизита = ИмяРеквизита = Выражение.ИмяРеквизита;
ИмяРеквизита = Выражение.ИмяРеквизита;
Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства, НеДобавлятьИмяРеквизита));
КонецЦикла;
Возврат СтрСоединить(Представления, Разделитель);
КонецФункции
Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства) Экспорт
Если ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда
ПроверяемоеЗначение = "";
Иначе
ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " ";
КонецЕсли;
Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение);
Возврат СтрШаблон("%1%2", ПроверяемоеЗначение, Выражение);
КонецФункции
Функция ШаблонВыражения(Знач Выражение) Экспорт
Отрицание = СтрНачинаетсяС(Выражение, "Не");
@ -206,6 +195,20 @@
#Область СлужебныеПроцедурыИФункции
Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства, НеДобавлятьИмяРеквизита)
Если НеДобавлятьИмяРеквизита ИЛИ ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда
ПроверяемоеЗначение = "";
Иначе
ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " ";
КонецЕсли;
Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение);
Возврат СтрШаблон("%1%2", ПроверяемоеЗначение, Выражение);
КонецФункции
Функция ЭтоПредикатОбщийМодуль(ТипПредикатов, Предикаты)
Возврат ТипПредикатов = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты;

View File

@ -578,18 +578,25 @@
// - ФиксированныйМассив - по наличию равного значения
// - ФиксированнаяСтруктура - по наличию равного значения
// - ФиксированноеСоответствие - по наличию равного значения
// - Произвольный итерируемый объект для проверки на соответствие предикату
//
// При сравнении также проверяется совпадение типов
//
// Параметры:
// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) содержит указанное значение
// - см. ЮТест.Предикат - Модуль настройки предикатов, см. ЮТест.Предикат
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция Содержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
ПроверитьПредикат(ЮТПредикаты.Выражения().Содержит, ОжидаемоеЗначение, ОписаниеПроверки);
Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ОжидаемоеЗначение) Тогда
ПроверитьСодержаниеПредиката(ОжидаемоеЗначение, ОписаниеПроверки, Ложь);
Иначе
ПроверитьПредикат(ЮТПредикаты.Выражения().Содержит, ОжидаемоеЗначение, ОписаниеПроверки);
КонецЕсли;
Возврат ЮТУтверждения;
КонецФункции
@ -606,18 +613,25 @@
// - ФиксированныйМассив - по отсутствию равного значения
// - ФиксированнаяСтруктура - по отсутствию равного значения
// - ФиксированноеСоответствие - по отсутствию равного значения
// - Произвольный итерируемый объект для проверки на соответствие предикату
//
// При сравнении также проверяется совпадение типов
//
// Параметры:
// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) НЕ содержит указанное
// - см. ЮТест.Предикат - Модуль настройки предикатов, см. ЮТест.Предикат
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
ПроверитьПредикат(ЮТПредикаты.Выражения().НеСодержит, ОжидаемоеЗначение, ОписаниеПроверки);
Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ОжидаемоеЗначение) Тогда
ПроверитьСодержаниеПредиката(ОжидаемоеЗначение, ОписаниеПроверки, Истина);
Иначе
ПроверитьПредикат(ЮТПредикаты.Выражения().НеСодержит, ОжидаемоеЗначение, ОписаниеПроверки);
КонецЕсли;
Возврат ЮТУтверждения;
КонецФункции
@ -1836,15 +1850,51 @@
Иначе
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(Сообщение);
КонецЕсли;
КонецЦикла;
ВызватьИсключение "Провальный результат проверки не содержит сообщения";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСодержаниеПредиката(Предикат, ОписаниеПроверки, Реверс)
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
ПараметрыСообщенийОбОшибке = ПараметрыСообщенийОбОшибке(ПроверяемоеЗначение, ОписаниеПроверки);
Успешно = Ложь;
Для Каждого Элемент Из ПроверяемоеЗначение Цикл
РезультатПроверки = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Элемент, Предикат, ПараметрыСообщенийОбОшибке);
Если РезультатПроверки.Успешно Тогда
Успешно = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Реверс Тогда
Успешно = НЕ Успешно;
КонецЕсли;
Если НЕ Успешно Тогда
Сообщение = "содержит элемент, значение которого " + ЮТПредикатыКлиентСервер.ПредставлениеПредикатов(Предикат, " и ");
Если Реверс Тогда
Сообщение = "не " + Сообщение;
КонецЕсли;
СгенерироватьОшибкуУтверждения(Сообщение, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -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`");
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ОшибкаУтверждения(ПроверяемоеЗначение, Утверждение, Параметр)
Параметры = ЮТОбщий.ЗначениеВМассиве(Параметр);
ЮТест.ОжидаетЧто(ПроверяемоеЗначение);
Ошибка = ЮТОбщий.ВыполнитьМетод("ЮТУтверждения." + Утверждение, Параметры);
Возврат Ошибка;
КонецФункции
Процедура ПроверитьОшибкуУтверждения(ИнформацияОбОшибке, ОжидаемоеОписание)
Если ИнформацияОбОшибке = Неопределено Тогда