diff --git "a/doc/xdd/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260-\321\202\320\260\320\261\320\273\320\270\321\206-\320\270-\321\202\320\260\320\261\320\273\320\270\321\207\320\275\321\213\321\205-\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.MD" "b/doc/xdd/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260-\321\202\320\260\320\261\320\273\320\270\321\206-\320\270-\321\202\320\260\320\261\320\273\320\270\321\207\320\275\321\213\321\205-\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.MD" index c938db844..3cc0960fb 100644 --- "a/doc/xdd/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260-\321\202\320\260\320\261\320\273\320\270\321\206-\320\270-\321\202\320\260\320\261\320\273\320\270\321\207\320\275\321\213\321\205-\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.MD" +++ "b/doc/xdd/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260-\321\202\320\260\320\261\320\273\320\270\321\206-\320\270-\321\202\320\260\320\261\320\273\320\270\321\207\320\275\321\213\321\205-\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.MD" @@ -19,3 +19,18 @@ - `ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям( ТаблицаОжиданий, ТаблицаРезультатов, ФлагУчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки = Истина, Знач ДопСообщениеОшибки = "" )` - Параметры: - **ФлагУчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки**- если строка, то используется как строка с ожидаемым исключением. Иначе это флаг/булево для учета только видимых колонок + +- `ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям( ТаблицаОжиданий, ТаблицаРезультатов, ЭлементыПроверить = Неопределено)` + - Параметры: + - **ЭлементыПроверить**- Массив элементов для проверки. Если не заполнен, то проверка идет только по значениям как и ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям. + +```bsl +ЭлементыПроверить = Новый Массив; +// по значению +ЭлементыПроверить.Добавить("Текст"); +// оформление +ЭлементыПроверить.Добавить("РазмещениеТекста"); +ЭлементыПроверить.Добавить("ЦветФона"); +ЭлементыПроверить.Добавить("ЦветТекста"); +ЭлементыПроверить.Добавить("Шрифт"); +``` \ No newline at end of file diff --git "a/plugins/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" "b/plugins/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" index 0226324b5..e004ff46f 100644 --- "a/plugins/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" +++ "b/plugins/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" @@ -33,10 +33,11 @@ Для Каждого КлючЗначение Из РезультатыСравненияТаблиц Цикл ИменаРезультатов.Вставить(КлючЗначение.Значение, КлючЗначение.Ключ); КонецЦикла; + СтрокаОшибок = "Различия в таблицах:" + Символы.ПС; СтрокаОшибок = СтрокаОшибок + "Ожидали статус <" + ИменаРезультатов[РезультатыСравненияТаблиц.ТаблицыСовпадают] + ">, а получили <" + ИменаРезультатов[РезультатСравнения] + ">" + Символы.ПС; Для Каждого Строка Из Различия Цикл - СтрокаОшибок = СтрокаОшибок + "Значение [" + Строка.Колонка + ":" + Строка.Строка + "]. Ожидали <" + Строка.Ожидание + ">, а получили <" + Строка.Результат + ">" + Символы.ПС; + СтрокаОшибок = СтрокаОшибок + "Значение [" + Строка.Колонка + ":" + Строка.Строка + "]. Ожидали <" + Строка.Ожидание + ">, а получили <" + Строка.Результат + ">" + Символы.ПС; КонецЦикла; ВызватьОшибкуПроверки("Таблицы должны совпадать, а они различны" + Символы.ПС + СтрокаОшибок + Символы.ПС + ДопСообщениеОшибки); @@ -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 = Ложь; \ No newline at end of file diff --git "a/tests/xunit/Plugins/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" "b/tests/xunit/Plugins/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" index 8a945dda1..84a55b259 100644 --- "a/tests/xunit/Plugins/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" +++ "b/tests/xunit/Plugins/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/\320\242\320\265\321\201\321\202\321\213\320\237\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214\320\240\320\260\320\262\320\265\320\275\321\201\321\202\320\262\320\276\320\242\320\260\320\261\320\273\320\270\321\206/Ext/ObjectModule.bsl" @@ -22,6 +22,10 @@ НаборТестов.Добавить("ТестДолжен_ПроверитьРавенствоТаблиц_НечеткоеСравнение"); НаборТестов.Добавить("ТестДолжен_ПроверитьНеРавенствоТаблиц_НечеткоеСравнение"); + НаборТестов.Добавить("Тест_ДолженПроверитьНеРавенствоТабличныхДокументовПоЭлементам"); + НаборТестов.Добавить("Тест_ДолженПроверитьРавенствоТабличныхДокументовПоЭлементам"); + + КонецПроцедуры //} @@ -245,4 +249,47 @@ КонецПроцедуры +Процедура Тест_ДолженПроверитьНеРавенствоТабличныхДокументовПоЭлементам() Экспорт + + Макет1 = ПолучитьМакет("СозданиеОдногоПользователяИБ"); + Макет2 = ПолучитьМакет("СозданиеОдногоПользователяИБ_УФ"); + + ЭлементыПроверить = Новый Массив; + ЭлементыПроверить.Добавить("РазмещениеТекста"); + + Макет2.Область(1,1,1,1).РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить; + + БылоИсключение = Ложь; + Попытка + УтвержденияПроверкаТаблиц.ПроверитьРавенствоТабличныхДокументовПоЭлементам(Макет1, Макет2, ЭлементыПроверить, "Таблицы 1 и 2 не должны совпадать, а они одинаковы!"); + Исключение + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + БылоИсключение = Истина; + КонецПопытки; + Утверждения.Проверить(БылоИсключение, "Должны были получить исключение из-за неравенства таблиц, а его не было"); + + СтрокаОшибки = + "Таблицы должны совпадать, а они различны + |Различия в таблицах: + |Ожидали статус <ТаблицыСовпадают>, а получили <НеСовпадаютЗначенияВЯчейкеТаблицы> + |Значение [К1:1]. Ожидали <РазмещениеТекста=Авто>, а получили <РазмещениеТекста=Переносить> + |"; + + Утверждения.ПроверитьВхождение(Ошибка, СтрокаОшибки, "Должны были получить исключение из-за неравенства таблиц, а его не было"); + +КонецПроцедуры + +Процедура Тест_ДолженПроверитьРавенствоТабличныхДокументовПоЭлементам() Экспорт + + Макет1 = ПолучитьМакет("СозданиеОдногоПользователяИБ_УФ"); + Макет2 = Новый ТабличныйДокумент; + Макет2.Вывести(ПолучитьМакет("СозданиеОдногоПользователяИБ_УФ")); + + ЭлементыПроверить = Новый Массив; + ЭлементыПроверить.Добавить("РазмещениеТекста"); + + УтвержденияПроверкаТаблиц.ПроверитьРавенствоТабличныхДокументовПоЭлементам(Макет1, Макет2, ЭлементыПроверить, "Таблицы 1 и 2 должны совпадать, а они различны!"); + +КонецПроцедуры + //}