Skip to content

Commit

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

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

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

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

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

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

* попилил когнитивку. недостаточно попилил

* вот так вроде всё ок

* чуток оптимизировал по замечанию Артура

* убрал лишние строки

---------

Co-authored-by: Голованов Сергей <[email protected]>
  • Loading branch information
Golovanoff and Голованов Сергей authored Dec 28, 2024
1 parent a0db0f4 commit 3c52f58
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 81 deletions.
199 changes: 119 additions & 80 deletions src/bdd-asserts-class.os
Original file line number Diff line number Diff line change
Expand Up @@ -420,97 +420,31 @@
ТекстИсключения = СтрСоединить(МассивТекстИсключения, Символы.ПС);

ВызватьИсключение ТекстИсключения;
КонецПопытки
КонецПопытки;
КонецПроцедуры

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

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

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

Если Различия.Количество() > 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 @@ -538,6 +472,119 @@
Возврат Различие;
КонецФункции

Функция РазличияТиповТаблиц(Знач Таб1, Знач Таб2)

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

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

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

Функция РазличияКолонокТаблиц(Знач Таб1, Знач Таб2)

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

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

Если Не ПараметрыСравненияТаблиц.УчитыватьИменаКолонок Тогда
Возврат Различия;
КонецЕсли;

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

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

Функция КолонкиТаблицПоИндексу(Знач Таб1, Знач Таб2, Знач ИндексКолонки)

КолонкаТаб1 = Таб1.Колонки[ИндексКолонки];
Если ПоискКолонкиПоИмени() Тогда
КолонкаТаб2 = Таб2.Колонки.Найти(КолонкаТаб1.Имя);
Иначе
КолонкаТаб2 = ?(ИндексКолонки < Таб2.Колонки.Количество(), Таб2.Колонки[ИндексКолонки], Неопределено);
КонецЕсли;

Колонки = Новый Массив;
Колонки.Добавить("Для нумерации с 1");
Колонки.Добавить(КолонкаТаб1);
Колонки.Добавить(КолонкаТаб2);

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

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

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

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

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

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

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

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

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

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

ИменаКолонок = СтрСоединить(ИменаКолонок(ТЗ), ",");
Expand Down Expand Up @@ -568,14 +615,6 @@
Возврат "Ожидали, что проверяемое значение (" + ПроверяемоеЗначение + ")" + ?(ФлагОтрицанияДляСообщения, " НЕ ", " ") + Ожидание + ФорматДСО(ДопСообщениеОшибки);
КонецФункции

// Процедура ЕстьПодстрока(Знач Строка, Знач ПроверяемаяСтрока)
// Если СтрЧислоСтрок(ПроверяемаяСтрока) = 1 Тогда
// ЭтотОбъект.Что(Строка, "Проверяем одиночную строку").Содержит(ПроверяемаяСтрока);
// Иначе
// ПроверитьЧтоМногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Строка, ПроверяемаяСтрока);
// КонецЕсли;
// КонецПроцедуры

Процедура ПроверитьЧтоМногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Знач Строка, Знач Подстрока, ДопСообщениеОшибки = "")
СообщениеОшибки = "";
Нашли = МногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Строка, Подстрока, СообщениеОшибки);
Expand Down
1 change: 0 additions & 1 deletion tests/bdd-assertions-tests.os
Original file line number Diff line number Diff line change
Expand Up @@ -284,5 +284,4 @@
Массив.Добавить("Значение");

Ожидаем.Что(Контекст).Метод("Вставить", Массив).Не_().ВыбрасываетИсключение("Недостаточно фактических параметров");

КонецПроцедуры

0 comments on commit 3c52f58

Please sign in to comment.