Skip to content

Commit

Permalink
УтвержденияТаблиц (#11)
Browse files Browse the repository at this point in the history
* рабочая проверка равенства

* накидал СодержитСтроку и тесты

* позеленело. только фоновые падают

* позеленело. только фоновые падают

* только фоновые красные

* поправил зависимость от asserts

---------

Co-authored-by: Голованов Сергей <[email protected]>
  • Loading branch information
Golovanoff and Голованов Сергей authored Dec 6, 2024
1 parent 273eda8 commit 5d41f58
Show file tree
Hide file tree
Showing 3 changed files with 373 additions and 2 deletions.
208 changes: 207 additions & 1 deletion src/bdd-asserts-class.os
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
Перем ФлагОтрицания;
Перем ФлагОтрицанияДляСообщения;
Перем СтатусыРезультатаТестирования;
Перем ПараметрыСравненияТаблиц;

Функция Что(Знач ПроверяемоеЗначениеПараметр, Знач Сообщение = "") Экспорт
ПроверяемоеЗначение = ПроверяемоеЗначениеПараметр;
Expand All @@ -24,6 +25,11 @@
СтатусыРезультатаТестирования.Вставить("ОшибкаПроверки", "Failed");
СтатусыРезультатаТестирования.Вставить("НеизвестнаяОшибка", "Broken");
СтатусыРезультатаТестирования.Вставить("ТестПропущен", "Pending");

ПараметрыСравненияТаблиц = Новый Структура;
ПараметрыСравненияТаблиц.Вставить("УчитыватьПорядокСтрок", Истина);
ПараметрыСравненияТаблиц.Вставить("УчитыватьПорядокКолонок", Истина);
ПараметрыСравненияТаблиц.Вставить("УчитыватьИменаКолонок", Истина);
КонецПроцедуры

Функция Не_() Экспорт
Expand Down Expand Up @@ -301,6 +307,74 @@
Возврат ЭтотОбъект;
КонецФункции

Функция РавнаТаблице(Знач ОжидаемоеЗначение, Знач СравнитьТолькоСТруктуру = Ложь) Экспорт

Различия = РазличияТаблиц(ПроверяемоеЗначение, ОжидаемоеЗначение, СравнитьТолькоСТруктуру);


ВсеОК = Различия.Количество() = 0;
ВсеОК = ?(ФлагОтрицания, Не ВсеОК, ВсеОК);

ФлагОтрицанияДляСообщения = ФлагОтрицания;
ФлагОтрицания = Ложь;

Если Не ВсеОК Тогда
СообщениеОшибки = СформироватьСообщениеОбОшибке(ПроверяемоеЗначение, "РАВНО (" + ОжидаемоеЗначение + ").
|Различия таблиц:");

Для Каждого Различие Из Различия Цикл
СообщениеОшибки = СтрШаблон("%1%2[%3:%4]: ожидали <%5>, а получили <%6>", СообщениеОшибки, Символы.ПС,
Различие.Строка, Различие.Колонка, Различие.Ожидание, Различие.Результат);
КонецЦикла;
ВызватьОшибкуПроверки(СообщениеОшибки);
КонецЕсли;

Возврат ЭтотОбъект;
КонецФункции

Функция ИмеетРавнуюСтруктуруСТаблицей(Знач ОжидаемоеЗначение) Экспорт
Возврат РавнаТаблице(ОжидаемоеЗначение, Истина);
КонецФункции

Функция СодержитСтрокуТаблицы(Знач ОжидаемоеЗначение) Экспорт

СтруктураПоиска = Новый Структура(СтрСоединить(ИменаКолонок(ПроверяемоеЗначение), ","));
ЗаполнитьЗначенияСвойств(СтруктураПоиска, ОжидаемоеЗначение);

НайденныеСтроки = ПроверяемоеЗначение.НайтиСтроки(СтруктураПоиска);

ВсеОК = НайденныеСтроки.Количество() = 1;
ВсеОК = ?(ФлагОтрицания, Не ВсеОК, ВсеОК);

ФлагОтрицанияДляСообщения = ФлагОтрицания;
ФлагОтрицания = Ложь;

Если Не ВсеОК Тогда
СообщениеОшибки = СформироватьСообщениеОбОшибке(ПроверяемоеЗначение, "СОДЕРЖИТ нужную строку.");
ВызватьОшибкуПроверки(СообщениеОшибки);
КонецЕсли;

Возврат ЭтотОбъект;
КонецФункции

Функция БезУчетаПорядкаСтрок() Экспорт
ПараметрыСравненияТаблиц.Вставить("УчитыватьПорядокСтрок", Ложь);

Возврат ЭтотОбъект;
КонецФункции

Функция БезУчетаПорядкаКолонок() Экспорт
ПараметрыСравненияТаблиц.Вставить("УчитыватьПорядокКолонок", Ложь);

Возврат ЭтотОбъект;
КонецФункции

Функция БезУчетаИменКолонок() Экспорт
ПараметрыСравненияТаблиц.Вставить("УчитыватьИменаКолонок", Ложь);

Возврат ЭтотОбъект;
КонецФункции

// { Helpers
Функция ФорматДСО(Знач ДопСообщениеОшибки)
Если ДопСообщениеОшибки = "" Тогда
Expand Down Expand Up @@ -349,6 +423,139 @@
КонецПопытки
КонецПроцедуры

Функция РазличияТаблиц(Знач ПроверяемоеЗначение, Знач ОжидаемоеЗначение, Знач СравнитьТолькоСтруктуру = Ложь)

Различия = ПустаяТаблицаРазличийТаблиц();

Если Не ТипЗнч(ОжидаемоеЗначение) = Тип("ТаблицаЗначений") Тогда
Различие = РазличиеТаблиц("ОЖИДАЕМОЕ значение", "Тип значения", "ТаблицаЗначений", ТипЗнч(ОжидаемоеЗначение));
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;
Если Не ТипЗнч(ПроверяемоеЗначение) = Тип("ТаблицаЗначений") Тогда
Различие = РазличиеТаблиц("ПРОВЕРЯЕМОЕ значение", "Тип значения", "ТаблицаЗначений", ТипЗнч(ПроверяемоеЗначение));
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;

Если Различия.Количество() > 0 Тогда
Возврат Различия;
КонецЕсли;

Если Не ОжидаемоеЗначение.Колонки.Количество() = ПроверяемоеЗначение.Колонки.Количество() Тогда
Различие = РазличиеТаблиц("ПРОВЕРЯЕМОЕ значение", "Количество КОЛОНОК", ОжидаемоеЗначение.Колонки.Количество(), ПроверяемоеЗначение.Колонки.Количество());
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;

Если ПараметрыСравненияТаблиц.УчитыватьИменаКолонок Тогда
Для Кол = 0 По ОжидаемоеЗначение.Колонки.Количество() - 1 Цикл
КолонкаОжидания = ОжидаемоеЗначение.Колонки[Кол];
КолонкаПроверяемого = ?(ПараметрыСравненияТаблиц.УчитыватьПорядокКолонок,
ПроверяемоеЗначение.Колонки[Кол],
ПроверяемоеЗначение.Колонки.Найти(КолонкаОжидания.Имя));
Если КолонкаПроверяемого = Неопределено Или Не КолонкаОжидания.Имя = КолонкаПроверяемого.Имя Тогда
Различие = РазличиеТаблиц("ПРОВЕРЯЕМОЕ значение", "Колонки",
СтрШаблон("колонку ""%1""", КолонкаОжидания.Имя),
?(КолонкаПроверяемого = Неопределено,
"<ОТСУТСТВУЕТ>",
СтрШаблон("колонку ""%1""", КолонкаПроверяемого.Имя)));
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;
КонецЦикла;

Для Кол = 0 По ПроверяемоеЗначение.Колонки.Количество() - 1 Цикл
КолонкаПроверяемого = ПроверяемоеЗначение.Колонки[Кол];
КолонкаОжидания = ?(ПараметрыСравненияТаблиц.УчитыватьПорядокКолонок,
ОжидаемоеЗначение.Колонки[Кол],
ОжидаемоеЗначение.Колонки.Найти(КолонкаПроверяемого.Имя));
Если КолонкаОжидания = Неопределено Или Не КолонкаОжидания.Имя = КолонкаПроверяемого.Имя Тогда
Различие = РазличиеТаблиц("ОЖИДАЕМОЕ значение", "Колонки",
?(КолонкаОжидания = Неопределено,
"<ОТСУТСТВУЕТ>",
СтрШаблон("колонку ""%1""", КолонкаОжидания.Имя)),
СтрШаблон("колонку ""%1""", КолонкаПроверяемого.Имя));
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;
КонецЦикла;
КонецЕсли;

Если СравнитьТолькоСтруктуру Тогда
Возврат Различия;
КонецЕсли;

Если Не ОжидаемоеЗначение.Количество() = ПроверяемоеЗначение.Количество() Тогда
Различие = РазличиеТаблиц("ПРОВЕРЯЕМОЕ значение", "Количество СТРОК", ОжидаемоеЗначение.Количество(), ПроверяемоеЗначение.Количество());
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;

Таб1 = ПроверяемоеЗначение.Скопировать();
Таб2 = ОжидаемоеЗначение.Скопировать();

Если Не ПараметрыСравненияТаблиц.УчитыватьПорядокСтрок Тогда
Таб1 = ОтсортироватьТаблицуПоВсемКолонкам(Таб1);
Таб2 = ОтсортироватьТаблицуПоВсемКолонкам(Таб2);
КонецЕсли;

Для Стр = 0 По Таб1.Количество() - 1 Цикл
Для Кол = 0 По Таб1.Колонки.Количество() - 1 Цикл
Результат = Таб1[Стр][Кол];
Если ПараметрыСравненияТаблиц.УчитыватьИменаКолонок
И Не ПараметрыСравненияТаблиц.УчитыватьПорядокКолонок
Тогда
КолонкаТаб1 = Таб1.Колонки[Кол];
КолонкаТаб2 = Таб2.Колонки.Найти(КолонкаТаб1.Имя);
Ожидание = Таб2[Стр][КолонкаТаб2];
Иначе
Ожидание = Таб2[Стр][Кол];
КонецЕсли;
Если Не Ожидание = Результат Тогда
Различие = РазличиеТаблиц(Стр, Кол, Ожидание, Результат);
ЗаполнитьЗначенияСвойств(Различия.Добавить(), Различие);
КонецЕсли;
КонецЦикла;
КонецЦикла;

Возврат Различия;
КонецФункции

Функция ПустаяТаблицаРазличийТаблиц()

Различия = Новый ТаблицаЗначений;
Различия.Колонки.Добавить("Строка");
Различия.Колонки.Добавить("Колонка");
Различия.Колонки.Добавить("Ожидание");
Различия.Колонки.Добавить("Результат");

Возврат Различия;
КонецФункции

Функция РазличиеТаблиц(Знач Строка = "", Знач Колонка = "", Знач Ожидание = "", Знач Результат = "")

Различие = ПустаяТаблицаРазличийТаблиц().Добавить();
Различие.Строка = Строка;
Различие.Колонка = Колонка;
Различие.Ожидание = Ожидание;
Различие.Результат = Результат;

Возврат Различие;
КонецФункции

Функция ОтсортироватьТаблицуПоВсемКолонкам(Знач ТЗ)

ИменаКолонок = СтрСоединить(ИменаКолонок(ТЗ), ",");
ТЗ.Сортировать(ИменаКолонок);

Возврат ТЗ;
КонецФункции

Функция ИменаКолонок(Знач ТЗ)

ИменаКолонок = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
ИменаКолонок.Добавить(Колонка.Имя);
КонецЦикла;

Возврат ИменаКолонок;
КонецФункции

Функция ЛогическоеВыражениеВерно(Знач ЛогическоеВыражение)
Результат = ФлагОтрицания <> ЛогическоеВыражение;
ФлагОтрицанияДляСообщения = ФлагОтрицания;
Expand Down Expand Up @@ -428,4 +635,3 @@
КонецФункции

// } Helpers

Loading

0 comments on commit 5d41f58

Please sign in to comment.