Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TDD plugins. УтвержденияПроверкаТаблиц - необходимо проверять оформление ячеек #1150

Open
wants to merge 7 commits into
base: develop
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,18 @@
- `ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям( ТаблицаОжиданий, ТаблицаРезультатов, ФлагУчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки = Истина, Знач ДопСообщениеОшибки = "" )`
- Параметры:
- **ФлагУчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки**- если строка, то используется как строка с ожидаемым исключением. Иначе это флаг/булево для учета только видимых колонок

- `ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям( ТаблицаОжиданий, ТаблицаРезультатов, ЭлементыПроверить = Неопределено)`
- Параметры:
- **ЭлементыПроверить**- Массив элементов для проверки. Если не заполнен, то проверка идет только по значениям как и ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям.

```bsl
ЭлементыПроверить = Новый Массив;
// по значению
ЭлементыПроверить.Добавить("Текст");
// оформление
ЭлементыПроверить.Добавить("РазмещениеТекста");
ЭлементыПроверить.Добавить("ЦветФона");
ЭлементыПроверить.Добавить("ЦветТекста");
ЭлементыПроверить.Добавить("Шрифт");
```
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@
Для Каждого КлючЗначение Из РезультатыСравненияТаблиц Цикл
ИменаРезультатов.Вставить(КлючЗначение.Значение, КлючЗначение.Ключ);
КонецЦикла;

СтрокаОшибок = "Различия в таблицах:" + Символы.ПС;
СтрокаОшибок = СтрокаОшибок + "Ожидали статус <" + ИменаРезультатов[РезультатыСравненияТаблиц.ТаблицыСовпадают] + ">, а получили <" + ИменаРезультатов[РезультатСравнения] + ">" + Символы.ПС;
Для Каждого Строка Из Различия Цикл
СтрокаОшибок = СтрокаОшибок + "Значение [" + Строка.Колонка + ":" + Строка.Строка + "]. Ожидали <" + Строка.Ожидание + ">, а получили <" + Строка.Результат + ">" + Символы.ПС;
СтрокаОшибок = СтрокаОшибок + "Значение [" + Строка.Колонка + ":" + Строка.Строка + "]. Ожидали <" + Строка.Ожидание + ">, а получили <" + Строка.Результат + ">" + Символы.ПС;
КонецЦикла;

ВызватьОшибкуПроверки("Таблицы должны совпадать, а они различны" + Символы.ПС + СтрокаОшибок + Символы.ПС + ДопСообщениеОшибки);
Expand Down Expand Up @@ -440,10 +441,182 @@
Возврат Новый ФиксированнаяСтруктура(СтатусыРезультатаТестирования);
КонецФункции

// По умолчанию проверяет как и ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям - по значениям.
//
// Параметры:
// ТабДок1 - ТабличныйДокумент - Первый сравниваемый документ
// ТабДок2 - ТабличныйДокумент - Второй сравниваемый документ
// ЭлементыПроверить - Массив - Элементы для проверки.
// Пример:
// ЭлементыПроверить = Новый Массив;
// // по значению
// ЭлементыПроверить.Добавить("Текст");
// // оформление
// ЭлементыПроверить.Добавить("РазмещениеТекста");
// ЭлементыПроверить.Добавить("ЦветФона");
// ЭлементыПроверить.Добавить("ЦветТекста");
//
Процедура ПроверитьРавенствоТабличныхДокументовПоЭлементам(ТабДок1, ТабДок2, ЭлементыПроверить = Неопределено,
УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки = Ложь, УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки = Ложь,
Знач ДопСообщениеОшибки = "", Знач ДопПараметры = Неопределено) Экспорт

Если ТипЗнч(ТабДок1) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям: Первый параметр-таблица не является табличным документов";
КонецЕсли;
Если ТипЗнч(ТабДок2) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям: Второй параметр-таблица не является табличным документов";
КонецЕсли;
Если ЭлементыПроверить <> Неопределено И ТипЗнч(ЭлементыПроверить) <> Тип("Массив") Тогда
ВызватьИсключение "ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям: Третий параметр-массив не является табличным массивом";
КонецЕсли;

УчитыватьТолькоВидимыеКолонки = Ложь;
Если ТипЗнч(УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки) = Тип("Булево") Тогда
УчитыватьТолькоВидимыеКолонки = УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки;
ИначеЕсли ТипЗнч(УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки) = Тип("Строка") Тогда
ДопСообщениеОшибки = УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки;
КонецЕсли;
УчитыватьТолькоВидимыеСтроки = Ложь;
Если ТипЗнч(УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки) = Тип("Булево") Тогда
УчитыватьТолькоВидимыеСтроки = УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки;
ИначеЕсли ТипЗнч(УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки) = Тип("Строка") Тогда
ДопСообщениеОшибки = УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки;
КонецЕсли;

Элементы = ЭлементыОформленияДляПроверки(ЭлементыПроверить);

КешТаб1 = Новый Соответствие;
КешТаб2 = Новый Соответствие;
Для Каждого Элемент Из Элементы Цикл

Таб1 = ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением(ТабДок1, УчитыватьТолькоВидимыеКолонки, УчитыватьТолькоВидимыеСтроки, Элемент, КешТаб1);
Таб2 = ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением(ТабДок2, УчитыватьТолькоВидимыеКолонки, УчитыватьТолькоВидимыеСтроки, Элемент, КешТаб2);

ПроверитьРавенствоТаблиц(Таб1, Таб2, ДопСообщениеОшибки, ДопПараметры);

КонецЦикла;

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

Функция ЭлементыОформленияДляПроверки(Элементы)

Если Элементы = Неопределено Тогда
Элементы = Новый Массив;
КонецЕсли;
Если Элементы.Количество() = 0 Тогда
Элементы.Добавить("Текст"); // умолчание - по значению =)
КонецЕсли;

Возврат Элементы;

КонецФункции

// вынесен кусок кода в ПодготовитьТаблицуЗначенийИзТабличногоДокумента
Функция ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением(ТабличныйДокумент, УчитыватьТолькоВидимыеКолонки = Ложь, УчитыватьТолькоВидимыеСтроки = Ложь,
Знач ЭлементОформления, КешОбластей) Экспорт

ТипТабличногоДокумента = ТипЗнч(ТабличныйДокумент);
Если ТипТабличногоДокумента <> Тип("ТабличныйДокумент") И ТипТабличногоДокумента <> Тип("ПолеТабличногоДокумента") Тогда
ВызватьИсключение "ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением: Требуется тип ТабличныйДокумент или ПолеТабличногоДокумента";
КонецЕсли;

НомерПоследнейКолонки = ТабличныйДокумент.ШиринаТаблицы;
НомерПоследнейСтроки = ТабличныйДокумент.ВысотаТаблицы;

НоваяТаблицаЗначений = Неопределено;
УчитываемыеКолонки = Неопределено;

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

ГраницаКолонок = УчитываемыеКолонки.ВГраница();
Для НомерСтроки = 1 По НомерПоследнейСтроки Цикл

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

НоваяСтрока = НоваяТаблицаЗначений.Добавить();

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

ДобавитьДанныеОбласти(НоваяСтрока, Индекс, Область, ЭлементОформления);

КонецЦикла;
КонецЦикла;

Возврат НоваяТаблицаЗначений;

КонецФункции

// Функция - Уникальный ключ области из расчета до 500 колонок в таблице
//
Функция КлючОбласти(НомерСтроки, НомерКолонки, МаксКолонок = 500)
Ключ = (НомерСтроки -1) * МаксКолонок + НомерКолонки;
Возврат Ключ;
КонецФункции

// можно использовать в ПолучитьТаблицуЗначенийИзТабличногоДокумента
Процедура ПодготовитьТаблицуЗначенийИзТабличногоДокумента(НоваяТаблицаЗначений, УчитываемыеКолонки, Знач НомерПоследнейКолонки, Знач ТабличныйДокумент, Знач УчитыватьТолькоВидимыеКолонки)

Перем ИмяКолонки, Колонки, НомерКолонки, ОбластьКолонки, ТипСтрока, УчитыватьКолонку, ШиринаКолонки;

НоваяТаблицаЗначений = Новый ТаблицаЗначений;
Колонки = НоваяТаблицаЗначений.Колонки;
ТипСтрока = Новый ОписаниеТипов("Строка");

// TODO При определении видимости не учитывается наличие нескольких форматов строк, сейчас видимоcть колонки определяется по формату первой строки
УчитываемыеКолонки = Новый Массив;
Для НомерКолонки = 1 По НомерПоследнейКолонки Цикл
ОбластьКолонки = ТабличныйДокумент.Область(0, НомерКолонки, 1, НомерКолонки);

УчитыватьКолонку = Не УчитыватьТолькоВидимыеКолонки Или ОбластьКолонки.Видимость;
Если УчитыватьКолонку Тогда
УчитываемыеКолонки.Добавить(НомерКолонки);
ШиринаКолонки = ОбластьКолонки.ШиринаКолонки;
Если ШиринаКолонки <= 1 Тогда
ШиринаКолонки = 1;
КонецЕсли;
ИмяКолонки = "К" + Формат(Колонки.Количество() + 1, "ЧН=; ЧГ=0");
Колонки.Добавить(ИмяКолонки, ТипСтрока, ИмяКолонки, ШиринаКолонки);
КонецЕсли;
КонецЦикла;

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

Процедура ДобавитьДанныеОбласти(НоваяСтрока, Индекс, Знач Область, Знач ЭлементОформления)

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

НоваяСтрока[Индекс] = Значение;

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

РезультатыСравненияТаблиц = Новый Структура;
РезультатыСравненияТаблиц.Вставить("ТаблицыСовпадают", 0);
РезультатыСравненияТаблиц.Вставить("НеСовпадаютЗначенияВЯчейкеТаблицы", 1);
РезультатыСравненияТаблиц.Вставить("РазноеКоличествоСтрок", 2);
РезультатыСравненияТаблиц.Вставить("РазличаютсяКолонки", 3);
РезультатыСравненияТаблиц = Новый ФиксированнаяСтруктура(РезультатыСравненияТаблиц);
ЭтоLinux = Ложь;
ЭтоLinux = Ложь;
Loading