1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-08 13:06:32 +02:00

Merge pull request #149 from Daabramov/feature/138-regex

Поддержка проверки строки по регулярке
This commit is contained in:
Koryakin Aleksey 2023-09-03 22:44:12 +03:00 committed by GitHub
commit 6faa36e111
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 231 additions and 2 deletions

View File

@ -40,6 +40,19 @@
КонецФункции
// Возвращает внешнюю компоненту, реализующую функциональность регулярных выражений
// Подробнее с документацией можно ознакомиться по ссылке: https://github.com/alexkmbk/RegEx1CAddin
//
// Возвращаемое значение:
// ВнешнийОбъект
Функция РегулярныеВыражения() Экспорт
Компонента = СоздатьКомпоненту(ОписаниеКомпонентыРегулярныхВыражений());
Компонента.ВызыватьИсключения = Истина;
Возврат Компонента;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
@ -90,6 +103,16 @@
КонецФункции
// Описание компоненты реализующей функциональность регулярных выражений.
//
// Возвращаемое значение:
// см. ОписаниеКомпоненты
Функция ОписаниеКомпонентыРегулярныхВыражений() Экспорт
Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТRegEx1CAddin", "RegEx1CAddin", "RegEx");
КонецФункции
// Описание внешней компоненты.
//
// Параметры:

View File

@ -22,6 +22,7 @@
ПараметрыТихойУстановки = ПараметрыТихойУстановки();
ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыПауза());
ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыРегулярныхВыражений());
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
ЭтотОбъект,

View File

@ -267,6 +267,34 @@
КонецФункции
// Добавляет предикат, проверяющий, что строка соответствует указанному регулярному выражению
//
// Параметры:
// Значение - Строка
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция СоответствуетШаблону(Значение) Экспорт
ДобавитьПредикат(Выражения().СоответствуетШаблону, Значение);
Возврат ЮТПредикаты;
КонецФункции
// Добавляет предикат, проверяющий, что строка не соответствует указанному регулярному выражению
//
// Параметры:
// Значение - Строка
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСоответствуетШаблону(Значение) Экспорт
ДобавитьПредикат(Выражения().НеСоответствуетШаблону, Значение);
Возврат ЮТПредикаты;
КонецФункции
// Возвращает набор сформированных утверждений.
//
// Рекомендуется использовать этот метод, если планируется отложенная проверка предикатов. Например, вы хотите сформировать два набору предикатов
@ -316,7 +344,9 @@
Выражения.Вставить("НеИмеетСвойство", "НеИмеетСвойство");
Выражения.Вставить("Содержит", "Содержит");
Выражения.Вставить("НеСодержит", "НеСодержит");
Выражения.Вставить("СоответствуетШаблону", "СоответствуетШаблону");
Выражения.Вставить("НеСоответствуетШаблону", "НеСоответствуетШаблону");
Возврат Новый ФиксированнаяСтруктура(Выражения);
КонецФункции

View File

@ -151,6 +151,8 @@
Шаблон = "содержит свойство `%1`";
ИначеЕсли Выражение = Выражения.Содержит Тогда
Шаблон = "содержит `%1`";
ИначеЕсли Выражение = Выражения.СоответствуетШаблону Тогда
Шаблон = "соответствует регулярному выражению `%1`";
Иначе
ВызватьИсключение "Не описан шаблон сообщения для выражения предиката " + Выражение;
КонецЕсли;
@ -278,7 +280,11 @@
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Содержит Тогда
ЮТСравнениеКлиентСервер.ПроверитьСодержит(СтатусПроверки, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.СоответствуетШаблону Тогда
ЮТСравнениеКлиентСервер.ПроверитьСоответствуетШаблону(СтатусПроверки, ПараметрыПроверки);
Иначе
ВызватьИсключение СтрШаблон("Неизвестное выражение предиката `%1`", Выражение.ВидСравнения);

View File

@ -249,6 +249,30 @@
КонецПроцедуры
Процедура ПроверитьСоответствуетШаблону(РезультатПроверки, ПараметрыПроверки) Экспорт
Если НЕ ПроверитьТипЗначения(РезультатПроверки, ПараметрыПроверки.ОжидаемоеЗначение, "Строка") Тогда
Возврат;
КонецЕсли;
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
СоответствуетШаблону = СоответствуетШаблону(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
Если СоответствуетШаблону = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки);
Возврат;
КонецЕсли;
Результат = СоответствуетШаблону;
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
// Параметры проверки.
//
// Параметры:
@ -574,6 +598,24 @@
КонецФункции
Функция СоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение)
Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда
Возврат Неопределено;
КонецЕсли;
РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения();
Попытка
Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение);
Исключение
ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение)
ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение);

View File

@ -696,6 +696,40 @@
КонецФункции
// Проверяет установленное значение Контекста (или его свойство) на соответствие регулярному выражению
//
// Параметры:
// ОжидаемоеЗначение - Строка - Ожидается, что значение Контекста (или его свойство) соответствует этому регулярному выражению
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция СоответствуетШаблону(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьСоответствиеШаблону(Контекст, ОжидаемоеЗначение, Ложь);
Возврат ЮТУтверждения;
КонецФункции
// Проверяет установленное значение Контекста (или его свойство) на несоответствие регулярному выражению
//
// Параметры:
// ОжидаемоеЗначение - Строка - Ожидается, что значение Контекста (или его свойство) НЕ соответствует этому регулярному выражению
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСоответствуетШаблону(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьСоответствиеШаблону(Контекст, ОжидаемоеЗначение, Истина);
Возврат ЮТУтверждения;
КонецФункции
// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции.
//
// Проверка поддерживается для следующих типов проверяемого значения:
@ -1750,6 +1784,25 @@
КонецПроцедуры
Процедура ПроверитьСоответствиеШаблону(Контекст, ОжидаемоеЗначение, Реверс)
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ВыполнитьПроверкуСоответствуетШаблону(ПроверяемоеЗначение, ОжидаемоеЗначение);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Результат = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки, Контекст);
КонецЕсли;
Сообщение = СтрШаблон("соответствует шаблону `%1`", ОжидаемоеЗначение);
ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецПроцедуры
Функция ДлинаПроверяемогоЗначения(Контекст)
Попытка
@ -1932,4 +1985,22 @@
КонецПроцедуры
Функция ВыполнитьПроверкуСоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение)
Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда
Возврат Неопределено;
КонецЕсли;
РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения();
Попытка
Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение);
Исключение
ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки;
КонецПопытки;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6f86b3d9-1e91-4f04-a8b5-47a0117c653d">
<name>ЮТRegEx1CAddin</name>
<synonym>
<key>ru</key>
<value>Reg ex1 c addin</value>
</synonym>
<templateType>AddIn</templateType>
</mdclass:CommonTemplate>

View File

@ -43,6 +43,7 @@
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеИмена_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеОтчества_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТRegEx1CAddin</commonTemplates>
<commonTemplates>CommonTemplate.ЮТYaxUnitAddIn</commonTemplates>
<commonTemplates>CommonTemplate.ЮТОписаниеМетаданных</commonTemplates>
<commonModules>CommonModule.Мокито</commonModules>

View File

@ -81,6 +81,8 @@
.Добавить(Выражения.НеИмеетСвойство, "Число", "не содержит свойство `Число`", "ВложенныйОбъект")
.Добавить(Выражения.Содержит, "4", "содержит `4`", "Строка")
.Добавить(Выражения.НеСодержит, "2", "не содержит `2`", "Строка")
.Добавить(Выражения.СоответствуетШаблону, "\D{3}", "соответствует регулярному выражению `\D{3}`", "Строка")
.Добавить(Выражения.НеСоответствуетШаблону, "\d{3}", "не соответствует регулярному выражению `\d{3}`", "Строка")
;
Для Каждого Вариант Из Варианты.СписокВариантов() Цикл

View File

@ -49,6 +49,8 @@
.ДобавитьТест("НеИмеетТип")
.ДобавитьТест("Содержит")
.ДобавитьТест("НеСодержит")
.ДобавитьТест("СоответствуетШаблону")
.ДобавитьТест("НеСоответствуетШаблону")
.ДобавитьТест("ИмеетДлину")
.ДобавитьТест("НеИмеетДлину")
.ДобавитьТест("ВыбрасываетИсключение")
@ -1358,6 +1360,48 @@
КонецПроцедуры
Процедура СоответствуетШаблону() Экспорт
// Позитивные тесты
ЮТУтверждения.Что("123321")
.СоответствуетШаблону("\d{3}")
.СоответствуетШаблону(".{6}")
;
// Негативные тесты
Попытка
Ошибка = Неопределено;
ЮТУтверждения.Что("123321")
.СоответствуетШаблону(".{7}");
Исключение
Ошибка = ИнформацияОбОшибке();
КонецПопытки;
ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `123321` соответствует шаблону `.{7}`, но это не так");
ПроверитьДанныеОшибкиСравнения("123321", ".{7}");
КонецПроцедуры
Процедура НеСоответствуетШаблону() Экспорт
// Позитивные тесты
ЮТУтверждения.Что("123321")
.НеСоответствуетШаблону("\D{3}")
.НеСоответствуетШаблону(".{7}")
;
// Негативные тесты
Попытка
Ошибка = Неопределено;
ЮТУтверждения.Что("123321")
.НеСоответствуетШаблону(".{6}");
Исключение
Ошибка = ИнформацияОбОшибке();
КонецПопытки;
ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `123321` не соответствует шаблону `.{6}`, но это не так");
ПроверитьДанныеОшибкиСравнения("123321", ".{6}");
КонецПроцедуры
Процедура ИмеетДлину() Экспорт
// Позитивные тесты