diff --git a/README.md b/README.md index 50f1e5e..dc94b9c 100644 --- a/README.md +++ b/README.md @@ -351,7 +351,7 @@ OneUnit поддерживает следующие аннотации для н > Обратите внимание, что экземпляр тестового набора всё равно будет создан, если заданный тестовый метод отключен с помощью [условия](#16-условное-выполнение-тестов) (например `&Выключен`, `&ВыключенНаОС`, и т.д) даже если режим жизненного цикла `Компанейский` задан для тестового набора. -Если вы предпочитаете, чтобы OneUnit выполнял все тестовые методы на одном экземпляре тестового набора, аннотируйте конструктор своего тестового набора `&ТестовыйНабор(Характер = "Одиночка")`. При использовании этого режима новый экземпляр тестового набора будет создан только один раз. Таким образом, если ваши тестовые методы полагаются на состояние, хранящееся в переменных экземпляра тестового набора, вам может потребоваться сбросить это состояние в методах `&ПередКаждым` или `&ПослеКаждого` +Режим `&ТестовыйНабор(Характер = "Одиночка")` использует один экземпляр набора для всех его тестовых методов в пределах прогона. Каждый новый прогон создает свой экземпляр. Изменения полей сохраняются между тестами; при необходимости сбрасывайте их в методах `&ПередКаждым` или `&ПослеКаждого`. ### 1.10 Повторяемые тесты diff --git "a/docs/api/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.md" "b/docs/api/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.md" index 8247efe..6c0a555 100644 --- "a/docs/api/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.md" +++ "b/docs/api/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.md" @@ -3,20 +3,19 @@ ## ПриСозданииОбъекта ```bsl -// Аннотация указывает что сценарий является тестовым набором. -// Аннотацию необходимо размещать над конструктором сценария. -// Можно указать способ управления жизненным циклом тестового набора. +// Объявляет сценарий тестовым набором и задает жизненный цикл его экземпляров. +// Размещается над конструктором сценария. // // Параметры: -// Характер - Строка - Характер тестового набора, -// `Одиночка` - если тестовый набор должен быть создан один раз и использоваться для всех тестов. -// `Компанейский` - если тестовый набор должен быть создан для каждого теста. +// Характер - Строка - Режим использования экземпляров набора: +// `Одиночка` - один экземпляр на прогон для всех тестов набора. +// `Компанейский` - отдельный экземпляр для каждого теста. // Значение по умолчанию: `Компанейский` // // Пример: -// // Этот сценарий является тестовым набором одиночкой -// &ТестовыйНабора(Характер = "Одиночка") -// Процедура ПриСозданииОбъекта() Экспорт +// &ТестовыйНабор(Характер = "Одиночка") +// Процедура ПриСозданииОбъекта() +// КонецПроцедуры // -Процедура ПриСозданииОбъекта(Характер = "Компанейский") +Процедура ПриСозданииОбъекта(Характер = "Компанейский") ``` diff --git a/packagedef b/packagedef index 574ac64..bae28e2 100644 --- a/packagedef +++ b/packagedef @@ -25,7 +25,7 @@ .ЗависитОт("atomic", "0.1.1") .ЗависитОт("autumn", "5.0.1") .ЗависитОт("autumn-cli", "1.3.0") - .ЗависитОт("autumn-event-publisher", "1.0.1") + .ЗависитОт("autumn-event-publisher", "1.0.2") .ЗависитОт("autumn-logos", "1.3.3") .ЗависитОт("autumn-mcp", "1.1.2") .ЗависитОт("collectionos", "0.8.4") diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..2f6831f --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,14 @@ +// Мета-аннотация, связывающая аннотацию параметра или поля с поставщиком значения. +// Значения параметров методов разрешаются перед вызовом метода, параметров +// конструктора - перед созданием набора, полей - после проверки условий узла +// и перед выполнением его методов. +// Поставщик должен реализовать функцию Значение(КонтекстЭлемента, КонтекстИсполнения). +// КонтекстЭлемента имеет тип КонтекстПараметра или КонтекстПоля. +// +// Параметры: +// Значение - Строка - Имя желудя-поставщика +// +&Аннотация("ПоставщикЗначения") +&Блестяшка +Процедура ПриСозданииОбъекта(Значение) +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\260.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\260.os" new file mode 100644 index 0000000..ed67364 --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\260.os" @@ -0,0 +1,174 @@ +// Аргументы вызова метода или конструктора тестового набора. +// При создании задаются метаданные метода, позиционные значения и индексы +// заполняемых параметров. Их значения задаются методом Установить. +// Чтение заполняемого параметра до установки значения вызывает исключение. + +#Использовать collectionos + +Перем Метод; // СтрокаТаблицыЗначений - Метаданные вызываемого метода +Перем Позиционные; // ФиксированныйСписок из Произвольный - Позиционные значения вызова +Перем Заполняемые; // ФиксированныйСписок из Число - Индексы заполняемых параметров + +// КартаСоответствие из КлючИЗначение - Позиции параметров с позиционными значениями: +// * Ключ - Число - Индекс параметра в сигнатуре +// * Значение - Число - Индекс в позиционных значениях +Перем Позиции; + +// КартаСоответствие из КлючИЗначение - Значения, заданные методом Установить: +// * Ключ - Число - Индекс параметра +// * Значение - Произвольный - Значение параметра или приватный маркер Неопределено +Перем Значения; + +Перем МаркерНеопределено; // Структура - Пустой объект, обозначающий Неопределено в карте значений + +// Метаданные вызываемого метода +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений - Метаданные метода +// +Функция Метод() Экспорт + Возврат Метод; +КонецФункции + +// Индексы параметров, значения которых задаются методом Установить +// +// Возвращаемое значение: +// ФиксированныйСписок из Число - Индексы параметров, начиная с нуля +// +Функция ИндексыЗаполняемыхПараметров() Экспорт + Возврат Заполняемые; +КонецФункции + +// Признак наличия заполняемых параметров +// +// Возвращаемое значение: +// Булево - Истина - есть параметры, доступные для заполнения +// +Функция ТребуютЗаполнения() Экспорт + Возврат Не Заполняемые.Пусто(); +КонецФункции + +// Устанавливает значение заполняемого параметра. +// Вызывает исключение, если параметр недоступен для заполнения или значение уже установлено. +// +// Параметры: +// Индекс - Число - Индекс параметра в сигнатуре, начиная с нуля +// Значение - Произвольный - Значение параметра +// +Процедура Установить(Знач Индекс, Значение) Экспорт + + Описание = ОписаниеПараметра(Индекс); + + Если Не Заполняемые.Содержит(Индекс) Тогда + ВызватьИсключение СтрШаблон("Параметр %1 недоступен для заполнения", Описание); + КонецЕсли; + + Хранимое = ?(Значение = Неопределено, МаркерНеопределено, Значение); + + Если Значения.ВставитьЕслиОтсутствует(Индекс, Хранимое).СодержитЗначение() Тогда + ВызватьИсключение СтрШаблон("Значение параметра %1 уже получено", Описание); + КонецЕсли; + +КонецПроцедуры + +// Возвращает значение параметра по индексу в сигнатуре. +// Для заполняемого параметра возвращает значение, заданное методом Установить; +// если оно не задано, вызывает исключение. Для остальных параметров использует +// позиционное значение, а при его отсутствии - значение по умолчанию или Неопределено. +// +// Параметры: +// Индекс - Число - Индекс параметра в сигнатуре, начиная с нуля +// +// Возвращаемое значение: +// Произвольный - Значение параметра +// +Функция Значение(Знач Индекс) Экспорт + + Параметр = Метод.Параметры.Получить(Индекс); + + Если Не Заполняемые.Содержит(Индекс) Тогда + + Позиция = Позиции.Получить(Индекс).Получить(); + + Если Позиция < Позиционные.Количество() Тогда + Возврат Позиционные.Получить(Позиция); + КонецЕсли; + + Возврат ?(Параметр.ЕстьЗначениеПоУмолчанию, Параметр.ЗначениеПоУмолчанию, Неопределено); + + КонецЕсли; + + Полученное = Значения.Получить(Индекс); + + Если Не Полученное.СодержитЗначение() Тогда + ВызватьИсключение СтрШаблон("Значение параметра %1 не установлено", ОписаниеПараметра(Индекс)); + КонецЕсли; + + Хранимое = Полученное.Получить(); + Возврат ?(Хранимое = МаркерНеопределено, Неопределено, Хранимое); + +КонецФункции + +// Возвращает список аргументов для вызова метода. +// При наличии заполняемых параметров собирает значения в порядке параметров метода +// с помощью метода Значение и добавляет лишние позиционные аргументы в конец списка. +// Если заполняемых параметров нет, возвращает исходный список позиционных значений. +// +// Возвращаемое значение: +// ФиксированныйСписок из Произвольный - Значения параметров метода +// +Функция Значения() Экспорт + + Если Не ТребуютЗаполнения() Тогда + Возврат Позиционные; + КонецЕсли; + + Результат = Новый СписокМассив; + + Для Индекс = 0 По Метод.Параметры.Количество() - 1 Цикл + Результат.Добавить(Значение(Индекс)); + КонецЦикла; + + // Сохраняем лишние аргументы для проверки их количества при вызове метода + Позиционные.ПроцессорКоллекции() + .Пропустить(Позиции.Количество()) + .ДляКаждого(Новый Действие(Результат, "Добавить")); + + Возврат Новый ФиксированныйСписок(Результат); + +КонецФункции + +Функция ОписаниеПараметра(Знач Индекс) + + Возврат СтрШаблон( + "%1 метода %2", + Метод.Параметры.Получить(Индекс).Имя, + Метод.Имя + ); + +КонецФункции + +// Создает аргументы вызова с указанными позиционными значениями +// +// Параметры: +// ОписаниеМетода - СтрокаТаблицыЗначений - Метаданные вызываемого метода +// ПозиционныеПараметры - ФиксированныйСписок из Произвольный - Позиционные значения +// ЗаполняемыеПараметры - ФиксированныйСписок из Число - Индексы параметров, доступных для заполнения +// +Процедура ПриСозданииОбъекта(ОписаниеМетода, ПозиционныеПараметры, ЗаполняемыеПараметры) + + Метод = ОписаниеМетода; + Позиционные = ПозиционныеПараметры; + Заполняемые = ЗаполняемыеПараметры; + Позиции = Новый КартаСоответствие; + Значения = Новый КартаСоответствие; + + МаркерНеопределено = Новый Структура; + + Для Индекс = 0 По Метод.Параметры.Количество() - 1 Цикл + Если Не Заполняемые.Содержит(Индекс) Тогда + Позиции.Вставить(Индекс, Позиции.Количество()); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" index 19d1f4e..aadc7d9 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" @@ -1,22 +1,27 @@ -// Исполняет узлы тест-плана в текущей поделке: условия, создание экземпляра -// набора, методы жизненного цикла и тестовые методы. Возвращает результат узла, -// события исполнения публикует диспетчер; детей набора и контейнера исполнитель -// отдает обратно диспетчеру. +// Исполнение наборов, контейнеров и тестов в текущей поделке. +// Проверяет условия, создает экземпляры наборов и выполняет методы жизненного цикла +// и тестовые методы. Исполнение дочерних узлов передает диспетчеру. // -// Экземпляры компанейского набора: один - на условия набора и ПередВсеми, свой - -// на ПослеВсех, по одному на тест - на его условия, ПередКаждым, сам тест -// и ПослеКаждого. У одиночки фабрика каждый раз отдает один и тот же экземпляр. +// У компанейского набора отдельные экземпляры используются для условий набора +// и ПередВсеми, для ПослеВсех и для каждого теста с его условиями и методами +// ПередКаждым/ПослеКаждого. Одиночка использует общий экземпляр в пределах прогона. +// +// Для подготовки экземпляра публикуется ИсполнениеЭкземплярНабора, +// для получения аргументов от поставщиков - ЗаполнениеАргументов. +// Вывод обработчиков включается в вывод узла; ошибка подготовки приводит к состоянию Сломан. #Использовать collectionos #Использовать "../../../shared" -Перем _ТабакеркаРезультатов; // Табакерка - Результаты выполнения тестов -Перем _ВызовМетода; // ВызовМетода - Вызов методов наборов и условий -Перем _ФабрикаЭкземпляров; // ФабрикаЭкземпляров - Экземпляры тестовых наборов -Перем _Диспетчер; // ДиспетчерТестов - Диспетчер, которому отдаются дети узла +Перем _ТабакеркаРезультатов; // Табакерка - Результаты выполнения тестов +Перем _ВызовМетода; // ВызовМетода - Вызов методов наборов и условий +Перем _ФабрикаЭкземпляров; // ФабрикаЭкземпляров - Экземпляры тестовых наборов +Перем ПубликаторСобытий; // ПубликаторСобытий - Подготовка экземпляра и заполнение аргументов +Перем ПроверкаУсловийИзоляции; // ПроверкаУсловийИзоляции - Условия изолированного узла, который не удалось обнаружить +Перем _Диспетчер; // ДиспетчерТестов - Исполнение дочерних узлов -// Исполняет набор или тест. Узел, который не удалось обнаружить, не исполняется: -// если условия его не выключили, он сломан своими ошибками обнаружения +// Исполняет набор, контейнер или тест. +// Узел с ошибками обнаружения получает состояние Сломан, если не пропущен по условиям. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел @@ -42,8 +47,7 @@ КонецФункции -// Разворачивает состав набора для чистого обнаружения: состав набора текущей -// поделки обнаружитель уже внес в план +// Состав набора текущей поделки уже сформирован обнаружителем // // Параметры: // Набор - ОпределениеТестНабора - Набор плана @@ -53,7 +57,7 @@ Функция ИсполнитьНабор(Набор) - Исполнение = НачатьИсполнение(Набор); + Исполнение = НачатьИсполнение(Набор, Набор); Пропуск = ПропускПоУсловиям(Набор.Условия(), Исполнение); @@ -67,7 +71,15 @@ Возврат РезультатИз(Исполнение); КонецЕсли; - ВызватьМетоды(Исполнение, Набор.ПередВсеми(), Набор.Таймаут()); + // Экземпляр готовится к методам узла, а методы экземпляра набора - + // это ПередВсеми: без них готовить нечего + Если Не Набор.ПередВсеми().Пусто() Тогда + ПодготовитьЭкземпляр(Исполнение); + КонецЕсли; + + Если Исполнение.Состояние = СостоянияВыполненияТестов.Успех Тогда + ВызватьМетоды(Исполнение, Набор.ПередВсеми()); + КонецЕсли; Если Исполнение.Состояние = СостоянияВыполненияТестов.Успех Тогда _Диспетчер.ИсполнитьДетей(Набор); @@ -75,10 +87,14 @@ Если Не Набор.ПослеВсех().Пусто() Тогда - ИсполнениеПослеВсех = НачатьИсполнение(Набор); + ИсполнениеПослеВсех = НачатьИсполнение(Набор, Набор); + + Если ИсполнениеПослеВсех.Состояние = СостоянияВыполненияТестов.Успех Тогда + ПодготовитьЭкземпляр(ИсполнениеПослеВсех); + КонецЕсли; Если ИсполнениеПослеВсех.Состояние = СостоянияВыполненияТестов.Успех Тогда - ВызватьМетоды(ИсполнениеПослеВсех, Набор.ПослеВсех(), Набор.Таймаут()); + ВызватьМетоды(ИсполнениеПослеВсех, Набор.ПослеВсех()); КонецЕсли; ОбъединитьРезультатыВыполнения(Исполнение, ИсполнениеПослеВсех); @@ -112,9 +128,9 @@ КонецФункции -// Узел, который не удалось обнаружить, сломан своими ошибками обнаружения, если -// его не выключили условия: выключенный узел остается пропущенным, как и при -// отказе создания экземпляра. Вывод, который несут ошибки, уходит в вывод результата +// Формирует результат узла с ошибками обнаружения. +// Если условия не требуют пропуска, возвращает состояние Сломан и ошибки обнаружения. +// Условия изолированного узла проверяет ПроверкаУсловийИзоляции. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Узел с ошибками обнаружения @@ -124,7 +140,11 @@ // Функция ИсполнитьНеобнаруженный(Узел) - Проверка = ПроверитьУсловия(Узел); + Если Узел.Изоляция().СодержитЗначение() Тогда + Проверка = ПроверкаУсловийИзоляции.Проверить(Узел); + Иначе + Проверка = ПроверитьУсловия(Узел); + КонецЕсли; Если Проверка.Пропуск.СодержитЗначение() Тогда Возврат Проверка.Пропуск.Получить(); @@ -143,9 +163,8 @@ КонецФункции -// Проверяет условия узла, которому экземпляр набора нужен только для них: контейнеру -// и узлу, который не удалось обнаружить. Отказ создания экземпляра такому узлу -// не причина, и вывод создания уходит в вывод узла +// Проверяет условия контейнера или узла с ошибками обнаружения. +// При отсутствии условий возвращает пустой результат проверки. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Проверяемый узел @@ -166,7 +185,7 @@ Набор = ?(ТипЗнч(Узел) = Тип("ОпределениеТестНабора"), Узел, Узел.Набор()); - Исполнение = НачатьИсполнение(Набор); + Исполнение = НачатьИсполнение(Набор, Узел); Проверка.Пропуск = ПропускПоУсловиям(Узел.Условия(), Исполнение); Проверка.Вывод = ВыводБезОтказа(Исполнение); @@ -179,7 +198,7 @@ Набор = Тест.Набор(); - Исполнение = НачатьИсполнение(Набор); + Исполнение = НачатьИсполнение(Набор, Тест); Пропуск = ПропускПоУсловиям(Тест.Условия(), Исполнение); @@ -192,34 +211,39 @@ Возврат РезультатИз(Исполнение); КонецЕсли; - ВызватьМетоды(Исполнение, Набор.ПередКаждым(), Набор.Таймаут()); + // Отказ подготовки, как и отказ создания, не дает вызвать ни один метод теста + ПодготовитьЭкземпляр(Исполнение); + + Если Исполнение.Состояние <> СостоянияВыполненияТестов.Успех Тогда + Возврат РезультатИз(Исполнение); + КонецЕсли; + + ВызватьМетоды(Исполнение, Набор.ПередКаждым()); Если Исполнение.Состояние = СостоянияВыполненияТестов.Успех Тогда ОбъединитьРезультатыВыполнения( Исполнение, - _ВызовМетода.Вызвать( - Исполнение.Создание.Экземпляр.Получить(), - Тест.ИмяМетода(), - Тест.Параметры(), - Тест.Таймаут() - ) + ВызватьМетодНабора(Исполнение, Тест.ИмяМетода(), Тест.Параметры(), Тест.Таймаут()) ); КонецЕсли; - ВызватьМетоды(Исполнение, Набор.ПослеКаждого(), Набор.Таймаут()); + ВызватьМетоды(Исполнение, Набор.ПослеКаждого()); Возврат РезультатИз(Исполнение); КонецФункции -// Создает экземпляр набора и начинает исполнение на нем: вывод конструктора -// попадает в вывод узла, отказ создания - в его причины, и тогда вывод создания -// несет отказ +// Создает экземпляр набора и начальное состояние исполнения узла. +// При успешном создании сохраняет вывод конструктора; при отказе возвращает +// состояние Сломан с причиной, содержащей вывод создания. // // Параметры: // Набор - ОпределениеТестНабора - Набор, экземпляр которого создается +// Узел - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел: экземпляр +// создается для него, и методы набора получают значения поставщиков +// в его контексте // // Возвращаемое значение: // Структура - Исполнение на экземпляре: @@ -227,13 +251,17 @@ // сразу после создания не Успех - экземпляр не создан // * Причины - СписокМассив из ИнформацияОбОшибке, Строка - Причины состояния // * Вывод - Строка - Перехваченный консольный вывод +// * Набор - ОпределениеТестНабора - Набор экземпляра +// * Узел - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел // * Создание - см. ФабрикаЭкземпляров.Создать // -Функция НачатьИсполнение(Набор) +Функция НачатьИсполнение(Набор, Узел) - Создание = _ФабрикаЭкземпляров.Создать(Набор); + Создание = _ФабрикаЭкземпляров.Создать(Набор, Узел); Исполнение = НовыйРезультатВыполнения(); + Исполнение.Вставить("Набор", Набор); + Исполнение.Вставить("Узел", Узел); Исполнение.Вставить("Создание", Создание); Если Создание.Отказ.СодержитЗначение() Тогда @@ -247,9 +275,8 @@ КонецФункции -// Возвращает вывод исполнения, отказ создания которого не стал причиной результата -// (узел пропущен условием, контейнеру экземпляр не понадобился): вывод создания -// несет отказ, и отброшенный отказ отдает его выводу исполнения +// Объединяет вывод создания экземпляра и исполнения. +// Используется, когда отказ создания не включается в причины результата. // // Параметры: // Исполнение - см. НачатьИсполнение @@ -267,34 +294,145 @@ КонецФункции -// Вызывает методы жизненного цикла на экземпляре исполнения +// Публикует событие ИсполнениеЭкземплярНабора после проверки условий узла. +// Сохраняет вывод обработчиков; при исключении устанавливает состояние Сломан. +// +// Параметры: +// Исполнение - см. НачатьИсполнение +// +Процедура ПодготовитьЭкземпляр(Исполнение) + + Подготовка = ТестированиеСлужебный.ВыполнитьСПерехватомВывода( + ПубликаторСобытий, + "ОпубликоватьСобытие", + Списки.ИзЭлементов( + Исполнение.Узел, + "ИсполнениеЭкземплярНабора", + Массивы.ИзЭлементов(Исполнение.Создание.Экземпляр.Получить()) + ) + ); + + Исполнение.Вывод = Исполнение.Вывод + Подготовка.Вывод; + + Если Подготовка.Ошибка.СодержитЗначение() Тогда + Исполнение.Состояние = СостоянияВыполненияТестов.Сломан; + Исполнение.Причины.Добавить(Подготовка.Ошибка.Получить()); + КонецЕсли; + +КонецПроцедуры + +// Вызывает методы жизненного цикла на экземпляре исполнения, каждый - с таймаутом +// набора // // Параметры: // Исполнение - см. НачатьИсполнение // ИменаМетодов - ФиксированныйСписок из Строка - Имена методов -// Таймаут - Число - Время на каждый метод в миллисекундах, 0 - без ограничения // -Процедура ВызватьМетоды(Исполнение, ИменаМетодов, Знач Таймаут) +Процедура ВызватьМетоды(Исполнение, ИменаМетодов) Для Каждого ИмяМетода Из ИменаМетодов Цикл ОбъединитьРезультатыВыполнения( Исполнение, - _ВызовМетода.Вызвать( - Исполнение.Создание.Экземпляр.Получить(), - ИмяМетода, - Списки.ИзЭлементов(), - Таймаут - ) + ВызватьМетодНабора(Исполнение, ИмяМетода, Списки.ИзЭлементов(), Исполнение.Набор.Таймаут()) ); КонецЦикла; КонецПроцедуры -// Проверяет условия набора или теста на экземпляре исполнения. Вывод условий -// не теряется: он в результате пропуска, а если определение выполняется - -// дополняет вывод исполнения +// Формирует аргументы и вызывает метод набора с указанным таймаутом. +// Если формирование аргументов завершилось ошибкой, возвращает состояние Сломан +// без вызова метода. +// +// Параметры: +// Исполнение - см. НачатьИсполнение +// ИмяМетода - Строка - Имя метода +// Позиционные - ФиксированныйСписок из Произвольный - Позиционные значения вызова +// Таймаут - Число - Время на метод в миллисекундах, 0 - без ограничения +// +// Возвращаемое значение: +// см. ВызовМетода.Вызвать +// +Функция ВызватьМетодНабора(Исполнение, Знач ИмяМетода, Позиционные, Знач Таймаут) + + Сборка = СобратьАргументы( + Исполнение.Узел, + Исполнение.Набор.Сигнатура(ИмяМетода).СоздатьАргументы(Позиционные) + ); + + Если Сборка.Ошибка.СодержитЗначение() Тогда + Возврат Новый Структура( + "Состояние, Причины, Вывод", + СостоянияВыполненияТестов.Сломан, + Списки.ИзЭлементов(Сборка.Ошибка.Получить()), + Сборка.Вывод + ); + КонецЕсли; + + Вызов = _ВызовМетода.Вызвать( + Исполнение.Создание.Экземпляр.Получить(), + ИмяМетода, + Сборка.Значение.Получить(), + Таймаут + ); + + Вызов.Вывод = Сборка.Вывод + Вызов.Вывод; + + Возврат Вызов; + +КонецФункции + +// Формирует список аргументов вызова. +// При наличии параметров с поставщиками публикует событие ЗаполнениеАргументов +// и перехватывает вывод и исключения обработчиков. +// +// Параметры: +// Узел - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел +// Аргументы - АргументыВызова - Аргументы вызова +// +// Возвращаемое значение: +// Структура - Итог формирования аргументов: +// * Значение - Опциональный - Список аргументов (ФиксированныйСписок); пустой при ошибке +// * Вывод - Строка - Вывод обработчиков заполнения +// * Ошибка - Опциональный - Исключение (ИнформацияОбОшибке); пустой при успешном заполнении +// +Функция СобратьАргументы(Узел, Аргументы) + + Если Не Аргументы.ТребуютЗаполнения() Тогда + Возврат Новый Структура( + "Значение, Вывод, Ошибка", + Новый Опциональный(Аргументы.Значения()), + "", + Опциональные.Пустой() + ); + КонецЕсли; + + Возврат ТестированиеСлужебный.ВыполнитьСПерехватомВывода( + ЭтотОбъект, + "ЗаполнитьАргументы", + Списки.ИзЭлементов(Узел, Аргументы) + ); + +КонецФункции + +// Публикует событие ЗаполнениеАргументов и возвращает заполненный список аргументов +// +// Параметры: +// Узел - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел +// Аргументы - АргументыВызова - Аргументы вызова +// +// Возвращаемое значение: +// см. АргументыВызова.Значения +// +Функция ЗаполнитьАргументы(Узел, Аргументы) Экспорт + ПубликаторСобытий.ОпубликоватьСобытие(Узел, "ЗаполнениеАргументов", Массивы.ИзЭлементов(Аргументы)); + Возврат Аргументы.Значения(); +КонецФункции + +// Проверяет условия набора или теста на экземпляре исполнения. +// Возвращает результат пропуска или ошибки условия. Вывод условий включается +// в этот результат либо в вывод продолжающегося исполнения. // // Параметры: // Условия - ФиксированныйСписок, СписокМассив из Произвольный - Объекты аннотаций условий @@ -342,8 +480,7 @@ КонецФункции -// Проверяет условия определения на экземпляре его набора. Экспортная, потому -// что вызывается через ВызовМетода +// Проверяет условия узла и возвращает решение о пропуске // // Параметры: // Условия - ФиксированныйСписок, СписокМассив из Произвольный - Объекты аннотаций условий @@ -434,11 +571,15 @@ &Табакерка &Пластилин("РезультатВыполненияТеста") ТабакеркаРезультатов, &Пластилин ВызовМетода, &Пластилин ФабрикаЭкземпляров, + &Пластилин("ПубликаторСобытий") Публикатор, + &Пластилин("ПроверкаУсловийИзоляции") ПроверкаУсловий, &Пластилин ДиспетчерТестов) - _ТабакеркаРезультатов = ТабакеркаРезультатов; - _ВызовМетода = ВызовМетода; - _ФабрикаЭкземпляров = ФабрикаЭкземпляров; - _Диспетчер = ДиспетчерТестов; + _ТабакеркаРезультатов = ТабакеркаРезультатов; + _ВызовМетода = ВызовМетода; + _ФабрикаЭкземпляров = ФабрикаЭкземпляров; + ПубликаторСобытий = Публикатор; + ПроверкаУсловийИзоляции = ПроверкаУсловий; + _Диспетчер = ДиспетчерТестов; КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\270\321\201\320\277\320\265\321\202\321\207\320\265\321\200\320\242\320\265\321\201\321\202\320\276\320\262.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\270\321\201\320\277\320\265\321\202\321\207\320\265\321\200\320\242\320\265\321\201\321\202\320\276\320\262.os" index 66d7d0d..28d7925 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\270\321\201\320\277\320\265\321\202\321\207\320\265\321\200\320\242\320\265\321\201\321\202\320\276\320\262.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\270\321\201\320\277\320\265\321\202\321\207\320\265\321\200\320\242\320\265\321\201\321\202\320\276\320\262.os" @@ -1,21 +1,12 @@ -// Раздает узлы тест-плана исполнителям и публикует события их исполнения: -// начало и конец плана и каждого розданного узла. Исполнителя узла диспетчер -// находит по имени, которое обнаружитель записал в узел. Исполнитель возвращает -// результат узла, а детей набора и контейнера отдает обратно диспетчеру. -// Узел, который не удалось обнаружить, остается в текущей поделке: ради него -// изолированная среда не поднимается. -// -// Прекращение прогона на первом падении - здесь же: узлы, до которых -// прекращенный прогон не дошел, отмечаются незапущенными. -// -// Для чистого обнаружения (discover) диспетчер раздает исполнителям наборы -// плана на разворачивание: исполнитель, который исполняет набор в своей среде, -// обнаруживает там его состав +// Управление исполнением и обнаружением узлов тест-плана. +// Передает узлы выбранным исполнителям, закрывает их контексты +// и публикует события начала и завершения с результатами. #Использовать atomic #Использовать collectionos +#Использовать "../../../shared" -Перем _Поделка; // Поделка - Поделка текущего прогона, в ней живут исполнители +Перем _Поделка; // Поделка - Среда регистрации исполнителей Перем _ПубликаторСобытий; // ПубликаторСобытий - Публикатор событий исполнения Перем _ТабакеркаРезультатов; // Табакерка - Результаты выполнения тестов Перем _ПрерыватьПриПадении; // Булево - Прекращать прогон после первого упавшего теста @@ -32,9 +23,13 @@ // не выполнил бы ни одного теста _Прервано.Установить(Ложь); - _ПубликаторСобытий.ОпубликоватьСобытие(ТестПлан, "ИсполнениеТестПланНачало", Новый Массив); - - ИсполнитьДетей(ТестПлан); + // Начало плана - тоже под защитой: отказ закрывает открытые контексты, где бы ни случился + Попытка + _ПубликаторСобытий.ОпубликоватьСобытие(ТестПлан, "ИсполнениеТестПланНачало", Новый Массив); + ИсполнитьДетей(ТестПлан); + Исключение + ЗакрытьПослеОтказа(ТестПлан, ИнформацияОбОшибке()); + КонецПопытки; _ПубликаторСобытий.ОпубликоватьСобытие(ТестПлан, "ИсполнениеТестПланКонец", Новый Массив); @@ -50,10 +45,8 @@ ТестПлан.Дети().ПроцессорКоллекции().ДляКаждого("Набор -> РазвернутьНабор(Набор)", ЭтотОбъект); КонецПроцедуры -// Отдает набор его исполнителю на разворачивание. Отказ исполнителя не прерывает -// обнаружение: набор остается пустым, а отказ становится его ошибкой обнаружения -// и виден на самом наборе в выводе плана. Экспортная, потому что ее вызывает -// лямбда обхода наборов, а лямбде доступны только экспортные методы +// Обнаруживает состав набора через его исполнителя. +// Исключения исполнителя добавляются к ошибкам обнаружения набора. // // Параметры: // Набор - ОпределениеТестНабора - Разворачиваемый набор @@ -66,10 +59,86 @@ Набор.ДобавитьОшибкуОбнаружения(ИнформацияОбОшибке()); КонецПопытки; + ЗакрытьПослеОбнаружения(Набор); + КонецПроцедуры -// Исполняет детей узла по порядку: наборы плана, тесты набора, итерации -// контейнера. Исполнитель набора или контейнера отдает сюда его детей +// Закрывает контексты набора и его потомков после обнаружения. +// Вывод действий передается в вывод обнаружения, исключения добавляются к ошибкам набора. +// +// Параметры: +// Набор - ОпределениеТестНабора - Развернутый набор +// +Процедура ЗакрытьПослеОбнаружения(Набор) + + Закрытие = НовоеЗакрытие(); + + ЗакрытьОткрытые(Набор, Закрытие); + + ТестированиеСлужебный.ПередатьВывод(Закрытие.Вывод); + + Закрытие.Причины.ДляКаждого(Новый Действие(Набор, "ДобавитьОшибкуОбнаружения")); + +КонецПроцедуры + +// Закрывает открытые контексты после исключения, прервавшего прогон, +// и передает исходное исключение вызывающему коду. Вывод закрытия и подробные +// описания его ошибок с цепочками причин добавляются к выводу исключения. +// +// Параметры: +// ТестПлан - ТестПлан - Исполняемый тест-план +// Ошибка - ИнформацияОбОшибке - Исключение, прервавшее исполнение +// +Процедура ЗакрытьПослеОтказа(ТестПлан, Ошибка) + + Закрытие = НовоеЗакрытие(); + + ЗакрытьОткрытые(ТестПлан, Закрытие); + + Вывод = Закрытие.Вывод + Закрытие.Причины.ПроцессорКоллекции() + .Обработать("Причина -> ТестированиеСлужебный.ПодробноеОписаниеОшибки(""Исключение закрытия"", Причина)") + .ВСтроку(); + + ТестированиеСлужебный.ВызватьСВыводом(Ошибка, Вывод); + +КонецПроцедуры + +// Закрывает контексты поддерева без результата, начиная с потомков. +// Накапливает вывод и исключения действий закрытия. +// +// Параметры: +// Узел - ТестПлан, ОпределениеТестНабора, ОпределениеТеста - Корень поддерева +// Закрытие - см. НовоеЗакрытие - Накопленный итог закрытия +// +Процедура ЗакрытьОткрытые(Узел, Закрытие) + + Для Каждого Дитя Из Узел.Дети() Цикл + ЗакрытьОткрытые(Дитя, Закрытие); + КонецЦикла; + + Если ТипЗнч(Узел) = Тип("ТестПлан") Тогда + Возврат; + КонецЕсли; + + Итог = Узел.Контекст().Закрыть(Опциональные.Пустой()); + + Закрытие.Вывод = Закрытие.Вывод + Итог.Вывод; + Закрытие.Причины.ДобавитьВсе(Итог.Причины); + +КонецПроцедуры + +// Итог закрытия нескольких контекстов +// +// Возвращаемое значение: +// Структура - Суммарный итог закрытия контекстов: +// * Вывод - Строка - Вывод действий закрытия +// * Причины - СписокМассив из ИнформацияОбОшибке - Исключения действий закрытия +// +Функция НовоеЗакрытие() + Возврат Новый Структура("Вывод, Причины", "", Новый СписокМассив); +КонецФункции + +// Исполняет дочерние узлы в порядке, заданном родителем // // Параметры: // Узел - ТестПлан, ОпределениеТестНабора, ОпределениеТеста - Узел, дети которого исполняются @@ -78,9 +147,9 @@ Узел.Дети().ПроцессорКоллекции().ДляКаждого("Дитя -> ИсполнитьУзел(Дитя)", ЭтотОбъект); КонецПроцедуры -// Исполняет узел: публикует его начало, отдает узел исполнителю и публикует -// конец с результатом исполнителя. Экспортная, потому что ее вызывает лямбда -// обхода детей, а лямбде доступны только экспортные методы +// Публикует начало узла, выполняет его через выбранный исполнитель +// и публикует завершение. Перед публикацией результата закрывает контексты +// узла и оставшихся открытыми потомков, добавляя итог закрытия к результату. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел @@ -107,15 +176,33 @@ Результат.ДобавитьПредшествующийВывод(Узел.ВыводОбнаружения()); КонецЕсли; + ЗакрытьУзел(Узел, Результат); + ОпубликоватьКонец(Узел, Результат); КонецПроцедуры -// Отмечает падение по результату любого теста прогона. +// Закрывает контекст узла с его результатом и открытые контексты его потомков. +// Вывод и исключения закрытия добавляются к результату узла. +// +// Параметры: +// Узел - ОпределениеТестНабора, ОпределениеТеста - Завершенный узел +// Результат - РезультатВыполненияТеста - Результат узла // -// Подписка, а не проверка по месту: результаты приходят разными путями - тесты -// текущей поделки и тесты изолированных сред, которые ретранслируются сюда -// по ходу их прогона +Процедура ЗакрытьУзел(Узел, Результат) + + Закрытие = НовоеЗакрытие(); + + Для Каждого Дитя Из Узел.Дети() Цикл + ЗакрытьОткрытые(Дитя, Закрытие); + КонецЦикла; + + Результат.ДобавитьЗакрытие(Закрытие); + Результат.ДобавитьЗакрытие(Узел.Контекст().Закрыть(Новый Опциональный(Результат))); + +КонецПроцедуры + +// Обновляет признак падения по результату теста, полученному через событие завершения // // Параметры: // Тест - ОпределениеТеста - Завершенный тест @@ -123,7 +210,7 @@ // &ПодпискаНаСобытие("ИсполнениеТестКонец") Процедура ОтметитьПадениеТеста(Тест, Результат) Экспорт - ОтметитьПадение(Результат); + ОтметитьПадение(Тест, Результат); КонецПроцедуры // Набор может оказаться красным и без единого упавшего теста: сломанный конструктор, @@ -135,14 +222,10 @@ // &ПодпискаНаСобытие("ИсполнениеТестНаборКонец") Процедура ОтметитьПадениеНабора(Набор, Результат) Экспорт - ОтметитьПадение(Результат); + ОтметитьПадение(Набор, Результат); КонецПроцедуры -Процедура ОтметитьПадение(Результат) - - Если Не _ПрерыватьПриПадении Тогда - Возврат; - КонецЕсли; +Процедура ОтметитьПадение(Узел, Результат) // Падение - это сломанный код: упавшее утверждение или ошибка исполнения. // Пропущенные и прерванные прогон не останавливают, они ничего не говорят @@ -150,19 +233,20 @@ Если Результат.Состояние() = СостоянияВыполненияТестов.Ошибка Или Результат.Состояние() = СостоянияВыполненияТестов.Сломан Тогда - _Прервано.Установить(Истина); + // Зеркала изолированных тестов завершаются событиями ретранслятора, + // поэтому их падения учитываются здесь независимо от прекращения прогона + Узел.Контекст().ОтметитьПадение(); + + Если _ПрерыватьПриПадении Тогда + _Прервано.Установить(Истина); + КонецЕсли; КонецЕсли; КонецПроцедуры -// Отмечает пропущенным то, до чего прекращенный прогон не дошел. -// -// Прекращение не обрывает план: репортеры обходят план и спрашивают результат -// у каждого узла, а у незапущенного узла результата нет. Без этой отметки JUnit -// падал на пустом Опциональном, а изолированный набор терял результаты целиком - -// его дочерний прогон умирал на записи своего JSON-отчета. Заодно счетчики -// перестают показывать план короче, чем он есть. +// Публикует для незапущенного узла результат Пропущен и закрывает его контекст +// вместе с открытыми контекстами потомков. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Незапущенный узел @@ -171,10 +255,15 @@ ОпубликоватьНачало(Узел); - ОпубликоватьКонец(Узел, НовыйРезультат( + Результат = НовыйРезультат( СостоянияВыполненияТестов.Пропущен, Списки.ИзЭлементов("Прогон прекращён на первом падении") - )); + ); + + // Контекст закрывается и у незапущенного узла, и у его потомков + ЗакрытьУзел(Узел, Результат); + + ОпубликоватьКонец(Узел, Результат); КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\230\321\201\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\230\321\201\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..6466dae --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\230\321\201\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,224 @@ +// Контекст исполнения узла тест-плана: хранилище значений, результат узла, +// признак ошибок в поддереве и действия освобождения ресурсов. +// Каждый узел имеет собственный контекст, связанный с контекстом родителя. +// Контексты тестов и наборов закрываются перед публикацией их результатов. +// Ресурсы экземпляра одиночки и экземпляров для условий контейнера принадлежат набору. +// Регистрация действий закрытия поддерживается для контекстов тестов и наборов. + +#Использовать atomic +#Использовать collectionos +#Использовать "../../../shared" + +Перем Узел; // ТестПлан, ОпределениеТестНабора, ОпределениеТеста - Узел контекста +Перем Хранилище; // СинхронизированнаяКарта - Значения, связанные с узлом +Перем Закрытия; // СписокМассив из Действие - Действия закрытия в порядке добавления +Перем Результат; // Опциональный - Результат узла (РезультатВыполненияТеста), известен при закрытии +Перем ЕстьПадения; // АтомарноеБулево - Наличие ошибок у узла или его потомков +Перем Закрыт; // Булево - Контекст закрыт, повторное закрытие ничего не меняет +Перем Блокировка; // БлокировкаРесурса - Синхронизация регистрации действий и закрытия контекста + +// Узел, который исполняется в контексте +// +// Возвращаемое значение: +// - ТестПлан - Узел прогона +// - ОпределениеТестНабора - Узел набора +// - ОпределениеТеста - Узел теста или контейнера +// +Функция Узел() Экспорт + Возврат Узел; +КонецФункции + +// Контекст родительского узла: набора у теста, контейнера у итерации, прогона у набора +// +// Возвращаемое значение: +// Опциональный - Контекст (КонтекстИсполнения) родителя, пустой - это контекст прогона +// +Функция Родитель() Экспорт + + Если ТипЗнч(Узел) = Тип("ТестПлан") Тогда + Возврат Опциональные.Пустой(); + КонецЕсли; + + Возврат Новый Опциональный(Узел.Родитель().Контекст()); + +КонецФункции + +// Хранилище значений, связанных с узлом +// +// Возвращаемое значение: +// СинхронизированнаяКарта - Значения по ключам, которые выбирают поставщики +// +Функция Хранилище() Экспорт + Возврат Хранилище; +КонецФункции + +// Регистрирует действие освобождения ресурсов при закрытии контекста. +// Действия выполняются в обратном порядке регистрации. Ошибка одного действия +// не отменяет выполнение остальных; вывод и ошибки возвращаются методом Закрыть. +// Для контекстов прогона и контейнера регистрация вызывает исключение. +// +// После закрытия контекста переданное действие выполняется синхронно в этом вызове; +// его исключение передается вызывающему коду. +// При таймауте тестового метода контекст теста закрывается после ПослеКаждого, +// без ожидания завершения фонового задания. +// +// Параметры: +// Действие - Действие - Действие с одним параметром - этим контекстом +// +Процедура ПриЗакрытии(Действие) Экспорт + + Если ТипЗнч(Узел) = Тип("ТестПлан") Тогда + ВызватьИсключение "У контекста прогона нет действий закрытия: их вывод и исключения " + + "не попали бы ни в один результат. Созданное должно принадлежать узлу - набору или тесту"; + КонецЕсли; + + Если ТипЗнч(Узел) = Тип("ОпределениеТеста") И Узел.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда + ВызватьИсключение "У контекста контейнера нет действий закрытия: его результат известен до итераций, " + + "и падение закрытия после них не учли бы. Созданное должно принадлежать набору или тесту"; + КонецЕсли; + + Блокировка.Заблокировать(); + + Попытка + + БылЗакрыт = Закрыт; + + Если Не БылЗакрыт Тогда + Закрытия.Добавить(Действие); + КонецЕсли; + + Исключение + Блокировка.Разблокировать(); + ВызватьИсключение; + КонецПопытки; + + Блокировка.Разблокировать(); + + Если БылЗакрыт Тогда + Действие.Выполнить(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +// Результат узла, переданный при закрытии контекста +// +// Возвращаемое значение: +// Опциональный - Результат (РезультатВыполненияТеста), пустой - узел не закрыт +// или закрыт без результата: при чистом обнаружении или после +// исключения, прервавшего исполнение плана +// +Функция Результат() Экспорт + Возврат Результат; +КонецФункции + +// Признак наличия состояния Ошибка или Сломан у узла либо его потомков. +// Ошибка действия закрытия устанавливает признак до выполнения следующего действия. +// +// Возвращаемое значение: +// Булево - Истина - упал узел или кто-то из его потомков +// +Функция ЕстьПадения() Экспорт + Возврат ЕстьПадения.Получить(); +КонецФункции + +// Устанавливает признак падения у текущего контекста и всех его родителей +// +Процедура ОтметитьПадение() Экспорт + + ЕстьПадения.Установить(Истина); + + Родитель().ЕслиСодержитЗначение("Родитель -> Родитель.ОтметитьПадение()"); + +КонецПроцедуры + +// Закрывает контекст и выполняет зарегистрированные действия в обратном порядке. +// Возвращает их вывод и исключения. Повторный вызов возвращает пустой итог закрытия +// и сохраняет ранее установленный результат узла. +// +// Параметры: +// РезультатУзла - Опциональный - Результат узла (РезультатВыполненияТеста), пустой - узел +// закрывается без результата, см. Результат +// +// Возвращаемое значение: +// Структура - Итог закрытия: +// * Вывод - Строка - Вывод действий закрытия +// * Причины - СписокМассив из ИнформацияОбОшибке - Исключения действий, пустой - все выполнились +// +Функция Закрыть(РезультатУзла) Экспорт + + Закрытие = Новый Структура("Вывод, Причины", "", Новый СписокМассив); + + // Под блокировкой: действие, которое добавят после этого, выполнится сразу + // и увидит результат и падения узла + Блокировка.Заблокировать(); + + Попытка + + БылЗакрыт = Закрыт; + + Если Не БылЗакрыт Тогда + + Результат = РезультатУзла; + + Если РезультатУзла.СодержитЗначение() И ЭтоПадение(РезультатУзла.Получить().Состояние()) Тогда + ОтметитьПадение(); + КонецЕсли; + + ДействияЗакрытия = Закрытия.ВМассив(); + Закрытия.Очистить(); + + Закрыт = Истина; + + КонецЕсли; + + Исключение + Блокировка.Разблокировать(); + ВызватьИсключение; + КонецПопытки; + + Блокировка.Разблокировать(); + + Если БылЗакрыт Тогда + Возврат Закрытие; + КонецЕсли; + + Индекс = ДействияЗакрытия.ВГраница(); + + Пока Индекс >= 0 Цикл + + Выполнение = ТестированиеСлужебный.ВыполнитьСПерехватомВывода( + ДействияЗакрытия[Индекс], + "Выполнить", + Списки.ИзЭлементов(ЭтотОбъект) + ); + + Закрытие.Вывод = Закрытие.Вывод + Выполнение.Вывод; + + Если Выполнение.Ошибка.СодержитЗначение() Тогда + Закрытие.Причины.Добавить(Выполнение.Ошибка.Получить()); + ОтметитьПадение(); + КонецЕсли; + + Индекс = Индекс - 1; + + КонецЦикла; + + Возврат Закрытие; + +КонецФункции + +Функция ЭтоПадение(Знач Состояние) + Возврат Состояние = СостоянияВыполненияТестов.Ошибка Или Состояние = СостоянияВыполненияТестов.Сломан; +КонецФункции + +Процедура ПриСозданииОбъекта(Владелец) + + Узел = Владелец; + Хранилище = Новый СинхронизированнаяКарта(Новый КартаСоответствие); + Закрытия = Новый СписокМассив; + Результат = Опциональные.Пустой(); + ЕстьПадения = Новый АтомарноеБулево(); + Закрыт = Ложь; + Блокировка = Новый БлокировкаРесурса(ЭтотОбъект); + +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.os" new file mode 100644 index 0000000..e4469e8 --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.os" @@ -0,0 +1,63 @@ +// Описание параметра метода или конструктора тестового набора. +// Передается поставщику значения первым аргументом функции Значение. + +#Использовать annotations + +Перем Метод; // СтрокаТаблицыЗначений - Данные метода с развернутыми аннотациями +Перем Индекс; // Число - Индекс параметра + +// Метаданные метода с развернутыми аннотациями метода и его параметров +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений - Данные метода: тестового, жизненного цикла или конструктора +// +Функция Метод() Экспорт + Возврат Метод; +КонецФункции + +// Индекс параметра среди параметров метода +// +// Возвращаемое значение: +// Число - Индекс, с нуля +// +Функция Индекс() Экспорт + Возврат Индекс; +КонецФункции + +// Имя параметра +// +// Возвращаемое значение: +// Строка - Имя параметра +// +Функция Имя() Экспорт + Возврат Данные().Имя; +КонецФункции + +// Метаданные параметра с развернутыми аннотациями +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений - Данные параметра: Имя, ПоЗначению, ЕстьЗначениеПоУмолчанию, +// ЗначениеПоУмолчанию, Аннотации (развернутые) +// +Функция Данные() Экспорт + Возврат Метод.Параметры.Получить(Индекс); +КонецФункции + +// Первая аннотация параметра с указанным именем +// +// Параметры: +// ИмяАннотации - Строка - Имя аннотации +// +// Возвращаемое значение: +// Опциональный - Аннотация (СтрокаТаблицыЗначений), пустой - аннотации нет +// +Функция Аннотация(Знач ИмяАннотации) Экспорт + Возврат Новый Опциональный(РаботаСАннотациями.ПолучитьАннотацию(Данные(), ИмяАннотации), Истина); +КонецФункции + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта(&Блестяшка ОписаниеМетода, &Блестяшка ИндексПараметра) + Метод = ОписаниеМетода; + Индекс = ИндексПараметра; +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\237\320\276\320\273\321\217.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\237\320\276\320\273\321\217.os" new file mode 100644 index 0000000..c5f9bfd --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\237\320\276\320\273\321\217.os" @@ -0,0 +1,53 @@ +// Описание поля тестового набора. +// Передается поставщику значения первым аргументом функции Значение. + +#Использовать annotations + +Перем Данные; // СтрокаТаблицыЗначений - Данные поля с развернутыми аннотациями +Перем Поставщик; // Строка - Имя желудя-поставщика + +// Имя поля +// +// Возвращаемое значение: +// Строка - Имя поля +// +Функция Имя() Экспорт + Возврат Данные.Имя; +КонецФункции + +// Метаданные поля с развернутыми аннотациями +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений - Данные поля: Имя, Аннотации (развернутые) +// +Функция Данные() Экспорт + Возврат Данные; +КонецФункции + +// Первая аннотация поля с указанным именем +// +// Параметры: +// ИмяАннотации - Строка - Имя аннотации +// +// Возвращаемое значение: +// Опциональный - Аннотация (СтрокаТаблицыЗначений), пустой - аннотации нет +// +Функция Аннотация(Знач ИмяАннотации) Экспорт + Возврат Новый Опциональный(РаботаСАннотациями.ПолучитьАннотацию(Данные, ИмяАннотации), Истина); +КонецФункции + +// Имя желудя-поставщика значения поля +// +// Возвращаемое значение: +// Строка - Имя поставщика +// +Функция Поставщик() Экспорт + Возврат Поставщик; +КонецФункции + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта(&Блестяшка ОписаниеПоля, &Блестяшка ИмяПоставщика) + Данные = ОписаниеПоля; + Поставщик = ИмяПоставщика; +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" index e4da58e..741bfd5 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" @@ -1,6 +1,7 @@ Перем _ТестМетод; Перем _ОтображаемоеИмя; Перем _ОпределениеТестовогоНабора; +Перем Сигнатура; // СигнатураМетода - Сигнатура тестового метода Функция ТестМетод() Экспорт Возврат _ТестМетод; @@ -14,15 +15,26 @@ Возврат _ОпределениеТестовогоНабора; КонецФункции +// Сигнатура тестового метода +// +// Возвращаемое значение: +// СигнатураМетода - Сигнатура тестового метода +// +Функция Сигнатура() Экспорт + Возврат Сигнатура; +КонецФункции + &Желудь &Характер("Компанейский") Процедура ПриСозданииОбъекта( &Блестяшка ТестМетод, &Блестяшка ОтображаемоеИмя, - &Блестяшка ОпределениеТестовогоНабора) Экспорт + &Блестяшка ОпределениеТестовогоНабора, + &Блестяшка СигнатураМетода) Экспорт _ТестМетод = ТестМетод; _ОтображаемоеИмя = ОтображаемоеИмя; _ОпределениеТестовогоНабора = ОпределениеТестовогоНабора; + Сигнатура = СигнатураМетода; КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" index ce0e8b1..822a88d 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" @@ -1,4 +1,5 @@ #Использовать annotations +#Использовать autumn #Использовать collectionos #Использовать "../../../shared" @@ -7,6 +8,7 @@ Перем _КорневыеАннотацииУсловий; // СписокМассив из Строка - Имена корневых аннотаций условий Перем _ВыполняетсяВИзоляции; // Булево - Признак прогона внутри изолированной среды Перем _ПутиКТестовымНаборам; // КартаСоответствие - Пути к файлам наборов по именам классов +Перем РазрешениеЗначений; // РазрешениеЗначений - Сигнатуры методов наборов // Составляет тест-план по окружению поделки. Состав изолированных наборов // обнаруживается только в их средах: при исполнении его вклеивают их исполнители, @@ -42,7 +44,9 @@ Продолжить; КонецЕсли; - ТестНабор = ЗарегистрироватьТестовыйНабор(ОпределениеТестовогоНабора, ТестПлан); + Сигнатуры = РазрешениеЗначений.ПрочитатьСигнатуры(ОпределениеТестовогоНабора); + + ТестНабор = ЗарегистрироватьТестовыйНабор(ОпределениеТестовогоНабора, ТестПлан, Сигнатуры); Если Пропустить(ТестНабор) Тогда Продолжить; @@ -101,9 +105,19 @@ ); // Ошибка обнаружения ломает свой узел, а не обнаружение всего плана: - // неверное объявление изоляции или отказ поставщика контекста шаблона + // неверное объявление изоляции или параметров, отказ поставщика контекста шаблона ОшибкаОбнаружения = Объявление.Ошибка; + Если Не ОшибкаОбнаружения.СодержитЗначение() Тогда + ОшибкаОбнаружения = Сигнатуры.Ошибки.Получить(ТестМетод.Имя); + КонецЕсли; + + // Изолированный тест получает значения в своей среде: доступность + // поставщиков проверит она + Если Не ОшибкаОбнаружения.СодержитЗначение() И Не Объявление.Изоляция.СодержитЗначение() Тогда + ОшибкаОбнаружения = ОшибкаРегистрацииТеста(Сигнатуры, ТестМетод.Имя, ТестНабор); + КонецЕсли; + Если РаботаСАннотациями.ПолучитьАннотацию(ТестМетод, "Тест") <> Неопределено Тогда Определение = ОпределениеМетода( @@ -230,10 +244,8 @@ КонецФункции -// Получает описания итераций тестового шаблона, перехватывая вывод поставщика -// контекста (например, вывод выражения источника аргументов): вывод удачного -// обнаружения предваряет вывод контейнера при исполнении, неудачного - несет -// ошибка обнаружения +// Получает описания итераций шаблона и перехватывает вывод поставщика контекста. +// При успехе вывод включается в вывод контейнера; при ошибке сохраняется в исключении. // // Параметры: // ТестМетод - ДанныеМетода - Метод тестового шаблона @@ -270,9 +282,7 @@ КонецФункции -// Получает у поставщика контекста, указанного в &ТестШаблон, описания итераций -// тестового шаблона. Экспортная, потому что вызывается через -// ТестированиеСлужебный.ВыполнитьСПерехватомВывода +// Получает описания итераций у поставщика контекста, указанного в аннотации ТестШаблон // // Параметры: // ТестМетод - ДанныеМетода - Метод тестового шаблона @@ -296,16 +306,30 @@ Массивы.ИзЭлементов( ТестМетод, ОтображаемоеИмя, - ТестНабор + ТестНабор, + ТестНабор.Сигнатура(ТестМетод.Имя) ) ) ).Получить("СписокМассив"); КонецФункции -Функция ЗарегистрироватьТестовыйНабор(ОпределениеТестовогоНабора, ТестПлан) Экспорт +// Регистрирует набор в плане: читает свойства его конструктора, методов жизненного +// цикла и полей. Неверное объявление изоляции, характера, параметров конструктора +// или методов жизненного цикла и полей становится ошибкой обнаружения набора +// +// Параметры: +// ОпределениеТестовогоНабора - ОпределениеЖелудя - Определение желудя набора +// ТестПлан - ТестПлан - План, которому принадлежит набор +// Сигнатуры - см. РазрешениеЗначений.ПрочитатьСигнатуры +// +// Возвращаемое значение: +// ОпределениеТестНабора - Определение набора +// +Функция ЗарегистрироватьТестовыйНабор(ОпределениеТестовогоНабора, ТестПлан, Сигнатуры) Экспорт - Конструктор = ОпределениеТестовогоНабора.Завязь().ДанныеМетода(); + Завязь = ОпределениеТестовогоНабора.Завязь(); + Конструктор = Завязь.ДанныеМетода(); Таймаут = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( РаботаСАннотациями.ПолучитьАннотацию(Конструктор, "Таймаут"), @@ -327,6 +351,14 @@ ЖизненныйЦикл.Вставить("ПослеВсех", ИменаМетодовСАннотацией(Методы, "ПослеВсех")); Объявление = РазборИзоляции(Конструктор); + Характер = РазборХарактера(Конструктор); + + // Набор без конструктора создается завязью-лямбдой: параметров у него нет + СигнатураКонструктора = Опциональные.Пустой(); + + Если Завязь.ЭтоКонструктор() Тогда + СигнатураКонструктора = Сигнатуры.Сигнатуры.Получить(Конструктор.Имя); + КонецЕсли; ТестНабор = _Поделка.НайтиЖелудь( "ОпределениеТестНабора", @@ -338,16 +370,194 @@ УсловияМетода(Конструктор), ЖизненныйЦикл, Объявление.Изоляция, - ИмяИсполнителя(Объявление.Изоляция) + ИмяИсполнителя(Объявление.Изоляция), + Сигнатуры.Сигнатуры, + СигнатураКонструктора, + Сигнатуры.Поля, + Характер.Одиночка ) ); Объявление.Ошибка.ЕслиСодержитЗначение(Новый Действие(ТестНабор, "ДобавитьОшибкуОбнаружения")); + Характер.Ошибка.ЕслиСодержитЗначение(Новый Действие(ТестНабор, "ДобавитьОшибкуОбнаружения")); + + // Неверные параметры конструктора или метода жизненного цикла и неверные поля + // ломают набор целиком + ПроцессорыКоллекций.ИзНабора( + ?(Завязь.ЭтоКонструктор(), Списки.ИзЭлементов(Конструктор.Имя), Списки.ИзЭлементов()), + ТестНабор.ПередВсеми(), + ТестНабор.ПередКаждым(), + ТестНабор.ПослеКаждого(), + ТестНабор.ПослеВсех() + ) + .Развернуть("Имена -> Имена.ПроцессорКоллекции()") + .Различные() + .Обработать("Имя -> Ошибки.Получить(Имя)", Новый Структура("Ошибки", Сигнатуры.Ошибки)) + .Развернуть("Ошибка -> Ошибка.ПроцессорКоллекций()") + .ДляКаждого(Новый Действие(ТестНабор, "ДобавитьОшибкуОбнаружения")); + + Сигнатуры.ОшибкиПолей.ДляКаждого(Новый Действие(ТестНабор, "ДобавитьОшибкуОбнаружения")); + + // Регистрацию поставщиков проверяет узел, который получает значения, там, где он + // исполняется: изолированный набор - в своей среде. Набор получает значения для + // конструктора, ПередВсеми и ПослеВсех, а поля заполняет только перед этими + // методами. ПередКаждым, ПослеКаждого и поля перед тестом получают значения там, + // где исполняется тест, - их проверяет тест, см. ОшибкаРегистрацииТеста + Если Не Объявление.Изоляция.СодержитЗначение() Тогда + + ПроцессорыКоллекций.ИзНабора( + ?(Завязь.ЭтоКонструктор(), Списки.ИзЭлементов(Конструктор.Имя), Списки.ИзЭлементов()), + ТестНабор.ПередВсеми(), + ТестНабор.ПослеВсех() + ) + .Развернуть("Имена -> Имена.ПроцессорКоллекции()") + .Различные() + .ДляКаждого( + "Имя -> Обнаружитель.ОшибкаРегистрации(Сигнатуры, Имя).ЕслиСодержитЗначение(ДобавитьОшибку)", + Новый Структура( + "Обнаружитель, Сигнатуры, ДобавитьОшибку", + ЭтотОбъект, + Сигнатуры, + Новый Действие(ТестНабор, "ДобавитьОшибкуОбнаружения") + ) + ); + + Если Не ТестНабор.ПередВсеми().Пусто() Или Не ТестНабор.ПослеВсех().Пусто() Тогда + ТестНабор.ПоляСПоставщиками().ПроцессорКоллекции() + .Обработать(Новый Действие(РазрешениеЗначений, "ОшибкаРегистрацииПоля")) + .ДляКаждого( + "Ошибка -> Ошибка.ЕслиСодержитЗначение(ДобавитьОшибку)", + Новый Структура("ДобавитьОшибку", Новый Действие(ТестНабор, "ДобавитьОшибкуОбнаружения")) + ); + КонецЕсли; + + КонецЕсли; Возврат ТестНабор; КонецФункции +// Проверяет регистрацию поставщиков параметров тестового метода, методов +// ПередКаждым/ПослеКаждого и полей набора в среде исполнения теста. +// +// Параметры: +// Сигнатуры - см. РазрешениеЗначений.ПрочитатьСигнатуры +// ИмяМетода - Строка - Имя тестового метода +// Набор - ОпределениеТестНабора - Набор теста +// +// Возвращаемое значение: +// Опциональный - Первая ошибка регистрации (ИнформацияОбОшибке), пустой - поставщики +// зарегистрированы +// +Функция ОшибкаРегистрацииТеста(Сигнатуры, Знач ИмяМетода, Набор) + + Ошибка = Новый Опциональный( + ПроцессорыКоллекций.ИзНабора( + Списки.ИзЭлементов(ИмяМетода), + Набор.ПередКаждым(), + Набор.ПослеКаждого() + ) + .Развернуть("Имена -> Имена.ПроцессорКоллекции()") + .Различные() + .Обработать( + "Имя -> Обнаружитель.ОшибкаРегистрации(Сигнатуры, Имя)", + Новый Структура("Обнаружитель, Сигнатуры", ЭтотОбъект, Сигнатуры) + ) + .Фильтровать("Ошибка -> Ошибка.СодержитЗначение()") + .Обработать("Ошибка -> Ошибка.Получить()") + .ПолучитьПервый(), + Истина + ); + + Если Ошибка.СодержитЗначение() Тогда + Возврат Ошибка; + КонецЕсли; + + Возврат Новый Опциональный( + Набор.ПоляСПоставщиками().ПроцессорКоллекции() + .Обработать(Новый Действие(РазрешениеЗначений, "ОшибкаРегистрацииПоля")) + .Фильтровать("Ошибка -> Ошибка.СодержитЗначение()") + .Обработать("Ошибка -> Ошибка.Получить()") + .ПолучитьПервый(), + Истина + ); + +КонецФункции + +// Проверяет, что поставщики параметров метода зарегистрированы в текущей поделке, +// см. РазрешениеЗначений.ОшибкаРегистрации +// +// Параметры: +// Сигнатуры - см. РазрешениеЗначений.ПрочитатьСигнатуры +// ИмяМетода - Строка - Имя метода +// +// Возвращаемое значение: +// Опциональный - Ошибка регистрации (ИнформацияОбОшибке), пустой - поставщики +// зарегистрированы либо сигнатура отсутствует из-за ошибки объявления +// +Функция ОшибкаРегистрации(Сигнатуры, Знач ИмяМетода) Экспорт + + Сигнатура = Сигнатуры.Сигнатуры.Получить(ИмяМетода); + + Если Не Сигнатура.СодержитЗначение() Тогда + Возврат Опциональные.Пустой(); + КонецЕсли; + + Возврат РазрешениеЗначений.ОшибкаРегистрации(Сигнатура.Получить()); + +КонецФункции + +// Разбирает характер набора - параметр Характер аннотации &ТестовыйНабор. Неверное +// объявление не прерывает обнаружение: оно становится ошибкой обнаружения набора, +// а набор остается компанейским +// +// Параметры: +// Конструктор - ДанныеМетода - Конструктор набора или его завязь +// +// Возвращаемое значение: +// Структура - Итог разбора: +// * Одиночка - Булево - Набор-одиночка: экземпляр один на прогон +// * Ошибка - Опциональный - Ошибка объявления (ИнформацияОбОшибке), пустой - объявление верное +// +Функция РазборХарактера(Конструктор) + + Попытка + Возврат Новый Структура("Одиночка, Ошибка", ЭтоОдиночка(Конструктор), Опциональные.Пустой()); + Исключение + Возврат Новый Структура("Одиночка, Ошибка", Ложь, Новый Опциональный(ИнформацияОбОшибке())); + КонецПопытки; + +КонецФункции + +Функция ЭтоОдиночка(Конструктор) + + // От &ТестовыйНабор autumn получает всегда компанейский характер, поэтому вторая + // аннотация Характер - явная. Одиночку по ней autumn держал бы, пока жива + // поделка, а не один прогон + Если РаботаСАннотациями.ПолучитьАннотации(Конструктор, "Характер").Количество() > 1 Тогда + ВызватьИсключение + "Характер тестового набора задается параметром Характер аннотации ТестовыйНабор, а не аннотацией Характер"; + КонецЕсли; + + Характер = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( + РаботаСАннотациями.ПолучитьАннотацию(Конструктор, "ТестовыйНабор"), + "Характер", + ХарактерыЖелудей.Компанейский() + ); + + Если Характер <> ХарактерыЖелудей.Одиночка() И Характер <> ХарактерыЖелудей.Компанейский() Тогда + ВызватьИсключение СтрШаблон( + "В аннотации ТестовыйНабор неизвестный характер: %1. Допустимы %2 и %3", + Характер, + ХарактерыЖелудей.Одиночка(), + ХарактерыЖелудей.Компанейский() + ); + КонецЕсли; + + Возврат Характер = ХарактерыЖелудей.Одиночка(); + +КонецФункции + // Разбирает объявление изоляции метода. Неверное объявление не прерывает // обнаружение: оно становится ошибкой обнаружения узла, а узел остается // неизолированным @@ -395,8 +605,7 @@ КонецФункции -// Строит описание изоляции по аннотации &Изолированный. Экспортная, потому что -// вызывается через Действие, а Действие работает только с экспортными методами +// Формирует описание изоляции по аннотации Изолированный // // Параметры: // Аннотация - СтрокаТабличнойЧасти - Аннотация &Изолированный @@ -497,13 +706,15 @@ Процедура ПриСозданииОбъекта( &Пластилин Поделка, &Пластилин ПутиКТестовымНаборам, + &Пластилин("РазрешениеЗначений") Разрешение, &Пластилин("Фильтр", Тип = "Список") Фильтры, &Деталька("OneUnit.ВыполняетсяВИзоляции", ЗначениеПоУмолчанию = Ложь) ВыполняетсяВИзоляции) - _Поделка = Поделка; - _Фильтры = Фильтры; + _Поделка = Поделка; + _Фильтры = Фильтры; _ВыполняетсяВИзоляции = ВыполняетсяВИзоляции; _ПутиКТестовымНаборам = ПутиКТестовымНаборам; + РазрешениеЗначений = Разрешение; _КорневыеАннотацииУсловий = Новый СписокМассив; _КорневыеАннотацииУсловий.Добавить("ВыключенЕсли"); diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\235\320\260\320\261\320\276\321\200\320\260.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\235\320\260\320\261\320\276\321\200\320\260.os" index 95362e7..d477c4d 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\235\320\260\320\261\320\276\321\200\320\260.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\235\320\260\320\261\320\276\321\200\320\260.os" @@ -13,6 +13,15 @@ Перем _Изоляция; Перем _Исполнитель; Перем _ОшибкиОбнаружения; +Перем Сигнатуры; // КартаСоответствие из КлючИЗначение - Сигнатуры (СигнатураМетода) методов по именам + +// Опциональный - Сигнатура (СигнатураМетода) конструктора, пустой - набор +// создается завязью без параметров +Перем СигнатураКонструктора; + +Перем ПоляСПоставщиками; // ФиксированныйСписок из КонтекстПоля - Поля, значения которых дают поставщики +Перем Контекст; // КонтекстИсполнения - Контекст исполнения набора +Перем Одиночка; // Булево - Набор-одиночка: экземпляр один на прогон Перем ДетиОтсортированы; @@ -134,6 +143,61 @@ КонецФункции +// Возвращает сигнатуру метода по имени. +// Вызывает исключение, если сигнатура отсутствует. +// +// Параметры: +// ИмяМетода - Строка - Имя метода +// +// Возвращаемое значение: +// СигнатураМетода - Сигнатура метода +// +Функция Сигнатура(Знач ИмяМетода) Экспорт + Возврат Сигнатуры.Получить(ИмяМетода).ИначеВызватьИсключение( + Новый ИнформацияОбОшибке( + СтрШаблон("Не найдена сигнатура метода %1 в тестовом наборе %2", ИмяМетода, Имя()), + Неопределено + ) + ); +КонецФункции + +// Ищет сигнатуру конструктора набора +// +// Возвращаемое значение: +// Опциональный - Сигнатура (СигнатураМетода), пустой - набор создается завязью +// без параметров или объявление конструктора неверное +// +Функция НайтиСигнатуруКонструктора() Экспорт + Возврат СигнатураКонструктора; +КонецФункции + +// Поля набора с поставщиками значений +// +// Возвращаемое значение: +// ФиксированныйСписок из КонтекстПоля - Поля с поставщиками +// +Функция ПоляСПоставщиками() Экспорт + Возврат ПоляСПоставщиками; +КонецФункции + +// Контекст исполнения набора +// +// Возвращаемое значение: +// КонтекстИсполнения - Контекст набора +// +Функция Контекст() Экспорт + Возврат Контекст; +КонецФункции + +// Признак использования одного экземпляра набора в пределах прогона +// +// Возвращаемое значение: +// Булево - Истина - набор одиночка +// +Функция Одиночка() Экспорт + Возврат Одиночка; +КонецФункции + Функция ПередВсеми() Экспорт Возврат _ЖизненныйЦикл.ПолучитьИлиУмолчание("ПередВсеми", Списки.ИзЭлементов()); КонецФункции @@ -171,7 +235,11 @@ &Блестяшка Условия, &Блестяшка ЖизненныйЦикл, &Блестяшка Изоляция, - &Блестяшка Исполнитель) + &Блестяшка Исполнитель, + &Блестяшка СигнатурыМетодов, + &Блестяшка ОписаниеКонструктора, + &Блестяшка ЗаполняемыеПоля, + &Блестяшка НаборОдиночка) _Дети = Новый СписокМассив; _Определение = Определение; @@ -183,7 +251,14 @@ _Изоляция = Изоляция; _Исполнитель = Исполнитель; _ОшибкиОбнаружения = Новый СписокМассив; - _Путь = ПутиКТестовымНаборам.ПолучитьИлиУмолчание( + Сигнатуры = СигнатурыМетодов; + + СигнатураКонструктора = ОписаниеКонструктора; + ПоляСПоставщиками = Новый ФиксированныйСписок(ЗаполняемыеПоля); + Контекст = Новый КонтекстИсполнения(ЭтотОбъект); + Одиночка = НаборОдиночка; + + _Путь = ПутиКТестовымНаборам.ПолучитьИлиУмолчание( Определение.Имя(), "Не удалось определить путь к тестовому набору" ); diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\260.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\260.os" index 4573f4e..cb0993d 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\260.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\242\320\265\321\201\321\202\320\260.os" @@ -14,6 +14,7 @@ Перем _Исполнитель; Перем _ОшибкиОбнаружения; Перем _ВыводОбнаружения; // Строка - Вывод, перехваченный при обнаружении итераций шаблона +Перем Контекст; // КонтекстИсполнения - Контекст исполнения теста Функция ТипОпределения() Экспорт Возврат _Тип; @@ -143,6 +144,15 @@ КонецФункции +// Контекст исполнения теста или контейнера +// +// Возвращаемое значение: +// КонтекстИсполнения - Контекст теста +// +Функция Контекст() Экспорт + Возврат Контекст; +КонецФункции + Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) // BSLLS:UnusedLocalMethod-off СтандартнаяОбработка = Ложь; Представление = Имя(); @@ -178,5 +188,6 @@ _Исполнитель = Исполнитель; _ОшибкиОбнаружения = Новый СписокМассив; _ВыводОбнаружения = ""; + Контекст = Новый КонтекстИсполнения(ЭтотОбъект); КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\276\321\207\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\276\321\207\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" index bf0f8d6..3c9fb73 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\276\321\207\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\276\321\207\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" @@ -1,9 +1,6 @@ -// Исполняет изолированные наборы и тесты в свежей поделке того же процесса -// (&Изолированный с уровнем "Поделка") и вклеивает их результаты в общий прогон. -// События исполнения изолированного набора ретранслируются в текущий прогон -// по ходу, так что для репортеров и статистики это обычные тесты. -// Для чистого обнаружения (discover) состав изолированного набора обнаруживается -// в свежей поделке без исполнения тестов и вклеивается в план зеркалами. +// Исполнение изолированных наборов и тестов в отдельной поделке текущего процесса. +// Передает состав, события и результаты дочернего прогона в родительский. +// Поддерживает обнаружение состава набора без исполнения тестов. #Использовать autumn #Использовать collectionos @@ -19,14 +16,10 @@ Перем _ПроверкаУсловий; // ПроверкаУсловийИзоляции - Условия узла до подъема среды Перем _ПрерыватьПриПадении; // Булево - Прекращать прогон после первого упавшего теста -// Исполняет изолированный набор или тест в свежей поделке и возвращает его -// результат. События тестов набора ретранслируются в текущий прогон по ходу его -// исполнения, события итераций изолированного контейнера публикуются по итогам. -// Изолированный тест прогоняется набором, отфильтрованным до этого теста, - так -// у теста сохраняется полный жизненный цикл набора, а его условия проверяются -// в его среде, как условия изолированного набора. Но сначала условия проверяются -// здесь: ради выключенного ими узла среда не поднимается, см. ПроверкаУсловийИзоляции. -// Отказ изолированной среды не прерывает прогон - узел помечается сломанным +// Исполняет изолированный узел в отдельной поделке и возвращает его результат. +// Отдельный тест запускается с полным жизненным циклом набора. +// Перед созданием среды проверяет условия пропуска. При отказе среды +// возвращает состояние Сломан с причиной отказа. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Изолированный набор или тест @@ -52,9 +45,8 @@ КонецФункции -// Обнаруживает состав изолированного набора в свежей поделке, не исполняя тесты, -// и наполняет набор зеркалами обнаруженных определений - для чистого обнаружения -// (discover), на состав которого опираются внешние инструменты +// Обнаруживает состав изолированного набора в отдельной поделке +// и добавляет в план зеркала обнаруженных узлов. // // Параметры: // Набор - ОпределениеТестНабора - Изолированный набор @@ -130,8 +122,7 @@ РезультатНабора = Прогон.Статистика.Результат(НаборСреды); Если РезультатНабора.Состояние() <> СостоянияВыполненияТестов.Успех Тогда - // Набор в изолированной среде не выполнился (например, упал ПередВсеми) - - // тест наследует его состояние и причины + // Используем состояние и причины ошибки изолированного набора Возврат РезультатНабора; КонецЕсли; @@ -173,8 +164,7 @@ РезультатКонтейнера = СтатистикаСреды.Результат(УзелСреды); Если РезультатКонтейнера.Состояние() <> СостоянияВыполненияТестов.Успех Тогда - // Контейнер пропущен в изолированной среде (например, по своему условию): - // его итерации не исполнялись и событий не получают + // При состоянии контейнера, отличном от Успех, события итераций не публикуются Возврат РезультатКонтейнера; КонецЕсли; @@ -194,6 +184,9 @@ )); КонецЕсли; + // Добавляем итог закрытия контекста до публикации результата итерации + РезультатДитя.ДобавитьЗакрытие(Дитя.Контекст().Закрыть(Новый Опциональный(РезультатДитя))); + _ПубликаторСобытий.ОпубликоватьСобытие( Дитя, "ИсполнениеТестКонец", @@ -206,10 +199,9 @@ КонецФункции -// Создает свежую поделку по описанию изоляции, прогоняет в ней файл набора и -// возвращает результаты прогона. Отказ среды несет вывод совета и вывод поделки -// до отказа (см. ТестированиеСлужебный.ВызватьСВыводом): причина часто там - -// например, лог autumn о желуде, который не удалось создать +// Создает поделку по описанию изоляции, запускает в ней набор +// и возвращает результаты. При отказе сохраняет вывод совета и дочернего прогона +// в передаваемом исключении. // // Параметры: // Источник - ОпределениеТестНабора, ОпределениеТеста - Определение с описанием изоляции @@ -268,8 +260,7 @@ КонецФункции -// Создает поделку по совету и прогоняет в ней файл набора. Экспортная, потому что -// вызывается через ТестированиеСлужебный.ВыполнитьСПерехватомВывода +// Создает поделку по совету и запускает в ней обнаружение или исполнение набора // // Параметры: // Совет - СоветДругогоМастера - Совет создания поделки, см. ПостроитьСовет diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" index b9a1d23..322b818 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" @@ -57,8 +57,7 @@ Если РаботаСАннотациями.ПолучитьАннотацию(ТестМетод, "ИсточникНеопределено") <> Неопределено Тогда - ЗначенияПараметров = Новый СписокМассив; - ЗначенияПараметров.Вставить(ТестМетод.Параметры.Количество() - 1, Неопределено); + ЗначенияПараметров = НеопределенныеЗначения(КонтекстРасширения.Сигнатура().ПозиционныеПараметры().Количество()); Возврат ПроцессорыКоллекций.ИзНабора(ЗначенияПараметров); @@ -92,24 +91,13 @@ Для Каждого ОписаниеПараметров Из Параметры Цикл - ЗначенияПараметров = Новый СписокМассив; - ЗначенияПараметров.Вставить(ТестМетод.Параметры.Количество() - 1, Неопределено); + ЗначенияПараметров = НеопределенныеЗначения(КонтекстРасширения.Сигнатура().ПозиционныеПараметры().Количество()); Для Каждого ИмяПараметраИЗначение Из ОписаниеПараметров Цикл - - СтрокаПараметр = ТестМетод.Параметры.Найти(ИмяПараметраИЗначение.Ключ, "Имя"); - Если СтрокаПараметр = Неопределено Тогда - - ВызватьИсключение СтрШаблон( - "В методе %1, нет параметра с именем: %2", - ТестМетод.Имя, - ИмяПараметраИЗначение.Ключ - ); - - КонецЕсли; - - ЗначенияПараметров.Установить(ТестМетод.Параметры.Индекс(СтрокаПараметр), ИмяПараметраИЗначение.Значение); - + ЗначенияПараметров.Установить( + ИндексПозиционногоПараметра(КонтекстРасширения.Сигнатура(), ИмяПараметраИЗначение.Ключ), + ИмяПараметраИЗначение.Значение + ); КонецЦикла; Результат.Добавить(ЗначенияПараметров); @@ -122,6 +110,58 @@ КонецФункции +// Возвращает индекс параметра среди параметров без поставщиков. +// Вызывает исключение, если параметр не найден или имеет поставщика значения. +// +// Параметры: +// Сигнатура - СигнатураМетода - Сигнатура тестового метода +// ИмяПараметра - Строка - Имя параметра +// +// Возвращаемое значение: +// Число - Индекс среди позиционных параметров +// +Функция ИндексПозиционногоПараметра(Сигнатура, Знач ИмяПараметра) + + Параметры = Сигнатура.ПозиционныеПараметры(); + Параметр = Новый Опциональный( + Параметры.ПроцессорКоллекции() + .Фильтровать("Параметр -> Параметр.Имя = Имя", Новый Структура("Имя", ИмяПараметра)) + .ПолучитьПервый(), + Истина + ); + + Если Параметр.СодержитЗначение() Тогда + Возврат Параметры.Индекс(Параметр.Получить()); + КонецЕсли; + + Если Сигнатура.Метод().Параметры.Найти(ИмяПараметра, "Имя") = Неопределено Тогда + ВызватьИсключение СтрШаблон( + "В методе %1, нет параметра с именем: %2", + Сигнатура.Метод().Имя, + ИмяПараметра + ); + КонецЕсли; + + ВызватьИсключение СтрШаблон( + "В методе %1 значение параметра %2 дает поставщик значения, источник его не заполняет", + Сигнатура.Метод().Имя, + ИмяПараметра + ); + +КонецФункции + +Функция НеопределенныеЗначения(Знач Количество) + + Значения = Новый СписокМассив; + + Если Количество > 0 Тогда + Значения.Вставить(Количество - 1, Неопределено); + КонецЕсли; + + Возврат Значения; + +КонецФункции + Функция ПараметрыПеречисление(КонтекстРасширения) ТестМетод = КонтекстРасширения.ТестМетод(); diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\243\321\201\320\273\320\276\320\262\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\243\321\201\320\273\320\276\320\262\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" index 689cc71..05a8a2d 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\243\321\201\320\273\320\276\320\262\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\243\321\201\320\273\320\276\320\262\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" @@ -1,14 +1,11 @@ -// Проверяет условия изолированного узла в текущей поделке, до подъема его среды: -// выключенный узел пропускается, не создавая ни поделки, ни дочернего процесса. -// Узел с импортами здесь не проверяется: его условия могут зависеть от библиотек, -// которые подключают только импорты, и решает их только его процесс. -// Условия изолированного теста проверяются на экземпляре его набора - набор -// не изолирован, и его экземпляры и так создаются здесь. Условия изолированного -// набора - без экземпляра: ради условий конструктор изолированного набора вне его -// среды не выполняется (вне среды экземпляр создается только для лямбды совета -// уровня "Поделка" - совет нужен до подъема среды). Условие, упавшее здесь -// (обращается к набору, которого нет), ничего не решает. Узел, которого условия -// здесь не выключили, среда проверяет заново: условие может зависеть от ее деталек +// Проверка условий изолированного узла в родительской среде. +// Позволяет пропустить отключенный узел до создания изолированной среды. +// Узлы с импортами проверяются только в дочернем процессе. +// +// Условия изолированного набора проверяются без экземпляра. Для изолированного теста +// используется экземпляр его набора, если конструктор не содержит параметров +// с поставщиками. Исключения условий в родительской среде игнорируются. +// Если узел не пропущен, его условия повторно проверяются в среде исполнения. #Использовать collectionos @@ -25,8 +22,7 @@ // Структура - Итог проверки: // * Пропуск - Опциональный - Результат (РезультатВыполненияТеста) пропуска, пустой - узел // исполняется в своей среде -// * Вывод - Строка - Вывод создания экземпляра и условий: у пропуска он в результате, -// а узлу, который исполняется в среде, предваряет вывод результата +// * Вывод - Строка - Вывод создания экземпляра и условий, включаемый в результат узла // Функция Проверить(Узел) Экспорт @@ -39,7 +35,7 @@ Если ТипЗнч(Узел) = Тип("ОпределениеТестНабора") Тогда Создание = Новый Структура("Экземпляр, Вывод", Опциональные.Пустой(), ""); Иначе - Создание = _ФабрикаЭкземпляров.Создать(Узел.Набор()); + Создание = _ФабрикаЭкземпляров.СоздатьВнеУзла(Узел.Набор(), Узел); КонецЕсли; Вызов = _ВызовМетода.Вызвать( @@ -68,9 +64,8 @@ КонецФункции -// Возвращает причину пропуска по первому условию, которое выключает узел вне его -// среды. Упавшее условие ничего не решает. Экспортная, потому что вызывается -// через ВызовМетода +// Возвращает причину пропуска по первому отключающему условию. +// Исключения отдельных условий игнорируются. // // Параметры: // Условия - ФиксированныйСписок, СписокМассив из Произвольный - Объекты аннотаций условий diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" index c1e6b97..664a163 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\242\320\265\321\201\321\202\320\276\320\262.os" @@ -1,11 +1,7 @@ -// Исполняет изолированные наборы и тесты в дочернем процессе (&Изолированный -// с уровнем "Процесс") и вклеивает их результаты в общий прогон. События -// исполнения изолированного набора приходят строками вывода процесса и -// ретранслируются в текущий прогон по ходу, так что для репортеров и статистики -// это обычные тесты; результаты изолированного теста переносятся из JSON-отчета -// дочернего прогона. Для чистого обнаружения (discover) состав изолированного -// набора обнаруживается дочерним процессом без исполнения тестов и вклеивается -// в план зеркалами. +// Исполнение изолированных наборов и тестов в дочернем процессе. +// Передает события набора через канал вывода процесса, результаты отдельного теста - +// через JSON-отчет. При обнаружении добавляет в родительский план зеркала узлов +// из состава дочернего прогона. #Использовать collectionos #Использовать lambdas @@ -25,14 +21,10 @@ Перем _ПрерыватьПриПадении; // Булево - Прекращать прогон после первого упавшего теста Перем _Лог; // Лог - Лог ядра -// Исполняет изолированный набор или тест в дочернем процессе и возвращает его -// результат. События тестов набора ретранслируются в текущий прогон по ходу его -// исполнения, события итераций изолированного контейнера публикуются по итогам. -// Изолированный тест прогоняется набором, отфильтрованным до этого теста, - так -// у теста сохраняется полный жизненный цикл набора, а его условия проверяются -// в его среде, как условия изолированного набора. Но условия узла без импортов сначала -// проверяются здесь: ради выключенного ими узла процесс не запускается, см. ПроверкаУсловийИзоляции. -// Отказ изолированной среды не прерывает прогон - узел помечается сломанным +// Исполняет изолированный узел в дочернем процессе и возвращает его результат. +// Отдельный тест запускается с полным жизненным циклом набора. +// Перед запуском процесса проверяет условия пропуска. При отказе среды +// возвращает состояние Сломан с причиной отказа. // // Параметры: // Узел - ОпределениеТестНабора, ОпределениеТеста - Изолированный набор или тест @@ -224,10 +216,15 @@ _ПубликаторСобытий.ОпубликоватьСобытие(Дитя, "ИсполнениеТестНачало", Новый Массив); + РезультатДитя = РезультатТеста(Отчет, Дитя, Вывод); + + // Добавляем итог закрытия контекста до публикации результата итерации + РезультатДитя.ДобавитьЗакрытие(Дитя.Контекст().Закрыть(Новый Опциональный(РезультатДитя))); + _ПубликаторСобытий.ОпубликоватьСобытие( Дитя, "ИсполнениеТестКонец", - Массивы.ИзЭлементов(РезультатТеста(Отчет, Дитя, Вывод)) + Массивы.ИзЭлементов(РезультатДитя) ); КонецЦикла; @@ -259,9 +256,8 @@ КонецФункции -// Возвращает сломанный результат теста, записи которого нет в отчете дочернего -// прогона. Экспортная, потому что ее вызывает лямбда, а лямбде доступны только -// экспортные методы +// Возвращает результат Сломан для теста, отсутствующего в отчете дочернего прогона. +// Вывод дочернего прогона включается в описание причины. // // Параметры: // Тест - ОпределениеТеста - Определение теста или итерации контейнера @@ -373,17 +369,15 @@ КонецФункции -// Возвращает параметры запуска дочернего прогона изолированного набора или теста. -// Вывод дочернего прогона не транслируется в консоль родителя, чтобы не разрывать -// его собственный вывод: результаты тестов переносятся структурно, а захваченный -// вывод используется как причина при аварийном завершении прогона +// Формирует параметры запуска изолированного набора или теста. +// Вывод дочернего процесса сохраняется для диагностики отказов. // // Параметры: // Источник - ОпределениеТестНабора, ОпределениеТеста - Определение с описанием изоляции // ОпределениеНабора - ОпределениеТестНабора - Набор изолированного прогона // // Возвращаемое значение: -// Структура - Параметры запуска, см. ЗапускательТестирования.ПараметрыЗапуска +// см. ЗапускательТестирования.ПараметрыЗапуска // Функция ПараметрыДочернегоПрогона(Источник, ОпределениеНабора) @@ -445,8 +439,8 @@ Функция РезультатНабораИзОтчета(Знач ИмяНабора, Отчет) - // Результат набора в отчете - только у набора, не дошедшего до своих тестов: - // наихудшее состояние тестов родитель агрегирует по событиям сам + // При отсутствии отдельного результата набора используем Успех. + // Результаты тестов агрегируются по событиям исполнения. Возврат Отчет.Наборы.ПолучитьИлиУмолчание(ИмяНабора, РезультатУспех()); КонецФункции diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\321\200\320\265\321\210\320\265\320\275\320\270\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\321\200\320\265\321\210\320\265\320\275\320\270\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" new file mode 100644 index 0000000..ed4ac88 --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\321\200\320\265\321\210\320\265\320\275\320\270\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" @@ -0,0 +1,462 @@ +// Служба поставщиков значений параметров и полей тестовых наборов. +// При обнаружении формирует сигнатуры методов и описания полей. +// При исполнении обрабатывает события ЗаполнениеАргументов и ИсполнениеЭкземплярНабора. + +#Использовать annotations +#Использовать collectionos +#Использовать fluent +#Использовать "../../../shared" + +Перем Поделка; // Поделка - Среда регистрации поставщиков +Перем ПереносРезультатов; // ПереносРезультатов - Причина отказа создания поставщика из лога autumn +Перем РазворачивательАннотаций; // РазворачивательАннотаций - Мета-аннотации аннотаций параметров и полей +Перем ТабакеркаСигнатур; // Табакерка - Сигнатуры методов +Перем ТабакеркаКонтекстовПараметров; // Табакерка - Контексты параметров для поставщиков +Перем ТабакеркаКонтекстовПолей; // Табакерка - Контексты полей для поставщиков + +// Читает сигнатуры методов и описания полей с поставщиками значений. +// Ошибки объявления возвращаются отдельно для каждого метода и поля. +// Регистрация поставщиков проверяется методами ОшибкаРегистрации и ОшибкаРегистрацииПоля. +// +// Параметры: +// ОпределениеЖелудя - ОпределениеЖелудя - Определение желудя набора +// +// Возвращаемое значение: +// Структура - Чтение сигнатур: +// * Сигнатуры - КартаСоответствие из КлючИЗначение - Сигнатуры методов с верным объявлением: +// ** Ключ - Строка - Имя метода +// ** Значение - СигнатураМетода - Сигнатура метода +// * Ошибки - КартаСоответствие из КлючИЗначение - Ошибки объявления остальных методов: +// ** Ключ - Строка - Имя метода +// ** Значение - ИнформацияОбОшибке - Ошибка объявления +// * Поля - СписокМассив из КонтекстПоля - Поля с поставщиками и верным объявлением +// * ОшибкиПолей - СписокМассив из ИнформацияОбОшибке - Ошибки объявления остальных полей +// +Функция ПрочитатьСигнатуры(ОпределениеЖелудя) Экспорт + + Чтение = Новый Структура( + "Сигнатуры, Ошибки, Поля, ОшибкиПолей", + Новый КартаСоответствие, + Новый КартаСоответствие, + Новый СписокМассив, + Новый СписокМассив + ); + + ТипЖелудя = ОпределениеЖелудя.ТипЖелудя(); + + // Свежие таблицы встроенного рефлектора: таблицы библиотеки reflector общие + // на процесс, и autumn разворачивает аннотации параметров конструктора прямо + // в них - повторное разворачивание задвоило бы мета-аннотации + Рефлектор = Новый Рефлектор(); + + Для Каждого Метод Из Рефлектор.ПолучитьТаблицуМетодов(ТипЖелудя) Цикл + + Попытка + Чтение.Сигнатуры.Вставить(Метод.Имя, ПрочитатьСигнатуру(Метод, ТипЖелудя)); + Исключение + Чтение.Ошибки.Вставить(Метод.Имя, ИнформацияОбОшибке()); + КонецПопытки; + + КонецЦикла; + + Для Каждого Поле Из Рефлектор.ПолучитьТаблицуСвойств(ТипЖелудя, Истина) Цикл + + Попытка + ПрочитатьПоле(Поле, ТипЖелудя).ЕслиСодержитЗначение(Новый Действие(Чтение.Поля, "Добавить")); + Исключение + Чтение.ОшибкиПолей.Добавить(ИнформацияОбОшибке()); + КонецПопытки; + + КонецЦикла; + + Возврат Чтение; + +КонецФункции + +// Заполняет аргументы вызова значениями поставщиков в контексте указанного узла. +// Обработчик события ЗаполнениеАргументов. Ошибка поставщика включается в цепочку +// причин исключения с описанием параметра. +// +// Параметры: +// Узел - ОпределениеТестНабора, ОпределениеТеста - Узел, в контексте которого +// поставщики дают значения +// Аргументы - АргументыВызова - Заполняемые аргументы +// +&ПодпискаНаСобытие("ЗаполнениеАргументов") +Процедура ЗаполнитьАргументы(Узел, Аргументы) Экспорт + + Сигнатура = Узел.Набор().Сигнатура(Аргументы.Метод().Имя); + + КонтекстЗаполнения = Новый Структура( + "Аргументы, Разрешение, Сигнатура, Контекст", + Аргументы, + ЭтотОбъект, + Сигнатура, + Узел.Контекст() + ); + + Аргументы.ИндексыЗаполняемыхПараметров().ПроцессорКоллекции() + .Фильтровать("Индекс -> Сигнатура.Поставщик(Индекс).СодержитЗначение()", КонтекстЗаполнения) + .ДляКаждого( + "Индекс -> Аргументы.Установить(Индекс, Разрешение.ЗначениеПараметра(Сигнатура, Индекс, Контекст))", + КонтекстЗаполнения + ); + +КонецПроцедуры + +// Заполняет поля экземпляра значениями поставщиков в контексте указанного узла. +// Обработчик события ИсполнениеЭкземплярНабора. Ошибка поставщика включается +// в цепочку причин исключения с описанием поля. +// +// Параметры: +// Узел - ОпределениеТестНабора, ОпределениеТеста - Узел, перед методами которого +// готовится экземпляр +// Экземпляр - Произвольный - Объект сценария набора +// +&ПодпискаНаСобытие("ИсполнениеЭкземплярНабора") +Процедура ЗаполнитьПоля(Узел, Экземпляр) Экспорт + + Набор = ?(ТипЗнч(Узел) = Тип("ОпределениеТестНабора"), Узел, Узел.Набор()); + + Если Набор.ПоляСПоставщиками().Пусто() Тогда + Возврат; + КонецЕсли; + + Рефлектор = Новый Рефлектор(); + + Набор.ПоляСПоставщиками().ДляКаждого( + "Поле -> { + | Рефлектор.УстановитьСвойство( + | Экземпляр, + | Поле.Имя(), + | Разрешение.ЗначениеПоставщика( + | Поле.Поставщик(), + | Поле, + | Контекст, + | СтрШаблон(""Не удаётся разрешить поле %1"", Поле.Имя()) + | ) + | ); + |}", + Новый Структура("Рефлектор, Экземпляр, Разрешение, Контекст", Рефлектор, Экземпляр, ЭтотОбъект, Узел.Контекст()) + ); + +КонецПроцедуры + +Функция ПрочитатьСигнатуру(Метод, ТипЖелудя) + + РазворачивательАннотаций.РазвернутьАннотацииСвойства(Метод, ТипЖелудя); + РазворачивательАннотаций.РазвернутьАннотацииСвойств(Метод.Параметры, ТипЖелудя); + + Поставщики = ПроцессорыКоллекций.ИзКоллекции(Метод.Параметры) + .Обработать( + "Параметр -> { + | Возврат Разрешение.ПоставщикЭлемента( + | Параметр, + | СтрШаблон(""параметра %1 метода %2"", Параметр.Имя, ИмяМетода) + | ); + |}", + Новый Структура("Разрешение, ИмяМетода", ЭтотОбъект, Метод.Имя) + ) + .Получить("СписокМассив"); + + Возврат ТабакеркаСигнатур.Достать(Массивы.ИзЭлементов(Метод, Поставщики)); + +КонецФункции + +// Создает контекст поля с поставщиком значения +// +// Параметры: +// Поле - СтрокаТаблицыЗначений - Метаданные поля +// ТипЖелудя - Тип - Тип набора +// +// Возвращаемое значение: +// Опциональный - Контекст поля (КонтекстПоля), пустой - у поля нет поставщика +// +Функция ПрочитатьПоле(Поле, ТипЖелудя) + + РазворачивательАннотаций.РазвернутьАннотацииСвойства(Поле, ТипЖелудя); + + Поставщик = ПоставщикЭлемента(Поле, СтрШаблон("поля %1", Поле.Имя)); + + Если Не Поставщик.СодержитЗначение() Тогда + Возврат Опциональные.Пустой(); + КонецЕсли; + + Возврат Новый Опциональный(ТабакеркаКонтекстовПолей.Достать(Массивы.ИзЭлементов(Поле, Поставщик.Получить()))); + +КонецФункции + +// Возвращает имя поставщика параметра или поля по его аннотациям +// +// Параметры: +// Элемент - СтрокаТаблицыЗначений - Данные параметра или поля с развернутыми аннотациями +// Описание - Строка - Описание элемента в родительном падеже для ошибок, например +// "параметра Каталог метода Тест" +// +// Возвращаемое значение: +// Опциональный - Имя поставщика (Строка), пустой - у элемента нет поставщика +// +Функция ПоставщикЭлемента(Элемент, Знач Описание) Экспорт + + Поставщики = ПроцессорыКоллекций.ИзКоллекции( + РаботаСАннотациями.ПолучитьАннотации(Элемент, "ПоставщикЗначения") + ) + .Обработать("Аннотация -> РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация)") + .ВМассив(); + + Если Поставщики.Количество() = 0 Тогда + Возврат Опциональные.Пустой(); + КонецЕсли; + + Если Поставщики.Количество() > 1 Тогда + ВызватьИсключение СтрШаблон( + "У %1 несколько поставщиков: %2", + Описание, + СтрСоединить(Поставщики, ", ") + ); + КонецЕсли; + + Возврат Новый Опциональный(Поставщики[0]); + +КонецФункции + +// Проверяет регистрацию поставщиков параметров метода в текущей поделке. +// Проверку выполняют в среде исполнения узла. +// +// Параметры: +// Сигнатура - СигнатураМетода - Сигнатура метода +// +// Возвращаемое значение: +// Опциональный - Первая ошибка поиска поставщика (ИнформацияОбОшибке); +// пустой - все поставщики найдены +// +Функция ОшибкаРегистрации(Сигнатура) Экспорт + + Для Индекс = 0 По Сигнатура.Метод().Параметры.Количество() - 1 Цикл + + Поставщик = Сигнатура.Поставщик(Индекс); + + Если Не Поставщик.СодержитЗначение() Тогда + Продолжить; + КонецЕсли; + + Ошибка = ОшибкаПоиска( + Поставщик.Получить(), + СтрШаблон( + " у параметра %1 метода %2", + Сигнатура.Метод().Параметры.Получить(Индекс).Имя, + Сигнатура.Метод().Имя + ) + ); + + Если Ошибка.СодержитЗначение() Тогда + Возврат Ошибка; + КонецЕсли; + + КонецЦикла; + + Возврат Опциональные.Пустой(); + +КонецФункции + +// Проверяет, что поставщик поля зарегистрирован в текущей поделке, см. ОшибкаРегистрации +// +// Параметры: +// Поле - КонтекстПоля - Поле с поставщиком +// +// Возвращаемое значение: +// Опциональный - Ошибка (ИнформацияОбОшибке) поиска поставщика, см. ОшибкаПоиска; +// пустой - поставщик найден +// +Функция ОшибкаРегистрацииПоля(Поле) Экспорт + Возврат ОшибкаПоиска(Поле.Поставщик(), " у поля " + Поле.Имя()); +КонецФункции + +// Проверяет доступность поставщика по имени в текущей поделке. +// Отсутствие поставщика и исключения поиска возвращаются как ошибки. +// +// Параметры: +// ИмяПоставщика - Строка - Имя желудя-поставщика +// Где - Строка - Уточнение элемента, например " у поля Каталог" +// +// Возвращаемое значение: +// Опциональный - Ошибка (ИнформацияОбОшибке): «Не найден поставщик ... желудь +// не зарегистрирован» или «Не удаётся найти поставщик ...» по причине +// исключения autumn; пустой - поставщик найден +// +Функция ОшибкаПоиска(Знач ИмяПоставщика, Знач Где) + + Попытка + Определение = Поделка.ПолучитьОпределениеЖелудя(ИмяПоставщика); + Исключение + Возврат Новый Опциональный(ВыброшеннаяОшибка( + СтрШаблон("Не удаётся найти поставщик %1%2", ИмяПоставщика, Где), + ИнформацияОбОшибке() + )); + КонецПопытки; + + Если Определение = Неопределено Тогда + Возврат Новый Опциональный(ВыброшеннаяОшибка( + СтрШаблон("Не найден поставщик %1%2: желудь не зарегистрирован", ИмяПоставщика, Где) + )); + КонецЕсли; + + Возврат Опциональные.Пустой(); + +КонецФункции + +// Создает информацию об ошибке с заполненными сведениями о месте возникновения +// +// Параметры: +// Описание - Строка - Описание ошибки +// Причина - ИнформацияОбОшибке - Причина ошибки +// - Неопределено - Причина не задана +// +// Возвращаемое значение: +// ИнформацияОбОшибке - Ошибка +// +Функция ВыброшеннаяОшибка(Знач Описание, Причина = Неопределено) + + Попытка + ВызватьИсключение Новый ИнформацияОбОшибке(Описание, Неопределено, Причина); + Исключение + Возврат ИнформацияОбОшибке(); + КонецПопытки; + +КонецФункции + +// Получает значение параметра у поставщика в контексте исполнения. +// +// Параметры: +// Сигнатура - СигнатураМетода - Сигнатура вызываемого метода +// Индекс - Число - Индекс параметра в сигнатуре, начиная с нуля +// Контекст - КонтекстИсполнения - Контекст узла +// +// Возвращаемое значение: +// Произвольный - Значение поставщика +// +Функция ЗначениеПараметра(Сигнатура, Знач Индекс, Контекст) Экспорт + + КонтекстПараметра = ТабакеркаКонтекстовПараметров.Достать(Массивы.ИзЭлементов(Сигнатура.Метод(), Индекс)); + + Возврат ЗначениеПоставщика( + Сигнатура.Поставщик(Индекс).Получить(), + КонтекстПараметра, + Контекст, + СтрШаблон("Не удаётся разрешить параметр %1 метода %2", КонтекстПараметра.Имя(), Сигнатура.Метод().Имя) + ); + +КонецФункции + +// Получает значение у поставщика в указанном контексте. +// Ошибка поставщика включается в цепочку причин исключения с описанием элемента. +// +// Параметры: +// ИмяПоставщика - Строка - Имя желудя-поставщика +// КонтекстЭлемента - КонтекстПараметра, КонтекстПоля - Элемент, которому нужно значение +// Контекст - КонтекстИсполнения - Контекст узла +// ОписаниеОтказа - Строка - Описание ошибки, которая оборачивает исключение поставщика +// +// Возвращаемое значение: +// Произвольный - Значение поставщика +// +Функция ЗначениеПоставщика(Знач ИмяПоставщика, КонтекстЭлемента, Контекст, Знач ОписаниеОтказа) Экспорт + + Поставщик = ЭкземплярПоставщика(ИмяПоставщика, ОписаниеОтказа); + + Попытка + Возврат Поставщик.Значение(КонтекстЭлемента, Контекст); + Исключение + ВызватьИсключение Новый ИнформацияОбОшибке(ОписаниеОтказа, Неопределено, ИнформацияОбОшибке()); + КонецПопытки; + +КонецФункции + +// Получает экземпляр поставщика и перехватывает вывод его создания. +// Если экземпляр не получен, вызывает исключение с причиной отказа. +// +// Параметры: +// ИмяПоставщика - Строка - Имя желудя-поставщика +// ОписаниеОтказа - Строка - Описание ошибки, которая оборачивает отказ создания +// +// Возвращаемое значение: +// Произвольный - Желудь-поставщик +// +Функция ЭкземплярПоставщика(Знач ИмяПоставщика, Знач ОписаниеОтказа) + + Создание = ТестированиеСлужебный.ВыполнитьСПерехватомВывода( + Поделка, + "НайтиЖелудь", + Списки.ИзЭлементов(ИмяПоставщика) + ); + + Если Создание.Ошибка.СодержитЗначение() Тогда + ВызватьИсключение Новый ИнформацияОбОшибке( + ОписаниеОтказа, + Неопределено, + ТестированиеСлужебный.ОшибкаСВыводом(Создание.Ошибка.Получить(), Создание.Вывод) + ); + КонецЕсли; + + Если Не Создание.Значение.СодержитЗначение() Тогда + ВызватьИсключение Новый ИнформацияОбОшибке( + ОписаниеОтказа, + Неопределено, + ПричинаОтказаСоздания(ИмяПоставщика, Создание.Вывод) + ); + КонецЕсли; + + ТестированиеСлужебный.ПередатьВывод(Создание.Вывод); + + Возврат Создание.Значение.Получить(); + +КонецФункции + +// Причина отказа создания поставщика: перехваченный лог autumn с исключением +// конструктора, см. ФабрикаЭкземпляров +// +// Параметры: +// ИмяПоставщика - Строка - Имя желудя-поставщика +// Вывод - Строка - Перехваченный вывод создания +// +// Возвращаемое значение: +// ИнформацияОбОшибке - Причина «Не удалось создать поставщик ...» +// +Функция ПричинаОтказаСоздания(Знач ИмяПоставщика, Знач Вывод) + + Вывод = ПереносРезультатов.РазвернутьЗаписиЛога(Вывод); + + Если Не ЗначениеЗаполнено(СокрЛП(Вывод)) Тогда + Вывод = ""; + КонецЕсли; + + Возврат ПереносРезультатов.ПричинаСГотовымОписанием( + СтрШаблон("Не удалось создать поставщик %1", ИмяПоставщика), + СтрШаблон( + " + |По причине: + |%1 + |", + Вывод + ) + ); + +КонецФункции + +&Желудь +Процедура ПриСозданииОбъекта( + &Пластилин("Поделка") ПоделкаПрогона, + &Пластилин("ПереносРезультатов") Перенос, + &Пластилин("РазворачивательАннотаций") Разворачиватель, + &Табакерка &Пластилин("СигнатураМетода") Сигнатуры, + &Табакерка &Пластилин("КонтекстПараметра") КонтекстыПараметров, + &Табакерка &Пластилин("КонтекстПоля") КонтекстыПолей) + + Поделка = ПоделкаПрогона; + ПереносРезультатов = Перенос; + РазворачивательАннотаций = Разворачиватель; + ТабакеркаСигнатур = Сигнатуры; + ТабакеркаКонтекстовПараметров = КонтекстыПараметров; + ТабакеркаКонтекстовПолей = КонтекстыПолей; + +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217\320\242\320\265\321\201\321\202\320\260.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217\320\242\320\265\321\201\321\202\320\260.os" index e76e6a8..8c18e7d 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217\320\242\320\265\321\201\321\202\320\260.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217\320\242\320\265\321\201\321\202\320\260.os" @@ -1,11 +1,14 @@ +#Использовать fluent #Использовать "../../../shared" Перем _Состояние; Перем _Причины; Перем _Вывод; -Перем _ОписанияПричин; -Перем _ПеренесенноеВремяВыполнения; // Опциональный - Время в миллисекундах, измеренное изолированной средой, - // пустой - не переносилось +Перем ОписанияПричин; + +// Опциональный - Время в миллисекундах, измеренное изолированной средой, +// пустой - не переносилось +Перем ПеренесенноеВремяВыполнения; Функция Состояние() Экспорт Возврат _Состояние; @@ -16,23 +19,21 @@ КонецФункции Функция ОписанияПричин() Экспорт - Возврат _ОписанияПричин; + Возврат ОписанияПричин; КонецФункции Функция Вывод() Экспорт Возврат _Вывод; КонецФункции -// Время выполнения, измеренное средой, где тест выполнялся на самом деле. -// Результат изолированного теста публикуется родителю, когда тест уже -// отработал, и замер родителя показал бы время доставки, а не выполнения +// Время выполнения, измеренное в изолированной среде // // Возвращаемое значение: // Опциональный - Время выполнения в миллисекундах, пустой - время измеряет // статистика текущего прогона // Функция ПеренесенноеВремяВыполнения() Экспорт - Возврат _ПеренесенноеВремяВыполнения; + Возврат ПеренесенноеВремяВыполнения; КонецФункции // Переносит в результат время выполнения, измеренное изолированной средой. @@ -45,13 +46,12 @@ // РезультатВыполненияТеста - Этот результат // Функция ПеренестиВремяВыполнения(Знач Миллисекунды) Экспорт - _ПеренесенноеВремяВыполнения = Новый Опциональный(Миллисекунды); + ПеренесенноеВремяВыполнения = Новый Опциональный(Миллисекунды); Возврат ЭтотОбъект; КонецФункции -// Дополняет вывод результата выводом, перехваченным до исполнения узла вне его -// исполнителя: при обнаружении шаблона, при подготовке изолированной среды. -// Вызывается до публикации результата +// Добавляет указанный текст перед текущим выводом результата. +// Изменение выполняется до публикации результата. // // Параметры: // Вывод - Строка - Предшествующий вывод @@ -64,6 +64,52 @@ Возврат ЭтотОбъект; КонецФункции +// Добавляет вывод и исключения действий закрытия к результату узла. +// При наличии исключений учитывает состояние Сломан при выборе итогового состояния. +// Изменение выполняется до публикации результата. +// +// Параметры: +// Закрытие - см. КонтекстИсполнения.Закрыть +// +// Возвращаемое значение: +// РезультатВыполненияТеста - Этот результат +// +Функция ДобавитьЗакрытие(Закрытие) Экспорт + + _Вывод = _Вывод + Закрытие.Вывод; + + Если Закрытие.Причины.Пусто() Тогда + Возврат ЭтотОбъект; + КонецЕсли; + + _Состояние = СостоянияВыполненияТестов.НаихудшееСостояние(_Состояние, СостоянияВыполненияТестов.Сломан); + + _Причины = ПроцессорыКоллекций.ИзНабора(_Причины, Закрытие.Причины) + .Развернуть("Причины -> ПроцессорыКоллекций.ИзКоллекции(Причины)") + .Получить("СписокМассив"); + + ОписанияПричин = ОписанияПричинИз(_Причины); + + Возврат ЭтотОбъект; + +КонецФункции + +Функция ОписанияПричинИз(Причины) + + Возврат ПроцессорыКоллекций.ИзКоллекции(Причины) + .Обработать("Причина -> { + | + | Если ТипЗнч(Причина) = Тип(""Строка"") Тогда + | Возврат Причина; + | КонецЕсли; + | + | Возврат ТестированиеСлужебный.КраткоеОписаниеОшибки(Причина); + | + |}") + .Получить("СписокМассив"); + +КонецФункции + Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) // BSLLS:UnusedLocalMethod-off СтандартнаяОбработка = Ложь; Представление = СтрШаблон("%1 %2", Состояние(), ОписанияПричин()); @@ -77,15 +123,8 @@ _Причины = Причины; _Вывод = Вывод; - _ПеренесенноеВремяВыполнения = Опциональные.Пустой(); + ПеренесенноеВремяВыполнения = Опциональные.Пустой(); - _ОписанияПричин = Новый СписокМассив(_Причины); - _ОписанияПричин.ЗаменитьВсе("Причина -> { - | Если ТипЗнч(Причина) = Тип(""Строка"") Тогда - | Возврат Причина; - | Иначе - | Возврат ТестированиеСлужебный.КраткоеОписаниеОшибки(Причина); - | КонецЕсли; - |}"); + ОписанияПричин = ОписанияПричинИз(_Причины); КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\321\200\321\202\320\265\321\200\320\237\320\273\320\260\320\275JSON.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\321\200\321\202\320\265\321\200\320\237\320\273\320\260\320\275JSON.os" index 6925de3..0146015 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\321\200\321\202\320\265\321\200\320\237\320\273\320\260\320\275JSON.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\321\200\321\202\320\265\321\200\320\237\320\273\320\260\320\275JSON.os" @@ -1,7 +1,6 @@ -// Записывает состав тест-плана в JSON-файл без результатов исполнения и читает -// его обратно: канал передачи состава изолированного набора из дочернего процесса -// обнаружения родителю. Имена полей записей - формат обмена, прикладной код -// работает с составом плана, см. СоставПлана. +// Чтение и запись состава тест-плана в формате JSON. +// Используется для передачи обнаруженных наборов и тестов между изолированной средой +// и родительским прогоном. Результаты исполнения в состав плана не входят. #Использовать collectionos #Использовать fs @@ -58,21 +57,32 @@ КонецФункции -// Возвращает состав тест-плана: тот же состав, что уходит в файл плана, -// передается и трансляцией событий изолированного прогона +// Возвращает состав тест-плана для записи в файл и передачи событий изоляции // // Параметры: // ТестПлан - ТестПлан - Составленный тест-план // // Возвращаемое значение: // СписокМассив из Структура - Наборы плана: -// * Имя - Строка - Имя набора -// * Тесты - см. УзлыСостава +// * Имя - Строка - Имя набора +// * Тесты - см. УзлыСостава +// * Ошибки - ФиксированныйСписок из ИнформацияОбОшибке - Ошибки обнаружения набора; +// пустой список - ошибок нет // Функция СоставПлана(ТестПлан) Экспорт Возврат ТестПлан.Дети().ПроцессорКоллекции() - .Обработать("Набор -> Новый Структура(""Имя, Тесты"", Набор.Имя(), УзлыСостава(Набор))", ЭтотОбъект) + .Обработать( + "Набор -> { + | Возврат Новый Структура( + | ""Имя, Тесты, Ошибки"", + | Набор.Имя(), + | УзлыСостава(Набор), + | Набор.ОшибкиОбнаружения() + | ); + |}", + ЭтотОбъект + ) .Получить("СписокМассив"); КонецФункции @@ -83,14 +93,26 @@ // Состав - см. СоставПлана // // Возвращаемое значение: -// Массив из Структура - Записи наборов: -// * suite - Строка - Имя набора -// * tests - см. ЗаписиУзлов +// Массив из Структура - Записи наборов, поле errors - только у набора с ошибками обнаружения: +// * suite - Строка - Имя набора +// * tests - см. ЗаписиУзлов +// * errors - см. ЗаписиОшибок // Функция ЗаписиСостава(Состав) Экспорт Возврат Состав.ПроцессорКоллекции() - .Обработать("Набор -> Новый Структура(""suite, tests"", Набор.Имя, ЗаписиУзлов(Набор.Тесты))", ЭтотОбъект) + .Обработать( + "Набор -> { + | Запись = Новый Структура(""suite, tests"", Набор.Имя, ЗаписиУзлов(Набор.Тесты)); + | + | Если Не Набор.Ошибки.Пусто() Тогда + | Запись.Вставить(""errors"", ЗаписиОшибок(Набор.Ошибки)); + | КонецЕсли; + | + | Возврат Запись; + |}", + ЭтотОбъект + ) .ВМассив(); КонецФункции @@ -106,14 +128,23 @@ Функция СоставЗаписей(Записи) Экспорт Возврат ПроцессорыКоллекций.ИзКоллекции(Записи) - .Обработать("Запись -> Новый Структура(""Имя, Тесты"", Запись.suite, УзлыЗаписей(Запись.tests))", ЭтотОбъект) + .Обработать( + "Запись -> { + | Возврат Новый Структура( + | ""Имя, Тесты, Ошибки"", + | Запись.suite, + | УзлыЗаписей(Запись.tests), + | ?(Запись.Свойство(""errors""), ОшибкиЗаписей(Запись.errors), Списки.ИзЭлементов()) + | ); + |}", + ЭтотОбъект + ) .Получить("СписокМассив"); КонецФункции -// Возвращает узлы состава: детей набора или контейнера, у теста детей нет. -// Экспортная, потому что ее рекурсивно вызывают лямбды, а лямбдам доступны -// только экспортные методы +// Возвращает состав дочерних узлов набора или контейнера. +// Для теста возвращает пустой список. // // Параметры: // Родитель - ОпределениеТестНабора, ОпределениеТеста - Набор, контейнер или тест @@ -147,8 +178,7 @@ КонецФункции -// Переводит узлы состава в записи формата обмена. Экспортная, потому что -// ее рекурсивно вызывают лямбды, а лямбдам доступны только экспортные методы +// Преобразует узлы состава в записи формата обмена // // Параметры: // Узлы - см. УзлыСостава @@ -186,14 +216,13 @@ КонецФункции -// Переводит ошибки обнаружения узла в записи формата обмена. Экспортная, потому -// что ее вызывает лямбда, а лямбде доступны только экспортные методы +// Преобразует ошибки обнаружения в записи формата обмена // // Параметры: // Ошибки - ФиксированныйСписок из ИнформацияОбОшибке - Ошибки обнаружения узла // // Возвращаемое значение: -// Массив из Структура - Записи ошибок, см. ПереносРезультатов.ЗаписьПричины +// Массив из см. ПереносРезультатов.ЗаписьПричины - Записи ошибок // Функция ЗаписиОшибок(Ошибки) Экспорт @@ -203,8 +232,7 @@ КонецФункции -// Восстанавливает ошибки обнаружения узла по записям формата обмена. Экспортная, -// потому что ее вызывает лямбда, а лямбде доступны только экспортные методы +// Восстанавливает ошибки обнаружения из записей формата обмена // // Параметры: // Записи - см. ЗаписиОшибок @@ -222,8 +250,7 @@ КонецФункции -// Восстанавливает узлы состава по записям формата обмена. Экспортная, потому что -// ее рекурсивно вызывают лямбды, а лямбдам доступны только экспортные методы +// Восстанавливает узлы состава из записей формата обмена // // Параметры: // Записи - см. ЗаписиУзлов diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\321\202\321\200\320\260\320\275\321\201\320\273\321\217\321\202\320\276\321\200\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\321\202\321\200\320\260\320\275\321\201\320\273\321\217\321\202\320\276\321\200\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" index a77e2b3..044c48d 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\321\202\321\200\320\260\320\275\321\201\320\273\321\217\321\202\320\276\321\200\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\321\202\321\200\320\260\320\275\321\201\320\273\321\217\321\202\320\276\321\200\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\230\320\267\320\276\320\273\321\217\321\206\320\270\320\270.os" @@ -1,18 +1,16 @@ -// Ретранслирует в текущий прогон события изолированного набора по мере того, как -// их присылает изолированная среда (см. ТрансляторСобытийИзоляции): строит зеркала -// по составу набора до первого теста и публикует для них события исполнения. -// Когда среда завершилась, закрывает то, что она не успела завершить, и отдает -// результат набора. +// Передача событий изолированного набора в родительский прогон. +// Создает зеркала узлов по составу набора и публикует события их исполнения. +// После завершения среды формирует результаты незавершенных узлов и результат набора. // -// На уровне "Процесс" принимает вывод дочернего процесса как лог вывода команды -// 1commands (методы Информация и Ошибка): строки-сообщения канала ретранслируются, -// остальное копится как вывод прогона для причин отказов. Вывод лямбды совета -// приходит отдельным сообщением и предваряет вывод результата набора. +// Для процессной изоляции принимает stdout и stderr через интерфейс лога 1commands. +// Сообщения канала преобразуются в события, остальной вывод сохраняется для диагностики +// отказов. Вывод совета добавляется перед выводом результата набора. #Использовать collectionos +#Использовать fluent #Использовать "../../../shared" -Перем _ОпределениеНабора; // ОпределениеТестНабора - Плейсхолдер изолированного набора +Перем _ОпределениеНабора; // ОпределениеТестНабора - Изолированный набор родительского плана Перем _ТабакеркаОпределений; // Табакерка - Определения тестов для зеркал Перем _ТабакеркаРезультатов; // Табакерка - Результаты выполнения тестов Перем _ПубликаторСобытий; // ПубликаторСобытий - Публикатор событий текущего прогона @@ -21,13 +19,16 @@ Перем _СоставПолучен; // Булево - Изолированная среда прислала состав плана Перем _ИндексНабора; // Опциональный - Индекс набора в плане среды, пустой - набор не обнаружен -Перем _Зеркала; // КартаСоответствие из КлючИЗначение - Зеркала по путям: - // * Ключ - Строка - Путь узла от набора, индексы через точку - // * Значение - ОпределениеТеста - Зеркало + +// КартаСоответствие из КлючИЗначение - Зеркала по путям: +// * Ключ - Строка - Путь узла от набора, индексы через точку +// * Значение - ОпределениеТеста - Зеркало +Перем _Зеркала; + Перем _ПорядокЗеркал; // СписокМассив из ОпределениеТеста - Зеркала в порядке обхода состава Перем _Начатые; // МножествоСоответствие из ОпределениеТеста - Зеркала, начало которых опубликовано Перем _Завершенные; // МножествоСоответствие из ОпределениеТеста - Зеркала, конец которых опубликован -Перем _РезультатНабора; // Опциональный - Результат набора в среде, пустой - не пришел +Перем _РезультатНабора; // Опциональный - Результат набора в среде; пустой - результат не получен Перем _ОжидаемыйНомер; // Число - Номер следующего сообщения трансляции Перем _СообщенияПотеряны; // Булево - Нумерация сообщений прерывалась: часть событий не дошла Перем _Вывод; // Массив из Строка - Вывод дочернего процесса помимо сообщений @@ -87,20 +88,14 @@ // Начало могло потеряться: репортерам нужна пара событий Начать(Зеркало); - _Завершенные.Добавить(Зеркало); - Опубликовать( - Зеркало, - "ИсполнениеТестКонец", - Массивы.ИзЭлементов(Сообщение.Результат) - ); + ОпубликоватьКонец(Зеркало, Сообщение.Результат); КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off КонецПроцедуры -// Строит зеркала изолированного набора по составу плана его среды. Зеркала -// строятся все сразу, до событий их исполнения: репортеры определяют положение -// узла среди соседей по составу родителя +// Создает зеркала узлов по составу изолированного набора и переносит ошибки обнаружения. +// Все зеркала создаются до публикации событий исполнения. // // Параметры: // Состав - см. РепортерПланJSON.СоставПлана @@ -117,6 +112,11 @@ _ИндексНабора = Новый Опциональный(ИндексНабора); + // Набор в своей среде может не обнаружиться и там, где обнаружился здесь: + // например, его поставщик зарегистрирован только здесь + ПроцессорыКоллекций.ИзКоллекции(Состав.Получить(ИндексНабора).Ошибки) + .ДляКаждого(Новый Действие(_ОпределениеНабора, "ДобавитьОшибкуОбнаружения")); + Узлы = Состав.Получить(ИндексНабора).Тесты; Для Индекс = 0 По Узлы.ВГраница() Цикл @@ -175,9 +175,8 @@ _МимоПерехвата = Ложь; КонецПроцедуры -// Закрывает то, что изолированная среда не успела завершить, и возвращает -// результат набора. Вывод совета, переданный дочерним процессом, предваряет -// вывод результата +// Завершает обработку событий среды и возвращает результат набора. +// Вывод совета добавляется перед выводом результата. // // Параметры: // ВыводСреды - Строка - Захваченный вывод изолированной поделки, @@ -266,9 +265,8 @@ КонецПроцедуры -// Закрывает начатые, но не завершенные зеркала: среда завершилась посреди -// исполнения. Итерации закрываются раньше своих контейнеров. Зеркала, до которых -// среда не дошла, остаются без результата, как тесты набора, упавшего до них +// Завершает начатые зеркала после остановки изолированной среды. +// Итерации завершаются перед контейнерами; неначатые зеркала сохраняются без результата. // // Параметры: // Вывод - Строка - Вывод изолированной среды для причин @@ -284,13 +282,7 @@ Причина = _ПереносРезультатов.ПричинаТестНеВыполнен(Зеркало, "среда завершилась посреди теста", Вывод); - _Завершенные.Добавить(Зеркало); - - Опубликовать( - Зеркало, - "ИсполнениеТестКонец", - Массивы.ИзЭлементов(РезультатСломан(Причина)) - ); + ОпубликоватьКонец(Зеркало, РезультатСломан(Причина)); КонецЦикла; @@ -304,21 +296,14 @@ Продолжить; КонецЕсли; - _Завершенные.Добавить(Зеркало); - - Опубликовать( - Зеркало, - "ИсполнениеТестКонец", - Массивы.ИзЭлементов(Результат(СостоянияВыполненияТестов.Успех, Списки.ИзЭлементов())) - ); + ОпубликоватьКонец(Зеркало, Результат(СостоянияВыполненияТестов.Успех, Списки.ИзЭлементов())); КонецЦикла; КонецПроцедуры -// Публикует начало зеркала, если оно еще не опубликовано, - вместе с началом -// его контейнера: события по зеркалу приходят парой и вложенными, даже если -// сообщение о начале потерялось по дороге +// Публикует начало зеркала и его родительского контейнера, +// если соответствующие события еще не опубликованы. // // Параметры: // Зеркало - ОпределениеТеста - Зеркало теста, итерации или контейнера @@ -411,6 +396,23 @@ КонецФункции +// Закрывает контекст зеркала и добавляет итог закрытия к результату +// перед публикацией события завершения. +// +// Параметры: +// Зеркало - ОпределениеТеста - Завершенное зеркало +// Результат - РезультатВыполненияТеста - Результат зеркала +// +Процедура ОпубликоватьКонец(Зеркало, Результат) + + _Завершенные.Добавить(Зеркало); + + Результат.ДобавитьЗакрытие(Зеркало.Контекст().Закрыть(Новый Опциональный(Результат))); + + Опубликовать(Зеркало, "ИсполнениеТестКонец", Массивы.ИзЭлементов(Результат)); + +КонецПроцедуры + Процедура Опубликовать(Источник, Знач ИмяСобытия, ПараметрыСобытия) Если Не _МимоПерехвата Тогда diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\276\320\263\320\260\321\202\320\272\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\276\320\263\320\260\321\202\320\272\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.os" index e700ab6..2ec35a1 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\276\320\263\320\260\321\202\320\272\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\276\320\263\320\260\321\202\320\272\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.os" @@ -12,6 +12,9 @@ Процедура ПриЗапускеПриложения() Экспорт + // Создание желудя регистрирует обработчики заполнения аргументов и полей + _Поделка.НайтиЖелудь("РазрешениеЗначений"); + _Поделка.НайтиЖелудь("РепортерСтатистика"); Если ЗначениеЗаполнено(_ПутьКОтчетуJUnit) Тогда diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\270\320\263\320\275\320\260\321\202\321\203\321\200\320\260\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\270\320\263\320\275\320\260\321\202\321\203\321\200\320\260\320\234\320\265\321\202\320\276\320\264\320\260.os" new file mode 100644 index 0000000..b8b1a3e --- /dev/null +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\270\320\263\320\275\320\260\321\202\321\203\321\200\320\260\320\234\320\265\321\202\320\276\320\264\320\260.os" @@ -0,0 +1,84 @@ +// Метаданные метода тестового набора и сведения о поставщиках значений его параметров + +#Использовать collectionos + +Перем Метод; // СтрокаТаблицыЗначений - Данные метода с развернутыми аннотациями +Перем Поставщики; // ФиксированныйСписок из Опциональный - Имена поставщиков по индексам параметров + +// Метаданные метода с развернутыми аннотациями метода и его параметров +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений - Данные метода +// +Функция Метод() Экспорт + Возврат Метод; +КонецФункции + +// Имя желудя-поставщика параметра +// +// Параметры: +// Индекс - Число - Индекс параметра в сигнатуре, начиная с нуля +// +// Возвращаемое значение: +// Опциональный - Имя поставщика (Строка), пустой - параметр получает позиционное значение +// +Функция Поставщик(Знач Индекс) Экспорт + Возврат Поставщики.Получить(Индекс); +КонецФункции + +// Признак наличия параметров с поставщиками значений +// +// Возвращаемое значение: +// Булево - Истина - хотя бы один параметр получает значение от поставщика +// +Функция ЕстьПоставщики() Экспорт + Возврат Поставщики.ПроцессорКоллекции().ЛюбойСоответствует("Поставщик -> Поставщик.СодержитЗначение()"); +КонецФункции + +// Параметры без поставщиков значений в порядке объявления +// +// Возвращаемое значение: +// ФиксированныйСписок из СтрокаТаблицыЗначений - Данные параметров без поставщиков +// +Функция ПозиционныеПараметры() Экспорт + + Позиционные = Новый СписокМассив; + + Для Индекс = 0 По Метод.Параметры.Количество() - 1 Цикл + Если Не Поставщик(Индекс).СодержитЗначение() Тогда + Позиционные.Добавить(Метод.Параметры.Получить(Индекс)); + КонецЕсли; + КонецЦикла; + + Возврат Новый ФиксированныйСписок(Позиционные); + +КонецФункции + +// Создает аргументы вызова с указанными позиционными значениями +// +// Параметры: +// Позиционные - ФиксированныйСписок из Произвольный - Позиционные значения вызова +// +// Возвращаемое значение: +// АргументыВызова - Аргументы вызова метода +// +Функция СоздатьАргументы(Позиционные) Экспорт + + Заполняемые = Новый СписокМассив; + + Для Индекс = 0 По Метод.Параметры.Количество() - 1 Цикл + Если Поставщик(Индекс).СодержитЗначение() Тогда + Заполняемые.Добавить(Индекс); + КонецЕсли; + КонецЦикла; + + Возврат Новый АргументыВызова(Метод, Позиционные, Новый ФиксированныйСписок(Заполняемые)); + +КонецФункции + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта(&Блестяшка ОписаниеМетода, &Блестяшка ПоставщикиПараметров) + Метод = ОписаниеМетода; + Поставщики = Новый ФиксированныйСписок(ПоставщикиПараметров); +КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\237\320\273\320\260\320\275.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\237\320\273\320\260\320\275.os" index 4470a92..3972d21 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\237\320\273\320\260\320\275.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\237\320\273\320\260\320\275.os" @@ -1,5 +1,6 @@ Перем _ТестовыеНаборы; Перем _Таймаут; +Перем Контекст; // КонтекстИсполнения - Контекст прогона Процедура ДобавитьТестовыйНабор(ТестовыйНабор) Экспорт _ТестовыеНаборы.Добавить(ТестовыйНабор); @@ -13,8 +14,16 @@ Возврат _Таймаут; КонецФункции -// Признак ошибок обнаружения в плане: узлы, состав или параметры которых -// не удалось обнаружить +// Корневой контекст исполнения тест-плана +// +// Возвращаемое значение: +// КонтекстИсполнения - Контекст прогона +// +Функция Контекст() Экспорт + Возврат Контекст; +КонецФункции + +// Признак наличия в плане узлов с ошибками обнаружения // // Возвращаемое значение: // Булево - Истина - в плане есть узлы с ошибками обнаружения @@ -29,5 +38,6 @@ _ТестовыеНаборы = Новый СписокМассив; _Таймаут = Таймаут; + Контекст = Новый КонтекстИсполнения(ЭтотОбъект); КонецПроцедуры diff --git "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\276\320\262.os" "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\276\320\262.os" index e5544ef..13931f2 100644 --- "a/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\276\320\262.os" +++ "b/src/core/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\276\320\262.os" @@ -1,41 +1,75 @@ -// Создает экземпляры тестовых наборов - объекты их сценариев. Единственное место -// создания экземпляра набора: исполнитель, условия, источники параметров и совет -// изоляции получают экземпляры здесь, а не у определения набора +// Создание экземпляров тестовых наборов для исполнения, проверки условий +// и вычисления выражений. Экземпляр набора-одиночки хранится в контексте набора +// и используется в течение одного прогона. +#Использовать annotations #Использовать collectionos #Использовать lambdas #Использовать "../../../shared" Перем _Поделка; // Поделка - Поделка текущего прогона, в которой зарегистрированы наборы Перем _ПереносРезультатов; // ПереносРезультатов - Причины с готовым описанием +Перем ПубликаторСобытий; // ПубликаторСобытий - Заполнение аргументов конструктора -// Создает экземпляр тестового набора. Компанейский набор создается заново -// при каждом вызове, одиночка - один раз на поделку. Вывод создания перехватывается: -// autumn глотает исключение конструктора и пишет его в лог, и этот лог - корень -// причины отказа, а не вывод в консоль +// Создает экземпляр тестового набора для указанного узла. +// Для компанейского набора создает новый экземпляр, для одиночки использует +// экземпляр текущего прогона. Значения поставщиков разрешаются в контексте владельца; +// для одиночки и условий контейнера владельцем является набор. +// Возвращает экземпляр, перехваченный вывод и причину отказа создания. // // Параметры: // ОпределениеНабора - ОпределениеТестНабора - Определение набора +// Владелец - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел, для которого +// создается экземпляр: тест или набор +// +// Возвращаемое значение: +// см. ИтогСоздания +// +Функция Создать(ОпределениеНабора, Владелец) Экспорт + + Возврат ИтогСоздания(ТестированиеСлужебный.ВыполнитьСПерехватомВывода( + ЭтотОбъект, + "НайтиЭкземпляр", + Списки.ИзЭлементов(ОпределениеНабора, Владелец) + )); + +КонецФункции + +// Создает экземпляр для проверки условий изолированного теста в родительской среде. +// Если конструктор содержит параметры с поставщиками, создание пропускается: +// результат содержит пустые Экземпляр и Отказ. +// +// Параметры: +// ОпределениеНабора - ОпределениеТестНабора - Определение набора +// Владелец - ОпределениеТеста - Узел, за который решают +// +// Возвращаемое значение: +// см. ИтогСоздания - без экземпляра и без отказа, если набор не создавался +// +Функция СоздатьВнеУзла(ОпределениеНабора, Владелец) Экспорт + + Если СигнатураСПоставщиками(ОпределениеНабора).СодержитЗначение() Тогда + Возврат Новый Структура("Экземпляр, Вывод, Отказ", Опциональные.Пустой(), "", Опциональные.Пустой()); + КонецЕсли; + + Возврат Создать(ОпределениеНабора, Владелец); + +КонецФункции + +// Формирует результат создания экземпляра. +// При отсутствии экземпляра включает причину отказа и перехваченный вывод. +// +// Параметры: +// Поиск - см. ТестированиеСлужебный.ВыполнитьСПерехватомВывода // // Возвращаемое значение: // Структура - Создание экземпляра: -// * Экземпляр - Опциональный - Объект сценария набора, пустой - набор не удалось создать -// * Вывод - Строка - Перехваченный вывод создания. При отказе его несет и причина -// отказа: кто делает отказ причиной результата, вывод создания в вывод -// результата не добавляет, а кто отказ отбрасывает - добавляет -// * Отказ - Опциональный - Причина отказа (ИнформацияОбОшибке) «Не удаётся инстанцировать -// тестовый набор», по причине - перехваченный вывод создания; пустой - экземпляр создан -// -Функция Создать(ОпределениеНабора) Экспорт - - // Исключение конструктора autumn глотает и возвращает Неопределено, а исключение - // поиска - сбой самой поделки (например, желудь набора не зарегистрирован): он тоже - // отказ создания, а не падение прогона - Поиск = ТестированиеСлужебный.ВыполнитьСПерехватомВывода( - _Поделка, - "НайтиЖелудь", - Списки.ИзЭлементов(ОпределениеНабора.ИмяЖелудя()) - ); +// * Экземпляр - Опциональный - Объект сценария набора; пустой - экземпляр не получен +// * Вывод - Строка - Перехваченный вывод создания; при отказе также включен в его описание +// * Отказ - Опциональный - Ошибка создания (ИнформацияОбОшибке) с цепочкой причин; +// пустой - ошибки создания нет +// +Функция ИтогСоздания(Поиск) Создание = Новый Структура( "Экземпляр, Вывод, Отказ", @@ -56,12 +90,177 @@ КонецФункции -// Вычисляет лямбду, захватив новый экземпляр набора, - для кода, которому экземпляр -// нужен только для обращения к полям и методам набора (выражение источника, -// лямбда совета). Лямбде без обращения к набору экземпляр не нужен, поэтому она -// вычисляется и у набора, который не удалось создать; упавшая без экземпляра - отказ -// создания, см. ВызватьОтказ. Вывод создания и лямбды перехватывается: удача -// возвращает его, отказ несет исключение, см. ТестированиеСлужебный.ВызватьСВыводом +// Возвращает экземпляр одиночки текущего прогона или создает новый экземпляр набора +// +// Параметры: +// ОпределениеНабора - ОпределениеТестНабора - Определение набора +// Владелец - ОпределениеТестНабора, ОпределениеТеста - Исполняемый узел, для которого +// создается экземпляр: тест или набор +// +// Возвращаемое значение: +// - Произвольный - Экземпляр набора +// - Неопределено - Экземпляр не создан +// +Функция НайтиЭкземпляр(ОпределениеНабора, Владелец) Экспорт + + Если Не ОпределениеНабора.Одиночка() Тогда + Возврат НовыйЭкземпляр(ОпределениеНабора, УзелВладельца(Владелец)); + КонецЕсли; + + // Экземпляр одиночки и ресурсы его конструктора принадлежат контексту набора. + // Ключом кэша служит определение набора. + КонтекстНабора = ОпределениеНабора.Контекст(); + + Созданный = КонтекстНабора.Хранилище().Получить(ОпределениеНабора); + + Если Созданный.СодержитЗначение() Тогда + Возврат Созданный.Получить(); + КонецЕсли; + + Экземпляр = НовыйЭкземпляр(ОпределениеНабора, ОпределениеНабора); + + // Упавший конструктор не запоминается: следующий узел создает набор заново + Если Экземпляр <> Неопределено Тогда + КонтекстНабора.Хранилище().Вставить(ОпределениеНабора, Экземпляр); + КонецЕсли; + + Возврат Экземпляр; + +КонецФункции + +// Создает экземпляр без получения значений поставщиков. +// Параметры конструктора с поставщиками получают Неопределено; такой экземпляр +// не сохраняется в контексте набора. Если поставщиков нет, применяется обычное +// создание с поддержкой одиночки текущего прогона. +// +// Параметры: +// ОпределениеНабора - ОпределениеТестНабора - Определение набора +// +// Возвращаемое значение: +// - Произвольный - Экземпляр набора +// - Неопределено - Экземпляр не создан +// +Функция НайтиЭкземплярБезПоставщиков(ОпределениеНабора) Экспорт + + Если Не СигнатураСПоставщиками(ОпределениеНабора).СодержитЗначение() Тогда + // Без поставщиков в конструкторе такой экземпляр ничем не отличается от обычного: + // одиночка остается одной на прогон + Возврат НайтиЭкземпляр(ОпределениеНабора, ОпределениеНабора); + КонецЕсли; + + // Экземпляр без значений поставщиков всегда новый и не запоминается: одиночку + // прогона создает исполнение, со значениями + Возврат _Поделка.НайтиЖелудь( + ОпределениеНабора.ИмяЖелудя(), + БлестяшкиКонструктора(СигнатураСПоставщиками(ОпределениеНабора).Получить(), Опциональные.Пустой()) + ); + +КонецФункции + +// Возвращает владельца ресурсов создаваемого экземпляра. +// Для контейнера владельцем является набор. +// +// Параметры: +// Владелец - ОпределениеТестНабора, ОпределениеТеста - Узел, для которого создается экземпляр +// +// Возвращаемое значение: +// - ОпределениеТестНабора - Набор, которому принадлежат ресурсы +// - ОпределениеТеста - Тест, которому принадлежат ресурсы +// +Функция УзелВладельца(Владелец) + + Если ТипЗнч(Владелец) = Тип("ОпределениеТеста") + И Владелец.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда + Возврат Владелец.Набор(); + КонецЕсли; + + Возврат Владелец; + +КонецФункции + +// Создает новый экземпляр тестового набора +// +// Параметры: +// ОпределениеНабора - ОпределениеТестНабора - Определение набора +// Владелец - ОпределениеТестНабора, ОпределениеТеста - Узел, в контексте которого +// поставщики дают значения параметрам конструктора +// +// Возвращаемое значение: +// - Произвольный - Экземпляр набора +// - Неопределено - Экземпляр не создан +// +Функция НовыйЭкземпляр(ОпределениеНабора, Владелец) + + Сигнатура = СигнатураСПоставщиками(ОпределениеНабора); + + Если Не Сигнатура.СодержитЗначение() Тогда + Возврат _Поделка.НайтиЖелудь(ОпределениеНабора.ИмяЖелудя()); + КонецЕсли; + + Аргументы = Сигнатура.Получить().СоздатьАргументы(Списки.ИзЭлементов()); + + ПубликаторСобытий.ОпубликоватьСобытие(Владелец, "ЗаполнениеАргументов", Массивы.ИзЭлементов(Аргументы)); + + Возврат _Поделка.НайтиЖелудь( + ОпределениеНабора.ИмяЖелудя(), + БлестяшкиКонструктора(Сигнатура.Получить(), Новый Опциональный(Аргументы)) + ); + +КонецФункции + +// Сигнатура конструктора набора, если его параметрам нужны значения поставщиков +// +// Параметры: +// ОпределениеНабора - ОпределениеТестНабора - Определение набора +// +// Возвращаемое значение: +// Опциональный - Сигнатура (СигнатураМетода); пустой - у конструктора нет параметров с поставщиками +// +Функция СигнатураСПоставщиками(ОпределениеНабора) + + Возврат ОпределениеНабора.НайтиСигнатуруКонструктора() + .Фильтровать("Сигнатура -> Сигнатура.ЕстьПоставщики()"); + +КонецФункции + +// Собирает блестяшки конструктора набора для autumn: параметры с поставщиками +// получают значения поставщиков, прочие блестяшки - Неопределено +// +// Параметры: +// Сигнатура - СигнатураМетода - Сигнатура конструктора +// Аргументы - Опциональный - Заполненные аргументы конструктора (АргументыВызова), +// пустой - параметры с поставщиками получают Неопределено +// +// Возвращаемое значение: +// Массив из Произвольный - Блестяшки по порядку параметров +// +Функция БлестяшкиКонструктора(Сигнатура, Аргументы) + + Блестяшки = Новый Массив; + Индекс = 0; + + Для Каждого Параметр Из Сигнатура.Метод().Параметры Цикл + + Если Сигнатура.Поставщик(Индекс).СодержитЗначение() Тогда + Блестяшки.Добавить(?(Аргументы.СодержитЗначение(), Аргументы.Получить().Значение(Индекс), Неопределено)); + ИначеЕсли РаботаСАннотациями.ПолучитьАннотацию(Параметр, "Блестяшка") <> Неопределено Тогда + Блестяшки.Добавить(Неопределено); + КонецЕсли; + + Индекс = Индекс + 1; + + КонецЦикла; + + Возврат Блестяшки; + +КонецФункции + +// Вычисляет выражение с доступом к полям и методам экземпляра набора. +// Параметры конструктора с поставщиками получают Неопределено, а созданный +// для такого конструктора экземпляр не сохраняется как одиночка. +// Если экземпляр не создан, выражение вычисляется без его захвата. +// Возвращает значение выражения и вывод создания и вычисления. +// При ошибке вызывает исключение с перехваченным выводом и причиной отказа создания, если она есть. // // Параметры: // ОпределениеНабора - ОпределениеТестНабора - Набор, экземпляр которого захватывает лямбда @@ -76,7 +275,11 @@ Вычисление = Лямбда.Выражение(Выражение).Интерфейс(ФункциональныеИнтерфейсы.Вызываемый()); - Создание = Создать(ОпределениеНабора); + Создание = ИтогСоздания(ТестированиеСлужебный.ВыполнитьСПерехватомВывода( + ЭтотОбъект, + "НайтиЭкземплярБезПоставщиков", + Списки.ИзЭлементов(ОпределениеНабора) + )); Создание.Экземпляр.ЕслиСодержитЗначение(Новый Действие(Вычисление, "ЗахватитьОбъект")); Выполнение = ТестированиеСлужебный.ВычислитьСПерехватомВывода(Вычисление); @@ -101,10 +304,9 @@ КонецФункции -// Вызывает исключение отказа для кода, которому нужен был экземпляр набора, -// которого нет (условие, выражение источника, лямбда совета): настоящая причина - -// создание набора, ошибка кода - ее следствие. Цепочка: «Не удаётся инстанцировать -// тестовый набор», по причине - ошибка кода, по причине - вывод создания +// Вызывает исключение об отказе создания экземпляра. +// В цепочку причин включает ошибку выполнявшегося кода и причину отказа создания. +// Вывод кода сохраняется в исключении. // // Параметры: // Создание - см. Создать @@ -169,7 +371,7 @@ КонецФункции -// Выброшенная ошибка: у невыброшенной нельзя прочитать модуль и строку +// Создает информацию об ошибке с заполненными сведениями о месте возникновения Функция НоваяОшибка(Знач Описание, Параметры, Причина) Попытка @@ -181,7 +383,11 @@ КонецФункции &Желудь -Процедура ПриСозданииОбъекта(&Пластилин Поделка, &Пластилин ПереносРезультатов) +Процедура ПриСозданииОбъекта( + &Пластилин Поделка, + &Пластилин ПереносРезультатов, + &Пластилин("ПубликаторСобытий") Публикатор) _Поделка = Поделка; _ПереносРезультатов = ПереносРезультатов; + ПубликаторСобытий = Публикатор; КонецПроцедуры diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.os" index 6bccf95..e405596 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\235\320\260\320\261\320\276\321\200.os" @@ -1,26 +1,22 @@ #Использовать annotations -// Аннотация указывает что сценарий является тестовым набором. -// Аннотацию необходимо размещать над конструктором сценария. -// Можно указать способ управления жизненным циклом тестового набора. +// Объявляет сценарий тестовым набором и задает жизненный цикл его экземпляров. +// Размещается над конструктором сценария. // // Параметры: -// Характер - Строка - Характер тестового набора, -// `Одиночка` - если тестовый набор должен быть создан один раз и использоваться для всех тестов. -// `Компанейский` - если тестовый набор должен быть создан для каждого теста. +// Характер - Строка - Режим использования экземпляров набора: +// `Одиночка` - один экземпляр на прогон для всех тестов набора. +// `Компанейский` - отдельный экземпляр для каждого теста. // Значение по умолчанию: `Компанейский` // // Пример: -// // Этот сценарий является тестовым набором одиночкой -// &ТестовыйНабора(Характер = "Одиночка") -// Процедура ПриСозданииОбъекта() Экспорт +// &ТестовыйНабор(Характер = "Одиночка") +// Процедура ПриСозданииОбъекта() +// КонецПроцедуры // &Аннотация("ТестовыйНабор") &Прозвище("ТестовыйНабор") -&Характер(Значение = "") +&Характер("Компанейский") &Желудь -Процедура ПриСозданииОбъекта( - &ПсевдонимДля(Аннотация = "Характер", Параметр = "Значение", ПереноситьЗначениеПоУмолчанию = Истина) - Характер = "Компанейский" -) +Процедура ПриСозданииОбъекта(Характер = "Компанейский") КонецПроцедуры diff --git "a/tests/fixtures/broken/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\320\274\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\276\320\274.os" "b/tests/fixtures/broken/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\320\274\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\276\320\274.os" new file mode 100644 index 0000000..e79ccd1 --- /dev/null +++ "b/tests/fixtures/broken/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\320\274\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\276\320\274.os" @@ -0,0 +1,10 @@ +// Фикстура с неверным объявлением характера набора: неизвестный характер. +// Набор сломан целиком с ошибкой обнаружения, остальные наборы обнаруживаются + +&Тест +Процедура ДоНегоНеДойдут() Экспорт +КонецПроцедуры + +&ТестовыйНабор(Характер = "Галактика") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/broken/\320\235\320\260\320\261\320\276\321\200\320\241\320\257\320\262\320\275\321\213\320\274\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\276\320\274.os" "b/tests/fixtures/broken/\320\235\320\260\320\261\320\276\321\200\320\241\320\257\320\262\320\275\321\213\320\274\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\276\320\274.os" new file mode 100644 index 0000000..43fe99d --- /dev/null +++ "b/tests/fixtures/broken/\320\235\320\260\320\261\320\276\321\200\320\241\320\257\320\262\320\275\321\213\320\274\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\276\320\274.os" @@ -0,0 +1,11 @@ +// Набор с отдельной аннотацией Характер. +// Такое объявление приводит к ошибке обнаружения набора. + +&Тест +Процедура ДоНегоНеДойдут() Экспорт +КонецПроцедуры + +&Характер("Одиночка") +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/execution/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\222\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\274\320\237\321\200\320\276\320\263\320\276\320\275\320\265.os" "b/tests/fixtures/execution/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\222\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\274\320\237\321\200\320\276\320\263\320\276\320\275\320\265.os" new file mode 100644 index 0000000..78a5908 --- /dev/null +++ "b/tests/fixtures/execution/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\222\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\274\320\237\321\200\320\276\320\263\320\276\320\275\320\265.os" @@ -0,0 +1,17 @@ +// Набор-одиночка без поставщиков: экземпляр один на прогон, и повторный прогон +// той же поделки создает свой - состояние прошлого прогона в нем не остается + +#Использовать "../../support" + +Перем Отметка; // Строка - Состояние, которое тест оставляет в экземпляре + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта() + ЖурналВыполнения.Записать("Конструктор одиночки"); +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт + ЖурналВыполнения.Записать("Состояние до теста: " + ?(Отметка = Неопределено, "чистое", Отметка)); + Отметка = "прошлый прогон"; +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" new file mode 100644 index 0000000..1afc91a --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" @@ -0,0 +1,13 @@ +// Изолированный набор уровня "Поделка" для подписчика родителя (см. Подписчики): +// контекст зеркала его теста закрывается до публикации конца + +#Использовать "Подписчики" + +&ТестовыйНабор +&Изолированный +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" new file mode 100644 index 0000000..1db34cf --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" @@ -0,0 +1,16 @@ +// Изолированный набор-одиночка уровня "Поделка": значения его конструктора +// закрываются с набором в его среде, и вывод и исключение закрытия попадают +// в результат набора, который видит родитель + +#Использовать "Поставщики" + +&ТестовыйНабор(Характер = "Одиночка") +&Изолированный +Процедура ПриСозданииОбъекта( + &ЗначениеПоставщика Наблюдатель, + &ЗначениеПоставщика("ПадениеЗакрытия") П) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\241\320\276\320\262\320\265\321\202\320\276\320\274\320\235\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\265.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\241\320\276\320\262\320\265\321\202\320\276\320\274\320\235\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\265.os" new file mode 100644 index 0000000..1e17eec --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\241\320\276\320\262\320\265\321\202\320\276\320\274\320\235\320\260\320\255\320\272\320\267\320\265\320\274\320\277\320\273\321\217\321\200\320\265.os" @@ -0,0 +1,16 @@ +// Изолированный набор уровня "Поделка" с незарегистрированным поставщиком +// конструктора и лямбдой совета на методе набора: экземпляр для лямбды создается +// в родителе без значений поставщиков, а регистрацию поставщика проверяет среда + +&ТестовыйНабор +&Изолированный(Совет = "() -> СоветНабора()") +Процедура ПриСозданииОбъекта(&ПоставщикЗначения("ПоставщикКоторогоНет") Значение) // BSLLS:UnusedParameters-off +КонецПроцедуры + +Функция СоветНабора() Экспорт + Возврат Новый СоветДругогоМастера(); +КонецФункции + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..29ac3c3 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,23 @@ +// Изолированный набор уровня "Поделка" с поставщиками параметров и поля: значения +// спрашиваются в его среде + +#Использовать asserts +#Использовать "Поставщики" + +Перем ЗначениеКонструктора; + +&ЗначениеПоставщика("Поле") +Перем Поле; + +&ТестовыйНабор +&Изолированный +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Конструктор") Значение) + ЗначениеКонструктора = Значение; +КонецПроцедуры + +&Тест +Процедура Тест(&ЗначениеПоставщика("Тест") П) Экспорт + Ожидаем.Что(ЗначениеКонструктора).Равно("Конструктор"); + Ожидаем.Что(П).Равно("Тест"); + Ожидаем.Что(Поле).Равно("Поле"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" new file mode 100644 index 0000000..d2e96c0 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" @@ -0,0 +1,30 @@ +// Изолированный набор уровня "Поделка", поставщика конструктора, метода жизненного +// цикла и поля которого включает совет изоляции: поставщик есть только в среде +// набора, и родитель его регистрацию не проверяет + +#Использовать asserts +#Использовать "ПоставщикИзНастройки" + +Перем ЗначениеКонструктора; + +&ЗначениеИзНастройки +Перем Поле; + +&ТестовыйНабор +&Изолированный(Совет = "() -> СоветыПоставщикаИзНастройки.СоветСПоставщиком()") +Процедура ПриСозданииОбъекта(&ЗначениеИзНастройки Значение) + ЗначениеКонструктора = Значение; +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми(&ЗначениеИзНастройки Значение) Экспорт + // Набор компанейский: ПередВсеми исполняется на своем экземпляре, а не на экземпляре теста + Ожидаем.Что(Значение).Равно("из настройки"); +КонецПроцедуры + +&Тест +Процедура Тест(&ЗначениеИзНастройки Значение) Экспорт + Ожидаем.Что(ЗначениеКонструктора).Равно("из настройки"); + Ожидаем.Что(Поле).Равно("из настройки"); + Ожидаем.Что(Значение).Равно("из настройки"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" new file mode 100644 index 0000000..2cbb61d --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" @@ -0,0 +1,13 @@ +// Изолированный набор уровня "Процесс" для подписчика родителя (см. Подписчики): +// контекст зеркала его теста закрывается до публикации конца + +#Использовать "Подписчики" + +&ТестовыйНабор +&Изолированный(Уровень = "Процесс") +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" new file mode 100644 index 0000000..e55ee7d --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" @@ -0,0 +1,16 @@ +// Изолированный набор-одиночка уровня "Процесс": значения его конструктора +// закрываются с набором в дочернем процессе, и вывод и исключение закрытия +// попадают в результат набора, который видит родитель + +#Использовать "Поставщики" + +&ТестовыйНабор(Характер = "Одиночка") +&Изолированный(Уровень = "Процесс") +Процедура ПриСозданииОбъекта( + &ЗначениеПоставщика Наблюдатель, + &ЗначениеПоставщика("ПадениеЗакрытия") П) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..ad7c160 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,12 @@ +// Изолированный набор уровня "Процесс" с незарегистрированным поставщиком +// конструктора: регистрацию проверяет среда набора при обнаружении - родитель +// у изолированного узла ее не проверяет, ведь среду может настроить совет + +&ТестовыйНабор +&Изолированный(Уровень = "Процесс") +Процедура ПриСозданииОбъекта(&ПоставщикЗначения("ПоставщикКоторогоНет") Значение) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..794ee22 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,23 @@ +// Изолированный набор уровня "Процесс" с поставщиками параметров и поля: аннотация +// и поставщик регистрируются в дочернем процессе, значения спрашиваются там + +#Использовать asserts +#Использовать "Поставщики" + +Перем ЗначениеКонструктора; + +&ЗначениеПоставщика("Поле") +Перем Поле; + +&ТестовыйНабор +&Изолированный(Уровень = "Процесс") +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Конструктор") Значение) + ЗначениеКонструктора = Значение; +КонецПроцедуры + +&Тест +Процедура Тест(&ЗначениеПоставщика("Тест") П) Экспорт + Ожидаем.Что(ЗначениеКонструктора).Равно("Конструктор"); + Ожидаем.Что(П).Равно("Тест"); + Ожидаем.Что(Поле).Равно("Поле"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" new file mode 100644 index 0000000..bdb206f --- /dev/null +++ "b/tests/fixtures/resolvers/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\275\321\213\320\271\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" @@ -0,0 +1,30 @@ +// Изолированный набор уровня "Процесс", поставщика конструктора, метода жизненного +// цикла и поля которого включает совет изоляции: поставщик есть только в среде +// набора, и родитель его регистрацию не проверяет + +#Использовать asserts +#Использовать "ПоставщикИзНастройки" + +Перем ЗначениеКонструктора; + +&ЗначениеИзНастройки +Перем Поле; + +&ТестовыйНабор +&Изолированный(Уровень = "Процесс", Совет = "() -> СоветыПоставщикаИзНастройки.СоветСПоставщиком()") +Процедура ПриСозданииОбъекта(&ЗначениеИзНастройки Значение) + ЗначениеКонструктора = Значение; +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми(&ЗначениеИзНастройки Значение) Экспорт + // Набор компанейский: ПередВсеми исполняется на своем экземпляре, а не на экземпляре теста + Ожидаем.Что(Значение).Равно("из настройки"); +КонецПроцедуры + +&Тест +Процедура Тест(&ЗначениеИзНастройки Значение) Экспорт + Ожидаем.Что(ЗначениеКонструктора).Равно("из настройки"); + Ожидаем.Что(Поле).Равно("из настройки"); + Ожидаем.Что(Значение).Равно("из настройки"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\222\321\213\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\213\320\271\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274\320\242\320\265\321\201\321\202\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\222\321\213\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\213\320\271\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274\320\242\320\265\321\201\321\202\320\260.os" new file mode 100644 index 0000000..c7a556c --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\222\321\213\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\213\320\271\320\241\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274\320\242\320\265\321\201\321\202\320\260.os" @@ -0,0 +1,13 @@ +// Выключенный набор: до его теста исполнение не доходит, а контекст теста, в который +// подписчик заранее добавил действие (см. ПодписчикЗакрытийЗаранее), закрывается + +#Использовать "Подписчики" + +&ТестовыйНабор +&Выключен("Набор выключен") +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\224\321\203\320\261\320\273\320\270\321\200\321\203\321\216\321\211\320\265\320\263\320\276\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\224\321\203\320\261\320\273\320\270\321\200\321\203\321\216\321\211\320\265\320\263\320\276\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" new file mode 100644 index 0000000..0d19690 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\224\321\203\320\261\320\273\320\270\321\200\321\203\321\216\321\211\320\265\320\263\320\276\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" @@ -0,0 +1,15 @@ +// Набор, параметр теста которого заполняет и второй подписчик ЗаполнениеАргументов +// (см. Подписчики): значение параметра не задается дважды + +#Использовать "Поставщики" +#Использовать "Подписчики" +#Использовать "../../support" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Тест(&ЗначениеПоставщика П) Экспорт // BSLLS:UnusedParameters-off + ЖурналВыполнения.Записать("Тест выполнен"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\237\320\276\321\200\321\217\320\264\320\272\320\260\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\320\270.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\237\320\276\321\200\321\217\320\264\320\272\320\260\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\320\270.os" new file mode 100644 index 0000000..6490784 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\224\320\273\321\217\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\237\320\276\321\200\321\217\320\264\320\272\320\260\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\320\270.os" @@ -0,0 +1,27 @@ +// Один тест с пересекающимися этапами жизненного цикла и двумя заполняемыми полями. + +#Использовать "Поставщики" + +&ЗначениеПоставщика("Поле") +Перем ПолеПервое; + +&ЗначениеПоставщика("Поле") +Перем ПолеВторое; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +&ПередКаждым +Процедура Тест(&ЗначениеПоставщика("Значение") Значение) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&ПередКаждым +&ПослеКаждого +Процедура ПередКаждым(&ЗначениеПоставщика("Значение") Значение) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&ПослеКаждого +Процедура ПослеКаждого(&ЗначениеПоставщика("Значение") Значение) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\320\273\320\265\320\274\320\236\321\202\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\320\273\320\265\320\274\320\236\321\202\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" new file mode 100644 index 0000000..7c03614 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\320\273\320\265\320\274\320\236\321\202\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" @@ -0,0 +1,22 @@ +// Набор-одиночка, поле которого получает значение поставщика: экземпляр один, +// а поле заполняется заново перед методами каждого теста, в его контексте + +#Использовать "Поставщики" +#Использовать "../../support" + +&ЗначениеПоставщика("Счетчик") +Перем Номер; + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Первый() Экспорт + ЖурналВыполнения.Записать("Первый " + Номер); +КонецПроцедуры + +&Тест +Процедура Второй() Экспорт + ЖурналВыполнения.Записать("Второй " + Номер); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..22fac69 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,20 @@ +// Набор-одиночка с поставщиком параметра конструктора: значение спрашивается +// один раз, в контексте ее набора + +#Использовать "Поставщики" +#Использовать "../../support" + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Одиночка") Значение) + ЖурналВыполнения.Записать("Конструктор одиночки " + Значение); +КонецПроцедуры + +&Тест +Процедура Первый() Экспорт + ЖурналВыполнения.Записать("Первый"); +КонецПроцедуры + +&Тест +Процедура Второй() Экспорт + ЖурналВыполнения.Записать("Второй"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265\320\274.os" new file mode 100644 index 0000000..6cc911e --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\236\320\264\320\270\320\275\320\276\321\207\320\272\320\260\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265\320\274.os" @@ -0,0 +1,21 @@ +// Набор-одиночка с поставщиком параметра конструктора и выражением источника: +// экземпляр для выражения создается при обнаружении без значений поставщиков +// и не запоминается, а одиночку прогона со значениями создает исполнение + +#Использовать collectionos +#Использовать "Поставщики" +#Использовать "../../support" + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Выражение") Значение) + ЖурналВыполнения.Записать("Конструктор одиночки " + ?(Значение = Неопределено, "Неопределено", Значение)); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникВыражение("() -> Значения()") +Процедура Тест(А) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +Функция Значения() Экспорт + Возврат ПроцессорыКоллекций.ИзНабора(Списки.ИзЭлементов(1), Списки.ИзЭлементов(2)); +КонецФункции diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270\320\230\320\243\321\201\320\273\320\276\320\262\320\270\320\265\320\274\320\235\320\260\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\265.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270\320\230\320\243\321\201\320\273\320\276\320\262\320\270\320\265\320\274\320\235\320\260\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\265.os" new file mode 100644 index 0000000..b4eda3e --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270\320\230\320\243\321\201\320\273\320\276\320\262\320\270\320\265\320\274\320\235\320\260\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\265.os" @@ -0,0 +1,40 @@ +// Изолированные тесты с условиями, использующими значение поставщика конструктора. +// Условия разрешаются в среде исполнения теста. Тесты с ошибками объявления +// получают состояние Сломан; проверка условий в родителе эти ошибки не скрывает. + +#Использовать "Поставщики" + +Перем ВСреде; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта(&ПоставщикЗначения("ПоставщикПризнакаСреды") ПризнакСреды) + ВСреде = ПризнакСреды; +КонецПроцедуры + +Функция ВСреде() Экспорт + Возврат ВСреде = Истина; +КонецФункции + +&Тест +&Изолированный +&ВключенЕсли("() -> ВСреде()", Причина = "Поставщика спросили вне среды") +Процедура ПоделочныйТест() Экспорт +КонецПроцедуры + +&Тест +&Изолированный(Уровень = "Процесс") +&ВключенЕсли("() -> ВСреде()", Причина = "Поставщика спросили вне среды") +Процедура ПроцессныйТест() Экспорт +КонецПроцедуры + +&Тест +&Изолированный +&ВключенЕсли("() -> ВСреде()", Причина = "Поставщика спросили вне среды") +Процедура ПоделочныйТестСНевернымОбъявлением(&ЗначениеПоставщика("а") &ЗначениеПоставщика("б") П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +&Изолированный(Уровень = "Процесс") +&ВключенЕсли("() -> ВСреде()", Причина = "Поставщика спросили вне среды") +Процедура ПроцессныйТестСНевернымОбъявлением(&ЗначениеПоставщика("а") &ЗначениеПоставщика("б") П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" new file mode 100644 index 0000000..0b2afc3 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\267\320\241\320\276\320\262\320\265\321\202\320\260.os" @@ -0,0 +1,37 @@ +// Набор с изолированными тестами, поставщика значений которых включает совет +// изоляции: поставщик есть только в среде теста, и родитель его регистрацию +// не проверяет - ни у параметров тестов, ни у ПередКаждым, ни у полей: их +// значения получает тест там, где исполняется + +#Использовать asserts +#Использовать "ПоставщикИзНастройки" + +&ЗначениеИзНастройки +Перем Поле; + +Перем ЗначениеПередКаждым; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередКаждым +Процедура ПередКаждым(&ЗначениеИзНастройки Значение) Экспорт + ЗначениеПередКаждым = Значение; +КонецПроцедуры + +&Тест +&Изолированный(Совет = "() -> СоветыПоставщикаИзНастройки.СоветСПоставщиком()") +Процедура ПоделочныйТест(&ЗначениеИзНастройки Значение) Экспорт + Ожидаем.Что(Значение).Равно("из настройки"); + Ожидаем.Что(ЗначениеПередКаждым).Равно("из настройки"); + Ожидаем.Что(Поле).Равно("из настройки"); +КонецПроцедуры + +&Тест +&Изолированный(Уровень = "Процесс", Совет = "() -> СоветыПоставщикаИзНастройки.СоветСПоставщиком()") +Процедура ПроцессныйТест(&ЗначениеИзНастройки Значение) Экспорт + Ожидаем.Что(Значение).Равно("из настройки"); + Ожидаем.Что(ЗначениеПередКаждым).Равно("из настройки"); + Ожидаем.Что(Поле).Равно("из настройки"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\250\320\260\320\261\320\273\320\276\320\275\320\260\320\274\320\270\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\250\320\260\320\261\320\273\320\276\320\275\320\260\320\274\320\270\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" new file mode 100644 index 0000000..d23a88d --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\270\320\250\320\260\320\261\320\273\320\276\320\275\320\260\320\274\320\270\320\224\320\273\321\217\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\260.os" @@ -0,0 +1,18 @@ +// Набор с изолированными шаблонами обоих уровней для подписчика родителя +// (см. Подписчики): контексты зеркал их итераций закрываются до публикации конца + +#Использовать "Подписчики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПовторяемыйТест(1) +&Изолированный +Процедура ПоделочныйШаблон() Экспорт +КонецПроцедуры + +&ПовторяемыйТест(1) +&Изолированный(Уровень = "Процесс") +Процедура ПроцессныйШаблон() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\232\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\320\276\320\274\320\230\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\232\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\320\276\320\274\320\230\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..ffda413 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\232\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\320\276\320\274\320\230\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,14 @@ +// Набор с шаблоном, у которого есть условие: экземпляр для условия контейнера +// получает значения поставщиков, и созданное для него принадлежит набору - +// у контейнера нет действий закрытия + +#Использовать "Поставщики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика Значение) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&ПовторяемыйТест(1) +&ВключенЕсли("() -> Истина") +Процедура Шаблон() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" new file mode 100644 index 0000000..20eed23 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" @@ -0,0 +1,16 @@ +// Набор с незарегистрированным поставщиком параметра ПередВсеми. +// Ошибка регистрации приводит к ошибке обнаружения набора. + +#Использовать "Поставщики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми(&НезарегистрированныйПоставщик П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\270\320\237\320\276\320\273\321\217\320\274\320\270.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\270\320\237\320\276\320\273\321\217\320\274\320\270.os" new file mode 100644 index 0000000..0fa8e4a --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\270\320\237\320\276\320\273\321\217\320\274\320\270.os" @@ -0,0 +1,16 @@ +// Поле с двумя аннотациями поставщиков значений. +// Ошибка объявления поля приводит к ошибке обнаружения набора. + +#Использовать "Поставщики" + +&ЗначениеПоставщика("а") +&ЗначениеПоставщика("б") +Перем ДваПоставщика; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\270\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\274\320\270.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\270\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\274\320\270.os" new file mode 100644 index 0000000..27a1db8 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\262\320\265\321\200\320\275\321\213\320\274\320\270\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\274\320\270.os" @@ -0,0 +1,24 @@ +// Набор с неверными объявлениями параметров тестов: каждое ломает только свой тест + +#Использовать "Поставщики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура ДваПоставщика(&ЗначениеПоставщика("а") &ЗначениеПоставщика("б") П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура НезарегистрированныйПоставщик(&НезарегистрированныйПоставщик П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникJSON("[ {""П"": 1} ]") +Процедура ИмяСПоставщиком(&ЗначениеПоставщика П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура ВерныйТест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" new file mode 100644 index 0000000..6592f11 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" @@ -0,0 +1,16 @@ +// Набор с незарегистрированным поставщиком параметра ПередКаждым. +// Ошибка регистрации относится к тестам, использующим этот метод. + +#Использовать "Поставщики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередКаждым +Процедура ПередКаждым(&НезарегистрированныйПоставщик П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217.os" new file mode 100644 index 0000000..9014f20 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217.os" @@ -0,0 +1,15 @@ +// Набор без ПередВсеми и ПослеВсех с незарегистрированным поставщиком поля. +// Ошибка регистрации относится к тестам, перед которыми заполняется поле. + +#Использовать "Поставщики" + +&НезарегистрированныйПоставщик +Перем Поле; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217\320\230\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217\320\230\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" new file mode 100644 index 0000000..109cd6b --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217\320\230\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" @@ -0,0 +1,19 @@ +// Набор с ПередВсеми и незарегистрированным поставщиком поля. +// Ошибка регистрации поля приводит к ошибке обнаружения набора. + +#Использовать "Поставщики" + +&НезарегистрированныйПоставщик +Перем Поле; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми() Экспорт +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..9fdfcb5 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,19 @@ +// Набор, параметр теста которого получает значение от неоднозначного поставщика +// (см. НеоднозначныйПоставщик): ломается только этот тест, а не обнаружение плана + +#Использовать "НеоднозначныйПоставщик" +#Использовать "../../support" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура Неоднозначный(&ПоставщикЗначения("НеоднозначныйПоставщик") Значение) Экспорт // BSLLS:UnusedParameters-off + ЖурналВыполнения.Записать("Неоднозначный выполнен"); +КонецПроцедуры + +&Тест +Процедура Зеленый() Экспорт + ЖурналВыполнения.Записать("Зеленый выполнен"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270\320\230\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274\320\242\320\265\321\201\321\202\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270\320\230\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274\320\242\320\265\321\201\321\202\320\260.os" new file mode 100644 index 0000000..f930cf0 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270\320\230\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274\320\242\320\265\321\201\321\202\320\260.os" @@ -0,0 +1,18 @@ +// Набор с падающим ПередВсеми: до его теста исполнение не доходит, а контекст теста, +// в который подписчик заранее добавил действие (см. ПодписчикЗакрытийЗаранее), +// закрывается + +#Использовать "Подписчики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми() Экспорт + ВызватьИсключение "ПередВсеми не смог"; +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..4e94fd0 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,14 @@ +// Набор, на тесте которого падает подписчик события (см. Подписчики): +// исключение прерывает исполнение плана, а созданное для набора все равно +// освобождается + +#Использовать "Поставщики" +#Использовать "Подписчики" + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика Значение) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\276\320\274\320\230\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\276\320\274\320\230\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" new file mode 100644 index 0000000..738485a --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\276\320\274\320\230\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" @@ -0,0 +1,28 @@ +// Подписчик прерывает прогон, а действие закрытия набора падает с вложенной причиной. +// Оба исключения и вывод закрытия должны сохраниться в отказе прогона + +#Использовать "Поставщики" +#Использовать "Подписчики" + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Контекст") Контекст) + + Контекст.ПриЗакрытии(Новый Действие(ЭтотОбъект, "Закрыть")); + +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры + +Процедура Закрыть(Контекст) Экспорт // BSLLS:UnusedParameters-off + + Сообщить("Вывод перед ошибкой закрытия"); + + Попытка + ВызватьИсключение "Корневая причина закрытия"; + Исключение + ВызватьИсключение Новый ИнформацияОбОшибке("Закрытие не смогло", , ИнформацияОбОшибке()); + КонецПопытки; + +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" new file mode 100644 index 0000000..b4ebd9a --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274.os" @@ -0,0 +1,19 @@ +// Набор, в котором падают поставщик параметра теста и действие закрытия +// контекста теста + +#Использовать "Поставщики" +#Использовать "../../support" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура ПадениеПоставщика(&ЗначениеПоставщика("Упасть") П) Экспорт // BSLLS:UnusedParameters-off + ЖурналВыполнения.Записать("ПадениеПоставщика выполнен"); +КонецПроцедуры + +&Тест +Процедура ПадениеЗакрытия(&ЗначениеПоставщика("ПадениеЗакрытия") П) Экспорт // BSLLS:UnusedParameters-off + Сообщить("Вывод теста ПадениеЗакрытия"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260.os" new file mode 100644 index 0000000..eef86cb --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260.os" @@ -0,0 +1,11 @@ +// Набор, поставщик параметра конструктора которого падает: набор не создается + +#Использовать "Поставщики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Упасть") П) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217.os" new file mode 100644 index 0000000..a5d7851 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217.os" @@ -0,0 +1,27 @@ +// Набор, поставщик поля которого падает: тест сломан, и ни один его метод +// не вызывается + +#Использовать "Поставщики" +#Использовать "../../support" + +&ЗначениеПоставщика("Упасть") +Перем Поле; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередКаждым +Процедура ПередКаждым() Экспорт + ЖурналВыполнения.Записать("ПередКаждым выполнен"); +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт + ЖурналВыполнения.Записать("Тест выполнен"); +КонецПроцедуры + +&ПослеКаждого +Процедура ПослеКаждого() Экспорт + ЖурналВыполнения.Записать("ПослеКаждого выполнен"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" new file mode 100644 index 0000000..c79c47b --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\237\320\276\320\273\321\217\320\237\320\265\321\200\320\265\320\264\320\222\321\201\320\265\320\274\320\270.os" @@ -0,0 +1,22 @@ +// Набор с ПередВсеми, поставщик поля которого падает: набор сломан, ПередВсеми +// и тесты не вызываются + +#Использовать "Поставщики" +#Использовать "../../support" + +&ЗначениеПоставщика("Упасть") +Перем Поле; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми() Экспорт + ЖурналВыполнения.Записать("ПередВсеми выполнен"); +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт + ЖурналВыполнения.Записать("Тест выполнен"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\265\320\275\320\270\320\265\320\274\320\227\320\260\320\272\321\200\321\213\321\202\320\270\321\217.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\265\320\275\320\270\320\265\320\274\320\227\320\260\320\272\321\200\321\213\321\202\320\270\321\217.os" new file mode 100644 index 0000000..a9fa8db --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\260\320\264\320\265\320\275\320\270\320\265\320\274\320\227\320\260\320\272\321\200\321\213\321\202\320\270\321\217.os" @@ -0,0 +1,19 @@ +// Падение действия закрытия теста должно быть видно остальным действиям этого +// теста и закрытию набора, а падение в поддереве - прогону. Ресурсы конструктора +// одиночки и ПередВсеми принадлежат набору + +#Использовать "Поставщики" + +&ТестовыйНабор(Характер = "Одиночка") +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика Значение) // BSLLS:UnusedParameters-off +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми(&ЗначениеПоставщика П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Тест( + &ЗначениеПоставщика Наблюдатель, + &ЗначениеПоставщика("ПадениеЗакрытия") П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\320\273\320\265\320\274\320\236\321\202\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\320\273\320\265\320\274\320\236\321\202\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" new file mode 100644 index 0000000..0eef52f --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\320\273\320\265\320\274\320\236\321\202\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" @@ -0,0 +1,42 @@ +// Набор, поле которого получает значение поставщика: по журналу видно, для какого +// узла и когда заполнялось поле - после условий узла и перед его методами + +#Использовать collectionos +#Использовать "Поставщики" +#Использовать "../../support" + +&ЗначениеПоставщика("Счетчик") +Перем Номер; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() + ЖурналВыполнения.Записать("Конструктор " + ?(Номер = Неопределено, "без поля", Номер)); +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми() Экспорт + ЖурналВыполнения.Записать("ПередВсеми " + Номер); +КонецПроцедуры + +&ПередКаждым +Процедура ПередКаждым(&ЗначениеПоставщика("Счетчик") НомерПараметра) Экспорт + ЖурналВыполнения.Записать(СтрШаблон("ПередКаждым %1 %2", Номер, НомерПараметра)); +КонецПроцедуры + +&Тест +Процедура Тест() Экспорт + ЖурналВыполнения.Записать("Тест " + Номер); +КонецПроцедуры + +// Экземпляр для выражения источника создается при обнаружении, а контейнеру - +// только для его условия: им поле не заполняется +&ПараметризованныйТест +&ИсточникВыражение("() -> Значения()") +&ВключенЕсли("() -> Истина") +Процедура Шаблон(А) Экспорт // BSLLS:UnusedParameters-off + ЖурналВыполнения.Записать("Шаблон " + Номер); +КонецПроцедуры + +Функция Значения() Экспорт + Возврат ПроцессорыКоллекций.ИзНабора(Списки.ИзЭлементов(1)); +КонецФункции diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" new file mode 100644 index 0000000..b5dbb5f --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -0,0 +1,61 @@ +// Набор, параметры конструктора и методов которого получают значения поставщика: +// по журналу видно, в контексте какого узла спрашивали поставщика, что получили +// методы и когда узлы закрылись + +#Использовать "Поставщики" +#Использовать "../../support" + +Перем ЗначениеКонструктора; + +&ТестовыйНабор +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Конструктор") Значение) + ЗначениеКонструктора = Значение; +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми(&ЗначениеПоставщика("ПередВсеми") Значение) Экспорт + ЖурналВыполнения.Записать("ПередВсеми " + Значение); +КонецПроцедуры + +&ПередКаждым +Процедура ПередКаждым(&ЗначениеПоставщика("Счетчик") Номер) Экспорт + ЖурналВыполнения.Записать("ПередКаждым " + Номер); +КонецПроцедуры + +&Тест +Процедура Тест(&ЗначениеПоставщика("Счетчик") Номер) Экспорт + ЖурналВыполнения.Записать("Тест " + Номер + " " + ЗначениеКонструктора); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение(1, 2) +Процедура Параметризованный(А, &ЗначениеПоставщика("Середина") Б, В) Экспорт + ЖурналВыполнения.Записать(СтрШаблон("Параметризованный %1 %2 %3", А, Б, В)); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение(1) +Процедура СУмолчанием(А, Б = 5, &ЗначениеПоставщика("Последний") В) Экспорт + ЖурналВыполнения.Записать(СтрШаблон("СУмолчанием %1 %2 %3", А, Б, В)); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникJSON("[ {""В"": 3, ""А"": 1} ]") +Процедура ПоИмени(А, &ЗначениеПоставщика("Середина") Б, В) Экспорт + ЖурналВыполнения.Записать(СтрШаблон("ПоИмени %1 %2 %3", А, Б, В)); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникНеопределено +Процедура ВсеНеопределено(А, &ЗначениеПоставщика("Последний") Б) Экспорт + ЖурналВыполнения.Записать(СтрШаблон("ВсеНеопределено %1 %2", ТипЗнч(А), Б)); +КонецПроцедуры + +&ПослеВсех +Процедура ПослеВсех(&ЗначениеПоставщика("ПослеВсех") Значение) Экспорт + ЖурналВыполнения.Записать("ПослеВсех " + Значение); +КонецПроцедуры + +// Сигнатура без поставщиков для проверок аргументов вызова +Процедура БезПоставщиков(А, Б = 5) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265\320\274.os" new file mode 100644 index 0000000..9a728bf --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265\320\274.os" @@ -0,0 +1,21 @@ +// Компанейский набор с поставщиком параметра конструктора и выражением источника: +// экземпляр для выражения создается при обнаружении без значений поставщиков - +// конструктор получает Неопределено, а значение получает экземпляр исполнения + +#Использовать collectionos +#Использовать "Поставщики" +#Использовать "../../support" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта(&ЗначениеПоставщика("Выражение") Значение) + ЖурналВыполнения.Записать("Конструктор получил " + ?(Значение = Неопределено, "Неопределено", Значение)); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникВыражение("() -> Значения()") +Процедура Тест(А) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +Функция Значения() Экспорт + Возврат ПроцессорыКоллекций.ИзНабора(Списки.ИзЭлементов(1)); +КонецФункции diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\242\320\265\321\201\321\202\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\242\320\265\321\201\321\202\320\276\320\274.os" new file mode 100644 index 0000000..89225cc --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\274\320\230\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\242\320\265\321\201\321\202\320\276\320\274.os" @@ -0,0 +1,22 @@ +// Набор с упавшим и зеленым тестами, параметры которых получают значения поставщика: +// закрытие контекста видит результат своего узла и падения его потомков + +#Использовать asserts +#Использовать "Поставщики" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ПередВсеми +Процедура ПередВсеми(&ЗначениеПоставщика П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +&Тест +Процедура Падающий(&ЗначениеПоставщика П) Экспорт // BSLLS:UnusedParameters-off + Ожидаем.Что(1).Равно(2); +КонецПроцедуры + +&Тест +Процедура Зеленый(&ЗначениеПоставщика П) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\262.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\262.os" new file mode 100644 index 0000000..a933407 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\274\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\276\320\262.os" @@ -0,0 +1,20 @@ +// Набор, поставщики параметров которого создаются по-разному: конструктор одного +// падает, конструктор другого пишет в консоль + +#Использовать asserts +#Использовать "Поставщики" +#Использовать "../../support" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +Процедура ПадающийКонструкторПоставщика(&ПоставщикЗначения("ПоставщикСПадающимКонструктором") П) Экспорт // BSLLS:UnusedParameters-off + ЖурналВыполнения.Записать("ПадающийКонструкторПоставщика выполнен"); +КонецПроцедуры + +&Тест +Процедура ВыводКонструктораПоставщика(&ПоставщикЗначения("ПоставщикСВыводомКонструктора") П) Экспорт + Ожидаем.Что(П).Равно("Со своим выводом"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\242\320\260\320\271\320\274\320\260\321\203\321\202\320\276\320\274\320\230\320\237\320\276\320\267\320\264\320\275\320\270\320\274\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\242\320\260\320\271\320\274\320\260\321\203\321\202\320\276\320\274\320\230\320\237\320\276\320\267\320\264\320\275\320\270\320\274\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" new file mode 100644 index 0000000..72c36e2 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\260\320\261\320\276\321\200\320\241\320\242\320\260\320\271\320\274\320\260\321\203\321\202\320\276\320\274\320\230\320\237\320\276\320\267\320\264\320\275\320\270\320\274\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\265\320\274.os" @@ -0,0 +1,22 @@ +// Тест с таймаутом и регистрацией действия после закрытия контекста. +// Контекст закрывается при завершении узла без ожидания фонового метода. +// Поздно зарегистрированное действие выполняется синхронно при регистрации. + +#Использовать "Поставщики" +#Использовать "../../support" + +&ТестовыйНабор +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Тест +&Таймаут(50) +Процедура Тест(&ЗначениеПоставщика("Контекст") Контекст) Экспорт + Приостановить(300); + Контекст.ПриЗакрытии(Новый Действие(ЭтотОбъект, "ПозднееЗакрытие")); + ЖурналВыполнения.Записать("Позднее действие добавлено"); +КонецПроцедуры + +Процедура ПозднееЗакрытие(Контекст) Экспорт + ЖурналВыполнения.Записать("Позднее закрытие " + Контекст.Результат().Получить().Состояние()); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\222\321\202\320\276\321\200\320\276\320\271.os" "b/tests/fixtures/resolvers/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\222\321\202\320\276\321\200\320\276\320\271.os" new file mode 100644 index 0000000..c7378b3 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\222\321\202\320\276\321\200\320\276\320\271.os" @@ -0,0 +1,11 @@ +// Один из двух желудей с прозвищем НеоднозначныйПоставщик: по прозвищу autumn +// не может выбрать поставщика и бросает исключение при поиске + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт // BSLLS:UnusedParameters-off + Возврат "Второй"; +КонецФункции + +&Желудь +&Прозвище("НеоднозначныйПоставщик") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\237\320\265\321\200\320\262\321\213\320\271.os" "b/tests/fixtures/resolvers/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\237\320\265\321\200\320\262\321\213\320\271.os" new file mode 100644 index 0000000..db509d4 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\237\320\265\321\200\320\262\321\213\320\271.os" @@ -0,0 +1,11 @@ +// Один из двух желудей с прозвищем НеоднозначныйПоставщик: по прозвищу autumn +// не может выбрать поставщика и бросает исключение при поиске + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт // BSLLS:UnusedParameters-off + Возврат "Первый"; +КонецФункции + +&Желудь +&Прозвище("НеоднозначныйПоставщик") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\321\203\320\261\320\273\320\270\321\200\321\203\321\216\321\211\320\270\320\271\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.os" "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\321\203\320\261\320\273\320\270\321\200\321\203\321\216\321\211\320\270\320\271\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.os" new file mode 100644 index 0000000..d0066a4 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\321\203\320\261\320\273\320\270\321\200\321\203\321\216\321\211\320\270\320\271\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.os" @@ -0,0 +1,16 @@ +// Второй подписчик заполнения аргументов: задает значения тем же параметрам, +// что и РазрешениеЗначений. Подписку добавляет напильник при создании желудя, +// поэтому подписчик работает только в поделке, которая его создала + +&ПодпискаНаСобытие("ЗаполнениеАргументов") +Процедура ПриЗаполненииАргументов(Узел, Аргументы) Экспорт // BSLLS:UnusedParameters-off + + Для Каждого Индекс Из Аргументы.ИндексыЗаполняемыхПараметров() Цикл + Аргументы.Установить(Индекс, "Дубль"); + КонецЦикла; + +КонецПроцедуры + +&Желудь +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" new file mode 100644 index 0000000..b2f18fc --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" @@ -0,0 +1,12 @@ +// Подписчик события, исключение которого прерывает исполнение плана посреди набора. +// Подписку добавляет напильник при создании желудя, поэтому подписчик работает +// только в поделке, которая его создала + +&ПодпискаНаСобытие("ИсполнениеТестКонец") +Процедура ПриЗавершенииТеста(Тест, Результат) Экспорт // BSLLS:UnusedParameters-off + ВызватьИсключение "Подписчик не смог"; +КонецПроцедуры + +&Желудь +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\271\320\227\320\260\321\200\320\260\320\275\320\265\320\265.os" "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\271\320\227\320\260\321\200\320\260\320\275\320\265\320\265.os" new file mode 100644 index 0000000..6eb96b9 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\227\320\260\320\272\321\200\321\213\321\202\320\270\320\271\320\227\320\260\321\200\320\260\320\275\320\265\320\265.os" @@ -0,0 +1,25 @@ +// Подписчик начала плана, который заранее добавляет действие закрытия в контекст +// каждого теста: так в контексте оказывается действие и у теста, до которого +// исполнение не дойдет. Подписку добавляет напильник при создании желудя, поэтому +// подписчик работает только в поделке, которая его создала + +#Использовать "../../../../support" + +&ПодпискаНаСобытие("ИсполнениеТестПланНачало") +Процедура ПриНачалеПлана(ТестПлан) Экспорт + + Для Каждого Набор Из ТестПлан.Дети() Цикл + Для Каждого Тест Из Набор.Дети() Цикл + Тест.Контекст().ПриЗакрытии(Новый Действие(ЭтотОбъект, "Закрыть")); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +Процедура Закрыть(Контекст) Экспорт + ЖурналВыполнения.Записать("Закрыт заранее " + Контекст.Узел().Имя()); +КонецПроцедуры + +&Желудь +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\227\320\260\320\272\321\200\321\213\321\202\320\270\321\217\320\227\320\265\321\200\320\272\320\260\320\273.os" "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\227\320\260\320\272\321\200\321\213\321\202\320\270\321\217\320\227\320\265\321\200\320\272\320\260\320\273.os" new file mode 100644 index 0000000..4897841 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\277\320\270\321\201\321\207\320\270\320\272\320\227\320\260\320\272\321\200\321\213\321\202\320\270\321\217\320\227\320\265\321\200\320\272\320\260\320\273.os" @@ -0,0 +1,29 @@ +// Подписчик начала теста, который добавляет действие закрытия в контекст теста, +// в том числе зеркала изолированного теста в родителе. Подписку добавляет напильник +// при создании желудя, поэтому подписчик работает только в поделке, которая его создала + +#Использовать "../../../../support" + +&ПодпискаНаСобытие("ИсполнениеТестНачало") +Процедура ПриНачалеТеста(Тест) Экспорт + + // У контейнера действий закрытия нет + Если Тест.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда + Возврат; + КонецЕсли; + + Тест.Контекст().ПриЗакрытии(Новый Действие(ЭтотОбъект, "Закрыть")); + +КонецПроцедуры + +Процедура Закрыть(Контекст) Экспорт + ЖурналВыполнения.Записать(СтрШаблон( + "Подписчик закрыл %1 %2", + Контекст.Узел().Имя(), + Контекст.Результат().Получить().Состояние() + )); +КонецПроцедуры + +&Желудь +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" new file mode 100644 index 0000000..99520c6 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" @@ -0,0 +1,6 @@ +// Аннотация параметра или поля, значение которых дает ПоставщикИзНастройки +// +&Аннотация("ЗначениеИзНастройки") +&ПоставщикЗначения("ПоставщикИзНастройки") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" new file mode 100644 index 0000000..5dde1e1 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\260\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" @@ -0,0 +1,18 @@ +// Регистрирует ПоставщикИзНастройки, только если деталька ПоставщикИзНастройки.Включен +// истинна: так приложение включает часть желудей конфигурацией. Изолированный узел +// включает его советом (см. СоветыПоставщикаИзНастройки), и поставщик есть только +// в среде узла + +Процедура ПриИнициализацииПоделки(Поделка) Экспорт + + Если Поделка.НайтиДетальку("ПоставщикИзНастройки.Включен", Ложь) Тогда + Поделка.ДобавитьЗавязь( + "&Завязь(""ПоставщикИзНастройки"", Тип = ""ЗначенияИзНастройки"") () -> Возврат Новый ЗначенияИзНастройки;" + ); + КонецЕсли; + +КонецПроцедуры + +&Заготовка +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" new file mode 100644 index 0000000..20787e8 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" @@ -0,0 +1,6 @@ +// Поставщик значений, которого регистрирует ЗаготовкаПоставщикаИзНастройки: значение +// говорит, что его дала среда, где поставщик включен + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт // BSLLS:UnusedParameters-off + Возврат "из настройки"; +КонецФункции diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\262\320\265\321\202\321\213\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\262\320\265\321\202\321\213\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" new file mode 100644 index 0000000..f370ced --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\262\320\265\321\202\321\213\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260\320\230\320\267\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" @@ -0,0 +1,21 @@ +#Использовать autumn +#Использовать collectionos + +// Возвращает совет изолированной поделки, в которой включен ПоставщикИзНастройки +// +// Возвращаемое значение: +// СоветДругогоМастера - Совет со значением детальки "ПоставщикИзНастройки.Включен" +// +Функция СоветСПоставщиком() Экспорт + + Совет = Новый СоветДругогоМастера(); + Совет.ПолучитьСтроительМенеджераПараметров().ДобавитьПровайдерСоответствие( + Новый Соответствие(Соответствия.ИзЭлементов( + "ПоставщикИзНастройки", + Новый Соответствие(Соответствия.ИзЭлементов("Включен", Истина)) + )) + ); + + Возврат Совет; + +КонецФункции diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" new file mode 100644 index 0000000..98fd3ca --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\260.os" @@ -0,0 +1,10 @@ +// Аннотация параметра или поля для тестов поставщиков значений: значение дает +// ПоставщикЗначенийТестов +// +// Параметры: +// Значение - Строка - Значение параметра или особое значение, см. ПоставщикЗначенийТестов +// +&Аннотация("ЗначениеПоставщика") +&ПоставщикЗначения("ПоставщикЗначенийТестов") +Процедура ПриСозданииОбъекта(Значение = "") +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272.os" new file mode 100644 index 0000000..549afdc --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\320\267\320\260\321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272.os" @@ -0,0 +1,5 @@ +// Аннотация параметра или поля, поставщик которой не зарегистрирован в поделке +&Аннотация("НезарегистрированныйПоставщик") +&ПоставщикЗначения("ПоставщикКоторогоНет") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271\320\242\320\265\321\201\321\202\320\276\320\262.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271\320\242\320\265\321\201\321\202\320\276\320\262.os" new file mode 100644 index 0000000..2cdb1d3 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271\320\242\320\265\321\201\321\202\320\276\320\262.os" @@ -0,0 +1,88 @@ +// Поставщик значений параметров и полей для тестов поставщиков: отдает значение аннотации +// &ЗначениеПоставщика и пишет в журнал, для какого узла его спросили и как узел +// закрылся. Особые значения: +// "Счетчик" - номер запроса в хранилище контекста узла; +// "Упасть" - исключение поставщика; +// "ПадениеЗакрытия" - исключение действия закрытия; +// "Контекст" - сам контекст исполнения: код теста добавляет в него действия + +#Использовать annotations +#Использовать "../../../../support" + +Перем Метка; // Строка - Метод и параметр или поле, для которых спросили поставщика + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт + + ЗначениеАннотации = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( + КонтекстЭлемента.Аннотация("ЗначениеПоставщика").Получить(), + "Значение", + "" + ); + + Если ТипЗнч(КонтекстЭлемента) = Тип("КонтекстПоля") Тогда + Метка = "Поле." + КонтекстЭлемента.Имя(); + Описание = Метка; + Иначе + Метка = КонтекстЭлемента.Метод().Имя + "." + КонтекстЭлемента.Имя(); + Описание = СтрШаблон("%1[%2]", Метка, КонтекстЭлемента.Индекс()); + КонецЕсли; + + Сообщить("Вывод поставщика " + Метка); + + ЖурналВыполнения.Записать(СтрШаблон("Поставщик %1 для %2", Описание, ИмяУзла(КонтекстИсполнения))); + + Если ЗначениеАннотации = "Упасть" Тогда + ВызватьИсключение "Поставщик не смог"; + КонецЕсли; + + КонтекстИсполнения.ПриЗакрытии(Новый Действие( + ЭтотОбъект, + ?(ЗначениеАннотации = "ПадениеЗакрытия", "ЗакрытьСПадением", "Закрыть") + )); + + Если ЗначениеАннотации = "Контекст" Тогда + Возврат КонтекстИсполнения; + КонецЕсли; + + Если ЗначениеАннотации = "Счетчик" Тогда + Номер = КонтекстИсполнения.Хранилище().ПолучитьИлиУмолчание("Счетчик", 0) + 1; + КонтекстИсполнения.Хранилище().Вставить("Счетчик", Номер); + Возврат Номер; + КонецЕсли; + + Возврат ЗначениеАннотации; + +КонецФункции + +Процедура Закрыть(Контекст) Экспорт + + Сообщить("Вывод закрытия " + Метка); + + Состояние = "-"; + + Если Контекст.Результат().СодержитЗначение() Тогда + Состояние = Контекст.Результат().Получить().Состояние(); + КонецЕсли; + + ЖурналВыполнения.Записать(СтрШаблон( + "Закрыт %1: %2 %3 падения=%4", + ИмяУзла(Контекст), + Метка, + Состояние, + Формат(Контекст.ЕстьПадения(), "БЛ=Нет; БИ=Да") + )); + +КонецПроцедуры + +Процедура ЗакрытьСПадением(Контекст) Экспорт // BSLLS:UnusedParameters-off + ВызватьИсключение "Закрытие не смогло"; +КонецПроцедуры + +Функция ИмяУзла(Контекст) + Возврат Контекст.Узел().Имя(); +КонецФункции + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта() +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\237\321\200\320\270\320\267\320\275\320\260\320\272\320\260\320\241\321\200\320\265\320\264\321\213.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\237\321\200\320\270\320\267\320\275\320\260\320\272\320\260\320\241\321\200\320\265\320\264\321\213.os" new file mode 100644 index 0000000..13083df --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\237\321\200\320\270\320\267\320\275\320\260\320\272\320\260\320\241\321\200\320\265\320\264\321\213.os" @@ -0,0 +1,14 @@ +// Поставщик, значение которого говорит, где его спросили: Истина - в изолированной +// среде, Ложь - в родителе + +Перем ВСреде; // Булево - Поставщик создан в изолированной среде + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт // BSLLS:UnusedParameters-off + Возврат ВСреде; +КонецФункции + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта(&Деталька("OneUnit.ВыполняетсяВИзоляции", ЗначениеПоУмолчанию = Ложь) ПризнакСреды) + ВСреде = ПризнакСреды; +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\241\320\222\321\213\320\262\320\276\320\264\320\276\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\241\320\222\321\213\320\262\320\276\320\264\320\276\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260.os" new file mode 100644 index 0000000..0ceb084 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\241\320\222\321\213\320\262\320\276\320\264\320\276\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260.os" @@ -0,0 +1,12 @@ +// Поставщик, конструктор которого пишет в консоль: вывод создания поставщика +// достается узлу, для которого спросили значение + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт // BSLLS:UnusedParameters-off + Возврат "Со своим выводом"; +КонецФункции + +&Желудь +&Характер("Компанейский") +Процедура ПриСозданииОбъекта() + Сообщить("Вывод конструктора поставщика"); +КонецПроцедуры diff --git "a/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\276\320\274.os" "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\276\320\274.os" new file mode 100644 index 0000000..4e6d549 --- /dev/null +++ "b/tests/fixtures/resolvers/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\241\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\276\320\274.os" @@ -0,0 +1,11 @@ +// Поставщик, конструктор которого падает: autumn глотает исключение конструктора, +// пишет его в лог и возвращает Неопределено + +Функция Значение(КонтекстЭлемента, КонтекстИсполнения) Экспорт // BSLLS:UnusedParameters-off + Возврат "Не дойдет"; +КонецФункции + +&Желудь +Процедура ПриСозданииОбъекта() + ВызватьИсключение "Конструктор поставщика не смог"; +КонецПроцедуры diff --git "a/tests/\320\230\320\267\320\276\320\273\321\217\321\206\320\270\321\217.os" "b/tests/\320\230\320\267\320\276\320\273\321\217\321\206\320\270\321\217.os" index 72c7308..13c647d 100644 --- "a/tests/\320\230\320\267\320\276\320\273\321\217\321\206\320\270\321\217.os" +++ "b/tests/\320\230\320\267\320\276\320\273\321\217\321\206\320\270\321\217.os" @@ -1,7 +1,4 @@ // Тесты изоляции прогонов на уровне поделки. -// -// Внимание: у этого сценария намеренно нет конструктора с аннотацией &ТестовыйНабор, -// см. пояснение в Исполнитель.os - вложенные прогоны создают поделки. #Использовать asserts #Использовать "./support" @@ -128,6 +125,35 @@ КонецПроцедуры +&ПараметризованныйТест +&ИсточникЗначение("ИзолированныйПоделочныйКрасныйНабор") +&ИсточникЗначение("ИзолированныйПроцессныйКрасныйНабор") +Процедура ПаденияИзолированныхТестовОтмечаютсяВКонтекстах(ИмяНабора) Экспорт + + ДопДетальки = Новый Соответствие; + ДопДетальки.Вставить("OneUnit.ПрерыватьПриПервомПадении", Ложь); + + Прогон = ПрогоныТестов.Прогнать( + ИмяНабора, + "", + "./tests/fixtures/isolation/" + ИмяНабора + ".os", + ДопДетальки + ); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, ИмяНабора); + Тест = ПрогоныТестов.НайтиТест(Набор, "КрасныйТест"); + + Ожидаем.Что(Прогон.Статистика.Результат(Тест).Состояние()).Равно(СостоянияВыполненияТестов.Ошибка); + + // Результат самого набора успешен: падение должно прийти от зеркала теста + // независимо от настройки прекращения прогона + Ожидаем.Что(Прогон.Статистика.Результат(Набор).Состояние()).Равно(СостоянияВыполненияТестов.Успех); + Ожидаем.Что(Тест.Контекст().ЕстьПадения()).ЭтоИстина(); + Ожидаем.Что(Набор.Контекст().ЕстьПадения()).ЭтоИстина(); + Ожидаем.Что(Прогон.План.Контекст().ЕстьПадения()).ЭтоИстина(); + +КонецПроцедуры + &Тест Процедура ИзолированныеТестыВыполняютсяВСвоихКонтекстах() Экспорт @@ -265,7 +291,12 @@ // Кодовая страница консоли не должна искажать имена в строке канала, а BOM, // которым консоль в UTF-8 начинает порции вывода процесса, - прятать сообщение - Состав = Списки.ИзЭлементов(Новый Структура("Имя, Тесты", "НаборСКириллицей", Списки.ИзЭлементов())); + Состав = Списки.ИзЭлементов(Новый Структура( + "Имя, Тесты, Ошибки", + "НаборСКириллицей", + Списки.ИзЭлементов(), + Списки.ИзЭлементов() + )); // Поделка без прогона: канал - желудь, но исполнять здесь нечего Детальки = Новый Соответствие; diff --git "a/tests/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214.os" "b/tests/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214.os" index 3b516f4..0ed233e 100644 --- "a/tests/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214.os" +++ "b/tests/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214.os" @@ -1,8 +1,4 @@ // Тесты исполнения тест плана: состояния, жизненный цикл, статистика, отчёты. -// -// Внимание: у этого сценария намеренно нет конструктора с аннотацией &ТестовыйНабор. -// Аннотированные типы видны всем поделкам процесса, и вложенная поделка -// зациклится, повторно исполняя этот же сценарий. #Использовать asserts #Использовать tempfiles @@ -359,10 +355,21 @@ НезарегистрированныйНабор = ЗагрузитьСценарийИзСтроки( "Функция ИмяЖелудя() Экспорт | Возврат ""НезарегистрированныйНабор""; + |КонецФункции + | + |Функция НайтиСигнатуруКонструктора() Экспорт + | Возврат Опциональные.Пустой(); + |КонецФункции + | + |Функция Одиночка() Экспорт + | Возврат Ложь; |КонецФункции" ); - Создание = Поделка.НайтиЖелудь("ФабрикаЭкземпляров").Создать(НезарегистрированныйНабор); + Создание = Поделка.НайтиЖелудь("ФабрикаЭкземпляров").Создать( + НезарегистрированныйНабор, + Поделка.НайтиЖелудь("ТестПлан") + ); Ожидаем.Что(Создание.Экземпляр.СодержитЗначение()).ЭтоЛожь(); Ожидаем.Что(Создание.Отказ.СодержитЗначение()).ЭтоИстина(); @@ -801,6 +808,29 @@ КонецПроцедуры +&Тест +Процедура ОдиночкаСоздаетсяОдинРазЗаПрогон() Экспорт + + // Поделка живет дольше одного прогона, а экземпляр одиночки - нет: повторный + // Тестировать() создает свой, без состояния прошлого прогона + + ЖурналВыполнения.Очистить(); + + Прогон = ПрогоныТестов.Прогнать( + "НаборОдиночкаВПовторномПрогоне", + "", + "./tests/fixtures/execution/НаборОдиночкаВПовторномПрогоне.os" + ); + + Прогон.Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + Ожидаем.Что(ЖурналВыполнения.Записи).РавноМассиву(СтрРазделить( + "Конструктор одиночки|Состояние до теста: чистое|Конструктор одиночки|Состояние до теста: чистое", + "|" + )); + +КонецПроцедуры + &Тест Процедура БезПрерыванияИдутВсеТесты() Экспорт diff --git "a/tests/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214.os" "b/tests/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214.os" index 320ebae..322849e 100644 --- "a/tests/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214.os" +++ "b/tests/\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\270\321\202\320\265\320\273\321\214.os" @@ -1202,16 +1202,16 @@ Ожидаем.Что(ТестНабор.Путь()).Равно(Путь); Ожидаем.Что(Строка(ТестНабор)).Равно(Имя + " (" + Путь + ")"); - Экземпляр = ФабрикаЭкземпляров.Создать(ТестНабор).Экземпляр; + Экземпляр = ФабрикаЭкземпляров.Создать(ТестНабор, ТестНабор).Экземпляр; Если Не ПроверятьТестНабор Тогда Ожидаем.Что(Экземпляр.СодержитЗначение()).ЭтоЛожь(); ИначеЕсли ЭтоОдиночка Тогда Ожидаем.Что(Экземпляр.Получить()).ИмеетТип("oneunit_testsuite_" + Имя); - Ожидаем.Что(Экземпляр.Получить()).Равно(ФабрикаЭкземпляров.Создать(ТестНабор).Экземпляр.Получить()); + Ожидаем.Что(Экземпляр.Получить()).Равно(ФабрикаЭкземпляров.Создать(ТестНабор, ТестНабор).Экземпляр.Получить()); Иначе Ожидаем.Что(Экземпляр.Получить()).ИмеетТип("oneunit_testsuite_" + Имя); - Ожидаем.Что(Экземпляр.Получить()).Не_().Равно(ФабрикаЭкземпляров.Создать(ТестНабор).Экземпляр.Получить()); + Ожидаем.Что(Экземпляр.Получить()).Не_().Равно(ФабрикаЭкземпляров.Создать(ТестНабор, ТестНабор).Экземпляр.Получить()); КонецЕсли; Ожидаем.Что(ТестНабор.Таймаут()).Равно(Таймаут); diff --git "a/tests/\320\236\321\210\320\270\320\261\320\272\320\270\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" "b/tests/\320\236\321\210\320\270\320\261\320\272\320\270\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" index 33311d5..efcd1c0 100644 --- "a/tests/\320\236\321\210\320\270\320\261\320\272\320\270\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" +++ "b/tests/\320\236\321\210\320\270\320\261\320\272\320\270\320\236\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" @@ -1,7 +1,4 @@ // Тесты ошибок обнаружения тестов на некорректных фикстурах -// -// Внимание: у этого сценария намеренно нет конструктора с аннотацией &ТестовыйНабор, -// см. пояснение в Исполнитель.os #Использовать asserts #Использовать "./support" @@ -229,6 +226,35 @@ КонецПроцедуры +&Тест +Процедура НеизвестныйХарактерЛомаетНабор() Экспорт + + // Характер читает обнаружитель, а не autumn: неизвестный ломает свой набор, + // а не сборку поделки + План = ПланОбнаружения("НаборСНеизвестнымХарактером"); + Набор = ПрогоныТестов.НайтиНабор(План, "НаборСНеизвестнымХарактером"); + + Ожидаем.Что(Набор.Дети()).ИмеетДлину(0); + Ожидаем.Что(Набор.ОшибкиОбнаружения()).ИмеетДлину(1); + Ожидаем.Что(Набор.ОшибкиОбнаружения().Получить(0).Описание).Содержит("неизвестный характер: Галактика"); + +КонецПроцедуры + +&Тест +Процедура ХарактерАннотациейХарактерЛомаетНабор() Экспорт + + // Явный &Характер("Одиночка") autumn держал бы, пока жива поделка, а одиночка + // набора живет один прогон + План = ПланОбнаружения("НаборСЯвнымХарактером"); + Набор = ПрогоныТестов.НайтиНабор(План, "НаборСЯвнымХарактером"); + + Ожидаем.Что(Набор.Дети()).ИмеетДлину(0); + Ожидаем.Что(Набор.ОшибкиОбнаружения()).ИмеетДлину(1); + Ожидаем.Что(Набор.ОшибкиОбнаружения().Получить(0).Описание) + .Содержит("задается параметром Характер аннотации ТестовыйНабор"); + +КонецПроцедуры + Функция ПланОбнаружения(ИмяНабора) Возврат ПоделкаОбнаружения(ИмяНабора).НайтиЖелудь("МенеджерТестирования").Обнаружить(); КонецФункции diff --git "a/tests/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" "b/tests/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" new file mode 100644 index 0000000..4d38686 --- /dev/null +++ "b/tests/\320\237\320\276\321\201\321\202\320\260\320\262\321\211\320\270\320\272\320\270\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" @@ -0,0 +1,1334 @@ +// Тесты поставщиков значений (&ПоставщикЗначения): значения параметров методов, +// конструкторов и полей наборов, контексты исполнения узлов и их закрытие. + +#Использовать asserts +#Использовать "./support" +#Использовать ".." + +#Область ЗначенияПараметров + +&Тест +Процедура ПараметрыМетодовИКонструктораПолучаютЗначенияПоставщика() Экспорт + + Прогон = ПрогнатьНабор("НаборСПоставщикамиПараметров"); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСПоставщикамиПараметров"); + + Ожидаем.Что(Прогон.Статистика.Результат(Набор).Состояние()).Равно(СостоянияВыполненияТестов.Успех); + + Статистика = Прогон.Статистика.СтатистикаТестПлана(); + + Ожидаем.Что(Статистика.ПолучитьИлиУмолчание("ТестовОбнаружено", 0)).Равно(5); + Ожидаем.Что(Статистика.ПолучитьИлиУмолчание("ТестовУспешно", 0)).Равно(5); + + ИндексЗаписи("ПередВсеми ПередВсеми"); + ИндексЗаписи("ПослеВсех ПослеВсех"); + + // Хранилище контекста теста общее для его методов: ПередКаждым спросил первым + ИндексЗаписи("ПередКаждым 1"); + ИндексЗаписи("Тест 2 Конструктор"); + +КонецПроцедуры + +&Тест +Процедура ПоставщикаСпрашиваютВКонтекстеУзлаВызова() Экспорт + + ПрогнатьНабор("НаборСПоставщикамиПараметров"); + + // Методы жизненного цикла набора - в контексте набора + ИндексЗаписи("Поставщик ПередВсеми.Значение[0] для НаборСПоставщикамиПараметров"); + ИндексЗаписи("Поставщик ПослеВсех.Значение[0] для НаборСПоставщикамиПараметров"); + + // Методы теста - в контексте теста + ИндексЗаписи("Поставщик ПередКаждым.Номер[0] для Тест"); + ИндексЗаписи("Поставщик Тест.Номер[0] для Тест"); + + // Конструктор - в контексте узла, для которого создается экземпляр + ИндексЗаписи("Поставщик ПриСозданииОбъекта.Значение[0] для НаборСПоставщикамиПараметров"); + ИндексЗаписи("Поставщик ПриСозданииОбъекта.Значение[0] для Тест"); + +КонецПроцедуры + +&Тест +Процедура ПозиционныеЗначенияЗаполняютПараметрыБезПоставщика() Экспорт + + ПрогнатьНабор("НаборСПоставщикамиПараметров"); + + ИндексЗаписи("Параметризованный 1 Середина 2"); + ИндексЗаписи("СУмолчанием 1 5 Последний"); + ИндексЗаписи("ПоИмени 1 Середина 3"); + ИндексЗаписи("ВсеНеопределено Неопределено Последний"); + +КонецПроцедуры + +&Тест +Процедура ВыводПоставщикаИЗакрытияВходитВВыводУзла() Экспорт + + Прогон = ПрогнатьНабор("НаборСПоставщикамиПараметров"); + + Вывод = РезультатТеста(Прогон, "НаборСПоставщикамиПараметров", "Тест").Вывод(); + + ВыводПоставщика = СтрНайти(Вывод, "Вывод поставщика Тест.Номер"); + ВыводЗакрытия = СтрНайти(Вывод, "Вывод закрытия Тест.Номер"); + + Ожидаем.Что(ВыводПоставщика, Вывод).Больше(0); + Ожидаем.Что(ВыводЗакрытия, Вывод).Больше(ВыводПоставщика); + +КонецПроцедуры + +&Тест +Процедура АргументыВозвращаютЛюбойПараметрПоИндексу() Экспорт + + Аргументы = АргументыМетода("Параметризованный", Списки.ИзЭлементов(1, 2)); + + // Позиционные значения доступны и до заполнения параметра поставщика + Ожидаем.Что(Аргументы.Значение(0)).Равно(1); + Ожидаем.Что(Аргументы.Значение(2)).Равно(2); + + Параметры = Новый Массив; + Параметры.Добавить(1); + + Ожидаем.Что(Аргументы).Метод("Значение", Параметры).ВыбрасываетИсключение( + "Значение параметра Б метода Параметризованный не установлено" + ); + + // Полученное Неопределено отличается от еще не заполненного параметра + Аргументы.Установить(1, Неопределено); + Ожидаем.Что(Аргументы.Значение(1)).ЭтоНеопределено(); + + Значения = Аргументы.Значения(); + Ожидаем.Что(Значения.Количество()).Равно(3); + Ожидаем.Что(Значения.Получить(0)).Равно(1); + Ожидаем.Что(Значения.Получить(1)).ЭтоНеопределено(); + Ожидаем.Что(Значения.Получить(2)).Равно(2); + + Параметры.Добавить(Неопределено); + Ожидаем.Что(Аргументы).Метод("Установить", Параметры).ВыбрасываетИсключение( + "Значение параметра Б метода Параметризованный уже получено" + ); + +КонецПроцедуры + +&Тест +Процедура АргументыСохраняютNullИОбъектныеЗначения() Экспорт + + Значения = Новый СписокМассив; + Значения.Добавить(Null); + Значения.Добавить(Новый Структура); + Значения.Добавить(Опциональные.Пустой()); + + Для Каждого Значение Из Значения Цикл + + Аргументы = АргументыМетода("Параметризованный", Списки.ИзЭлементов(1, 2)); + Аргументы.Установить(1, Значение); + + Ожидаем.Что(Аргументы.Значение(1)).Равно(Значение); + Ожидаем.Что(Аргументы.Значения().Получить(1)).Равно(Значение); + + Параметры = Новый Массив; + Параметры.Добавить(1); + Параметры.Добавить(Неопределено); + + Ожидаем.Что(Аргументы).Метод("Установить", Параметры).ВыбрасываетИсключение( + "Значение параметра Б метода Параметризованный уже получено" + ); + + Ожидаем.Что(Аргументы.Значение(1)).Равно(Значение); + + КонецЦикла; + +КонецПроцедуры + +&Тест +Процедура АргументыРазличаютУмолчаниеИПереданноеНеопределено() Экспорт + + Аргументы = АргументыМетода("СУмолчанием", Списки.ИзЭлементов(1)); + Аргументы.Установить(2, "Последний"); + + Ожидаем.Что(Аргументы.Значение(1)).Равно(5); + Ожидаем.Что(Аргументы.Значения().Получить(1)).Равно(5); + + Аргументы = АргументыМетода("СУмолчанием", Списки.ИзЭлементов(1, Неопределено)); + Аргументы.Установить(2, "Последний"); + + Ожидаем.Что(Аргументы.Значение(1)).ЭтоНеопределено(); + Ожидаем.Что(Аргументы.Значения().Получить(1)).ЭтоНеопределено(); + + Аргументы = АргументыМетода("Параметризованный", Списки.ИзЭлементов(1)); + Аргументы.Установить(1, "Середина"); + + Ожидаем.Что(Аргументы.Значение(2)).ЭтоНеопределено(); + Ожидаем.Что(Аргументы.Значения().Получить(2)).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура АргументыСохраняютСписокВызоваБезПоставщиков() Экспорт + + Аргументы = АргументыМетода("БезПоставщиков", Списки.ИзЭлементов(1)); + + Ожидаем.Что(Аргументы.Значение(0)).Равно(1); + Ожидаем.Что(Аргументы.Значение(1)).Равно(5); + Ожидаем.Что(Аргументы.Значения().Количество()).Равно(1); + + // Пропущенный обязательный аргумент должен остаться пропущенным при вызове + Аргументы = АргументыМетода("БезПоставщиков", Списки.ИзЭлементов()); + Ожидаем.Что(Аргументы.Значения().Пусто()).ЭтоИстина(); + +КонецПроцедуры + +&Тест +Процедура АргументыСохраняютЛишниеПозиционныеЗначения() Экспорт + + Аргументы = АргументыМетода("Параметризованный", Списки.ИзЭлементов(1, 2, 3)); + Аргументы.Установить(1, "Середина"); + + Значения = Аргументы.Значения(); + Ожидаем.Что(Значения.Количество()).Равно(4); + Ожидаем.Что(Значения.Получить(2)).Равно(2); + Ожидаем.Что(Значения.Получить(3)).Равно(3); + +КонецПроцедуры + +&Тест +Процедура ЗаполняемыйПараметрНеТребуетПоставщика() Экспорт + + Метод = АргументыМетода("БезПоставщиков", Списки.ИзЭлементов()).Метод(); + Аргументы = Новый АргументыВызова(Метод, Списки.ИзЭлементов(1), Списки.ИзЭлементов(1)); + + Ожидаем.Что(Аргументы.ТребуютЗаполнения()).ЭтоИстина(); + Ожидаем.Что(Аргументы.Значение(0)).Равно(1); + + Аргументы.Установить(1, Неопределено); + + Ожидаем.Что(Аргументы.Значение(1)).ЭтоНеопределено(); + Ожидаем.Что(Аргументы.Значения().Количество()).Равно(2); + Ожидаем.Что(Аргументы.Значения().Получить(1)).ЭтоНеопределено(); + + Параметры = Новый Массив; + Параметры.Добавить(1); + Параметры.Добавить(5); + + Ожидаем.Что(Аргументы).Метод("Установить", Параметры).ВыбрасываетИсключение( + "Значение параметра Б метода БезПоставщиков уже получено" + ); + +КонецПроцедуры + +#КонецОбласти + +#Область Закрытие + +&ПараметризованныйТест +&ИсточникЗначение("ПриЗакрытии") +&ИсточникЗначение("Закрыть") +Процедура ИсключениеВКритическомУчасткеОсвобождаетБлокировку(ИмяМетода) Экспорт + + План = ПоделкаНабора("НаборСПоставщикамиПараметров").НайтиЖелудь("МенеджерТестирования").Обнаружить(); + Набор = ПрогоныТестов.НайтиНабор(План, "НаборСПоставщикамиПараметров"); + Контекст = Новый КонтекстИсполнения(Набор); + + Рефлектор = Новый Рефлектор(); + Рефлектор.УстановитьСвойство(Контекст, "Закрытия", СписокДействийСОшибкой()); + Блокировка = Рефлектор.ПолучитьСвойство(Контекст, "Блокировка"); + + Аргумент = ?( + ИмяМетода = "ПриЗакрытии", + Новый Действие(ЭтотОбъект, "ДействиеЗакрытия"), + Опциональные.Пустой() + ); + Параметры = Списки.ИзЭлементов(Аргумент).ВМассив(); + + Ошибка = Опциональные.Пустой(); + + Попытка + Рефлектор.ВызватьМетод(Контекст, ИмяМетода, Параметры); + Исключение + Ошибка = Новый Опциональный(ИнформацияОбОшибке()); + КонецПопытки; + + // Разблокировка без захвата вызывает исключение. При утечке захвата этот вызов + // снимет его, чтобы проверка не оставила заблокированный ресурс + БлокировкаОсвобождена = Ложь; + + Попытка + Блокировка.Разблокировать(); + Исключение + БлокировкаОсвобождена = Истина; + КонецПопытки; + + Ожидаем.Что(БлокировкаОсвобождена, "Блокировка снята после исключения").ЭтоИстина(); + Ожидаем.Что(Ошибка.СодержитЗначение(), "Исключение из критического участка передано вызывающему").ЭтоИстина(); + Ожидаем.Что(Ошибка.Получить().Описание).Равно("Ошибка списка действий"); + Ожидаем.Что(Ошибка.Получить().Причина.Описание).Равно("Причина ошибки списка"); + +КонецПроцедуры + +&Тест +Процедура КонтекстЗакрываетсяПоЗавершенииУзлаВОбратномПорядке() Экспорт + + ПрогнатьНабор("НаборСПоставщикамиПараметров"); + + Тест = ИндексЗаписи("Тест 2 Конструктор"); + + // Спрашивали конструктор, ПередКаждым, тест - закрываются наоборот + ЗакрытиеТеста = ИндексЗаписи("Закрыт Тест: Тест.Номер Успех падения=Нет"); + ЗакрытиеПередКаждым = ИндексЗаписи("Закрыт Тест: ПередКаждым.Номер Успех падения=Нет"); + ЗакрытиеКонструктора = ИндексЗаписи("Закрыт Тест: ПриСозданииОбъекта.Значение Успех падения=Нет"); + + Ожидаем.Что(ЗакрытиеТеста).Больше(Тест); + Ожидаем.Что(ЗакрытиеПередКаждым).Больше(ЗакрытиеТеста); + Ожидаем.Что(ЗакрытиеКонструктора).Больше(ЗакрытиеПередКаждым); + + // Набор закрывается после своего последнего метода + Ожидаем.Что(ИндексЗаписи("Закрыт НаборСПоставщикамиПараметров: ПослеВсех.Значение Успех падения=Нет")) + .Больше(ИндексЗаписи("ПослеВсех ПослеВсех")); + +КонецПроцедуры + +&Тест +Процедура ЗакрытиеВидитРезультатУзлаИПадения() Экспорт + + ПрогнатьНабор("НаборСПоставщикомИПадающимТестом"); + + ИндексЗаписи("Закрыт Падающий: Падающий.П Ошибка падения=Да"); + ИндексЗаписи("Закрыт Зеленый: Зеленый.П Успех падения=Нет"); + + // Набор сам успешен, но в нем упал тест + ИндексЗаписи("Закрыт НаборСПоставщикомИПадающимТестом: ПередВсеми.П Успех падения=Да"); + +КонецПроцедуры + +&Тест +Процедура ДействиеПослеЗакрытияВыполняетсяСразу() Экспорт + + Прогон = ПрогнатьНабор("НаборСТаймаутомИПозднимЗакрытием"); + + // Метод, прерванный таймаутом, еще работает в фоне - ждем, пока он закончит + Приостановить(1000); + + Результат = РезультатТеста(Прогон, "НаборСТаймаутомИПозднимЗакрытием", "Тест"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + // Контекст закрыт по таймауту, не дожидаясь метода + Ожидаем.Что(ИндексЗаписи("Закрыт Тест: Тест.Контекст Сломан падения=Да")) + .Меньше(ИндексЗаписи("Позднее закрытие Сломан")); + + // Действие, добавленное после закрытия, выполнено сразу - до того, как добавивший + // пошел дальше + Ожидаем.Что(ИндексЗаписи("Позднее закрытие Сломан")) + .Меньше(ИндексЗаписи("Позднее действие добавлено")); + +КонецПроцедуры + +&Тест +Процедура ИсключениеЗакрытияЛомаетУзел() Экспорт + + Прогон = ПрогнатьНабор("НаборСПадающимПоставщиком"); + + Результат = РезультатТеста(Прогон, "НаборСПадающимПоставщиком", "ПадениеЗакрытия"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит("Закрытие не смогло"); + + // Вывод узла не теряется + Ожидаем.Что(СтрНайти(Результат.Вывод(), "Вывод теста ПадениеЗакрытия"), Результат.Вывод()).Больше(0); + +КонецПроцедуры + +&Тест +Процедура ОшибкаЗакрытияВиднаОстальнымДействиямИПредкам() Экспорт + + Прогон = ПрогнатьНабор("НаборСПадениемЗакрытия"); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСПадениемЗакрытия"); + Тест = ПрогоныТестов.НайтиТест(Набор, "Тест"); + Результат = Прогон.Статистика.Результат(Тест); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.Причины().Количество()).Равно(1); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит("Закрытие не смогло"); + + // Закрытие П падает первым. Следующее действие уже видит падение, хотя + // сам метод теста выполнился успешно + ИндексЗаписи("Закрыт Тест: Тест.Наблюдатель Успех падения=Да"); + + // Набор сам успешен, но закрывается с падением в поддереве. Значение конструктора + // одиночки создано первым и закрывается последним + Ожидаем.Что(Прогон.Статистика.Результат(Набор).Состояние()).Равно(СостоянияВыполненияТестов.Успех); + Ожидаем.Что(ИндексЗаписи("Закрыт НаборСПадениемЗакрытия: ПриСозданииОбъекта.Значение Успех падения=Да")) + .Больше(ИндексЗаписи("Закрыт НаборСПадениемЗакрытия: ПередВсеми.П Успех падения=Да")); + + Ожидаем.Что(Тест.Контекст().ЕстьПадения()).ЭтоИстина(); + Ожидаем.Что(Набор.Контекст().ЕстьПадения()).ЭтоИстина(); + Ожидаем.Что(Прогон.План.Контекст().ЕстьПадения()).ЭтоИстина(); + +КонецПроцедуры + +&Тест +Процедура КонтекстуПрогонаДействиеЗакрытияНеДобавить() Экспорт + + // У прогона нет результата, в который попали бы вывод и исключения закрытия + План = ПоделкаНабора("НаборСПоставщикамиПараметров").НайтиЖелудь("ТестПлан"); + + Параметры = Новый Массив; + Параметры.Добавить(Новый Действие(ЭтотОбъект, "ДействиеЗакрытия")); + + Ожидаем.Что(План.Контекст()) + .Метод("ПриЗакрытии", Параметры) + .ВыбрасываетИсключение("У контекста прогона нет действий закрытия"); + +КонецПроцедуры + +&Тест +Процедура СозданноеДляУсловийКонтейнераПринадлежитНабору() Экспорт + + Прогон = ПрогнатьНабор("НаборСКонтейнеромИПоставщиком"); + + // Экземпляр самого набора и экземпляр для условия контейнера: оба принадлежат набору + Ожидаем.Что(КоличествоЗаписей("Поставщик ПриСозданииОбъекта.Значение[0] для НаборСКонтейнеромИПоставщиком")) + .Равно(2); + Ожидаем.Что(КоличествоЗаписей("Закрыт НаборСКонтейнеромИПоставщиком: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Равно(2); + Ожидаем.Что(КоличествоЗаписейНачинающихсяС("Поставщик ПриСозданииОбъекта.Значение[0] для Шаблон")).Равно(0); + Ожидаем.Что(КоличествоЗаписейНачинающихсяС("Закрыт Шаблон:")).Равно(0); + + // Результат контейнера известен до итераций: закрытие после них его бы не учло + Контейнер = ПрогоныТестов.НайтиТест( + ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСКонтейнеромИПоставщиком"), + "Шаблон" + ); + + Параметры = Новый Массив; + Параметры.Добавить(Новый Действие(ЭтотОбъект, "ДействиеЗакрытия")); + + Ожидаем.Что(Контейнер.Контекст()) + .Метод("ПриЗакрытии", Параметры) + .ВыбрасываетИсключение("У контекста контейнера нет действий закрытия"); + +КонецПроцедуры + +// Контекст закрывается и у потомка, до которого исполнение не дошло: подписчик +// заранее добавил действие в контекст теста, а набор выключен или упал в ПередВсеми +&ПараметризованныйТест +&ИсточникЗначение("НаборВыключенныйСЗакрытиемТеста") +&ИсточникЗначение("НаборСПадающимПередВсемиИЗакрытиемТеста") +Процедура КонтекстНеисполненногоТестаЗакрываетсяСНабором(ИмяНабора) Экспорт + + ЖурналВыполнения.Очистить(); + + Поделка = ПоделкаНабора(ИмяНабора); + + // Подписку добавляет напильник при создании желудя + Поделка.НайтиЖелудь("ПодписчикЗакрытийЗаранее"); + Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + Ожидаем.Что(КоличествоЗаписей("Закрыт заранее Тест")).Равно(1); + +КонецПроцедуры + +// Подписчик падает посреди набора - на его тесте +&Тест +Процедура ИсключениеПодписчикаЗакрываетОткрытыеКонтексты() Экспорт + + ЖурналВыполнения.Очистить(); + + Поделка = ПоделкаНабора("НаборСПадающимПодписчиком"); + + // Подписку добавляет напильник при создании желудя + Поделка.НайтиЖелудь("ПадающийПодписчикСобытий"); + + Ошибка = Неопределено; + + Попытка + Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + Исключение + Ошибка = ИнформацияОбОшибке(); + КонецПопытки; + + // Исключение подписчика прерывает прогон и выходит из него + Ожидаем.Что(Ошибка, "Прогон прерван исключением подписчика").Не_().ЭтоНеопределено(); + Ожидаем.Что(Ошибка.Описание).Содержит("Подписчик не смог"); + + // Набор, который оно прервало, закрыт без результата + ИндексЗаписи("Закрыт НаборСПадающимПодписчиком: ПриСозданииОбъекта.Значение - падения=Нет"); + +КонецПроцедуры + +// Ошибка закрытия не заменяет отказ прогона и сохраняет свою цепочку причин в его выводе +&Тест +Процедура ОтказПрогонаСохраняетПричинуОшибкиЗакрытия() Экспорт + + Поделка = ПоделкаНабора("НаборСПадающимПодписчикомИЗакрытием"); + + Поделка.НайтиЖелудь("ПадающийПодписчикСобытий"); + + Ошибка = Неопределено; + + Попытка + Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + Исключение + Ошибка = ИнформацияОбОшибке(); + КонецПопытки; + + Ожидаем.Что(Ошибка, "Прогон прерван исключением подписчика").Не_().ЭтоНеопределено(); + Ожидаем.Что(Ошибка.Описание).Содержит("Подписчик не смог"); + + ЦепочкиПричин.ПроверитьВывод(Ошибка, "Закрытие не смогло"); + ЦепочкиПричин.ПроверитьВывод(Ошибка, "Корневая причина закрытия"); + ЦепочкиПричин.ПроверитьВывод(Ошибка, "Вывод перед ошибкой закрытия"); + ЦепочкиПричин.ПроверитьВывод(Ошибка, "Вывод закрытия ПриСозданииОбъекта.Контекст"); + +КонецПроцедуры + +#КонецОбласти + +#Область Отказы + +&Тест +Процедура ИсключениеПоставщикаЛомаетТестДоВызоваМетода() Экспорт + + Прогон = ПрогнатьНабор("НаборСПадающимПоставщиком"); + + Результат = РезультатТеста(Прогон, "НаборСПадающимПоставщиком", "ПадениеПоставщика"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся разрешить параметр П метода ПадениеПоставщика", + "Поставщик не смог" + )); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("ПадениеПоставщика выполнен")).ЭтоНеопределено(); + Ожидаем.Что(СтрНайти(Результат.Вывод(), "Вывод поставщика ПадениеПоставщика.П"), Результат.Вывод()).Больше(0); + +КонецПроцедуры + +// autumn глотает исключение конструктора поставщика и возвращает Неопределено: +// причина отказа - его лог, а не обращение к Неопределено +&Тест +Процедура ПадениеКонструктораПоставщикаЛомаетТестСВернойПричиной() Экспорт + + Прогон = ПрогнатьНабор("НаборССозданиемПоставщиков"); + + Результат = РезультатТеста(Прогон, "НаборССозданиемПоставщиков", "ПадающийКонструкторПоставщика"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся разрешить параметр П метода ПадающийКонструкторПоставщика", + "Конструктор поставщика не смог" + )); + + Ожидаем.Что(Результат.Причины().Получить(0).Причина.Описание) + .Равно("Не удалось создать поставщик ПоставщикСПадающимКонструктором"); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("ПадающийКонструкторПоставщика выполнен")).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура ВыводКонструктораПоставщикаВходитВВыводУзла() Экспорт + + Прогон = ПрогнатьНабор("НаборССозданиемПоставщиков"); + + Результат = РезультатТеста(Прогон, "НаборССозданиемПоставщиков", "ВыводКонструктораПоставщика"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Успех); + Ожидаем.Что(Результат.Вывод()).Содержит("Вывод конструктора поставщика"); + +КонецПроцедуры + +&Тест +Процедура ИсключениеПоставщикаКонструктораЛомаетНабор() Экспорт + + Прогон = ПрогнатьНабор("НаборСПадающимПоставщикомКонструктора"); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСПадающимПоставщикомКонструктора"); + Результат = Прогон.Статистика.Результат(Набор); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся инстанцировать тестовый набор", + "Не удаётся разрешить параметр П метода ПриСозданииОбъекта", + "Поставщик не смог" + )); + +КонецПроцедуры + +&Тест +Процедура БезПодписчикаЗаполненияТестЛомаетсяДоВызова() Экспорт + + ЖурналВыполнения.Очистить(); + + Поделка = ПоделкаНабора("НаборСПадающимПоставщиком"); + ОтписатьРазрешениеЗначений(Поделка); + + План = Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + Результат = Поделка.НайтиЖелудь("РепортерСтатистика").Результат(ПрогоныТестов.НайтиТест( + ПрогоныТестов.НайтиНабор(План, "НаборСПадающимПоставщиком"), + "ПадениеПоставщика" + )); + + // Незаполненный аргумент приводит к ошибке до вызова тестового метода + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Значение параметра П метода ПадениеПоставщика не установлено" + )); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("ПадениеПоставщика выполнен")).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура БезПодписчикаЗаполненияНаборНеСоздается() Экспорт + + Поделка = ПоделкаНабора("НаборСПадающимПоставщикомКонструктора"); + ОтписатьРазрешениеЗначений(Поделка); + + План = Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + Результат = Поделка.НайтиЖелудь("РепортерСтатистика").Результат( + ПрогоныТестов.НайтиНабор(План, "НаборСПадающимПоставщикомКонструктора") + ); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся инстанцировать тестовый набор", + "Значение параметра П метода ПриСозданииОбъекта не установлено" + )); + +КонецПроцедуры + +&Тест +Процедура ЗначениеПараметраНеЗадаетсяДважды() Экспорт + + ЖурналВыполнения.Очистить(); + + Поделка = ПоделкаНабора("НаборДляДублирующегоПодписчика"); + Поделка.НайтиЖелудь("ДублирующийПодписчикАргументов"); + + План = Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + Результат = Поделка.НайтиЖелудь("РепортерСтатистика").Результат(ПрогоныТестов.НайтиТест( + ПрогоныТестов.НайтиНабор(План, "НаборДляДублирующегоПодписчика"), + "Тест" + )); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Значение параметра П метода Тест уже получено" + )); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("Тест выполнен")).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура ПозиционномуПараметруЗначениеПоставщикаНеЗадать() Экспорт + + План = ПоделкаНабора("НаборСПоставщикамиПараметров").НайтиЖелудь("МенеджерТестирования").Обнаружить(); + + Аргументы = ПрогоныТестов.НайтиНабор(План, "НаборСПоставщикамиПараметров") + .Сигнатура("Параметризованный").СоздатьАргументы(Списки.ИзЭлементов(1, 2)); + + Параметры = Новый Массив; + Параметры.Добавить(0); + Параметры.Добавить("Значение поставщика"); + + Ожидаем.Что(Аргументы).Метод("Установить", Параметры).ВыбрасываетИсключение( + "Параметр А метода Параметризованный недоступен для заполнения" + ); + +КонецПроцедуры + +&Тест +Процедура НеверноеОбъявлениеПараметраЛомаетТолькоСвойТест() Экспорт + + Прогон = ПрогнатьНабор("НаборСНевернымиПоставщиками"); + + Ожидаем.Что(Прогон.План.ЕстьОшибкиОбнаружения()).ЭтоИстина(); + + Результат = РезультатТеста(Прогон, "НаборСНевернымиПоставщиками", "ДваПоставщика"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит( + "У параметра П метода ДваПоставщика несколько поставщиков: ПоставщикЗначенийТестов, ПоставщикЗначенийТестов" + ); + + Результат = РезультатТеста(Прогон, "НаборСНевернымиПоставщиками", "НезарегистрированныйПоставщик"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит( + "Не найден поставщик ПоставщикКоторогоНет у параметра П метода НезарегистрированныйПоставщик: желудь не зарегистрирован" + ); + + // Источник не заполняет параметр, значение которого дает поставщик + Результат = РезультатТеста(Прогон, "НаборСНевернымиПоставщиками", "ИмяСПоставщиком"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит( + "значение параметра П дает поставщик значения" + ); + + Результат = РезультатТеста(Прогон, "НаборСНевернымиПоставщиками", "ВерныйТест"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Успех); + +КонецПроцедуры + +// autumn бросает исключение, когда прозвище поставщика неоднозначно: оно ломает +// только свой тест, а не обнаружение плана +&Тест +Процедура НеоднозначныйПоставщикЛомаетТолькоСвойТест() Экспорт + + Прогон = ПрогнатьНабор("НаборСНеоднозначнымПоставщиком"); + + Результат = РезультатТеста(Прогон, "НаборСНеоднозначнымПоставщиком", "Неоднозначный"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся найти поставщик НеоднозначныйПоставщик у параметра Значение метода Неоднозначный", + "Найдено несколько желудей" + )); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("Неоднозначный выполнен")).ЭтоНеопределено(); + ИндексЗаписи("Зеленый выполнен"); + +КонецПроцедуры + +&Тест +Процедура НеверноеОбъявлениеПараметраМетодаЖизненногоЦиклаЛомаетНабор() Экспорт + + Прогон = ПрогнатьНабор("НаборСНевернымПоставщикомПередВсеми"); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСНевернымПоставщикомПередВсеми"); + Результат = Прогон.Статистика.Результат(Набор); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит( + "Не найден поставщик ПоставщикКоторогоНет у параметра П метода ПередВсеми: желудь не зарегистрирован" + ); + +КонецПроцедуры + +#КонецОбласти + +#Область ВладельцыЭкземпляров + +&Тест +Процедура ОдиночкаПолучаетЗначениеКонструктораОднаждыВКонтекстеНабора() Экспорт + + ПрогнатьНабор("НаборОдиночкаСПоставщиком"); + + Ожидаем.Что(КоличествоЗаписей("Поставщик ПриСозданииОбъекта.Значение[0] для НаборОдиночкаСПоставщиком")).Равно(1); + Ожидаем.Что(КоличествоЗаписей("Конструктор одиночки Одиночка")).Равно(1); + + // Созданное для одиночки живет, пока не закончится ее набор + Ожидаем.Что(ИндексЗаписи("Закрыт НаборОдиночкаСПоставщиком: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Больше(ИндексЗаписи("Второй")); + +КонецПроцедуры + +&Тест +Процедура ОдиночкаСоздаетсяЗановоВКаждомПрогоне() Экспорт + + Прогон = ПрогнатьНабор("НаборОдиночкаСПоставщиком"); + + ЖурналВыполнения.Записать("Повторный прогон"); + Прогон.Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + // Первый прогон закрыл созданное для своей одиночки + Ожидаем.Что(ИндексЗаписи("Закрыт НаборОдиночкаСПоставщиком: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Меньше(ИндексЗаписи("Повторный прогон")); + + // Второй прогон не получает закрытое: одиночка создается заново со своим значением + Ожидаем.Что(КоличествоЗаписей("Поставщик ПриСозданииОбъекта.Значение[0] для НаборОдиночкаСПоставщиком")).Равно(2); + Ожидаем.Что(КоличествоЗаписей("Конструктор одиночки Одиночка")).Равно(2); + Ожидаем.Что(КоличествоЗаписей("Закрыт НаборОдиночкаСПоставщиком: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Равно(2); + +КонецПроцедуры + +&Тест +Процедура ОбнаружениеИПрогонСоздаютСвоиОдиночки() Экспорт + + ЖурналВыполнения.Очистить(); + + Менеджер = ПоделкаНабора("НаборОдиночкаСПоставщикомИВыражением").НайтиЖелудь("МенеджерТестирования"); + + Менеджер.Обнаружить(); + ЖурналВыполнения.Записать("Прогон после обнаружения"); + Менеджер.Тестировать(); + + Граница = ИндексЗаписи("Прогон после обнаружения"); + + // Обнаружение вычисляет выражение источника на одиночке без значений поставщиков + // и не запоминает ее: и в Обнаружить, и в обнаружении Тестировать + Ожидаем.Что(ИндексЗаписи("Конструктор одиночки Неопределено")).Меньше(Граница); + Ожидаем.Что(КоличествоЗаписей("Конструктор одиночки Неопределено")).Равно(2); + + // Одиночку прогона, со значениями, создает исполнение - одну на обе итерации + Ожидаем.Что(ИндексЗаписи("Конструктор одиночки Выражение")).Больше(Граница); + Ожидаем.Что(КоличествоЗаписей("Конструктор одиночки Выражение")).Равно(1); + Ожидаем.Что(КоличествоЗаписей("Поставщик ПриСозданииОбъекта.Значение[0] для НаборОдиночкаСПоставщикомИВыражением")) + .Равно(1); + Ожидаем.Что(КоличествоЗаписей("Закрыт НаборОдиночкаСПоставщикомИВыражением: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Равно(1); + +КонецПроцедуры + +&Тест +Процедура ПриОбнаруженииПоставщиковНеСпрашивают() Экспорт + + Прогон = ПрогнатьНабор("НаборСПоставщикомИВыражением"); + + // Экземпляр для выражения источника создан при обнаружении без значений + // поставщиков: их получают только экземпляры исполнения - набора и итерации + Ожидаем.Что(КоличествоЗаписей("Конструктор получил Неопределено")).Равно(1); + Ожидаем.Что(ИндексЗаписи("Конструктор получил Неопределено")) + .Меньше(ИндексЗаписи("Конструктор получил Выражение")); + + Ожидаем.Что(КоличествоЗаписей("Поставщик ПриСозданииОбъекта.Значение[0] для НаборСПоставщикомИВыражением")) + .Равно(1); + Ожидаем.Что(КоличествоЗаписей("Закрыт НаборСПоставщикомИВыражением: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Равно(1); + Ожидаем.Что(ИндексЗаписи("Закрыт НаборСПоставщикомИВыражением: ПриСозданииОбъекта.Значение Успех падения=Нет")) + .Больше(ИндексЗаписи("Закрыт [1]: ПриСозданииОбъекта.Значение Успех падения=Нет")); + + // Итерацию выражение дало + Шаблон = ПрогоныТестов.НайтиТест(ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСПоставщикомИВыражением"), "Тест"); + Ожидаем.Что(Шаблон.Дети().Количество()).Равно(1); + +КонецПроцедуры + +&Тест +Процедура ИзолированныйНаборПолучаетЗначенияВСвоейСреде() Экспорт + + Прогон = ПрогнатьНабор("ИзолированныйНаборСПоставщиком"); + + Результат = РезультатТеста(Прогон, "ИзолированныйНаборСПоставщиком", "Тест"); + + Ожидаем.Что(Результат.Состояние(), Результат.ОписанияПричин()).Равно(СостоянияВыполненияТестов.Успех); + +КонецПроцедуры + +&Тест +Процедура ПроцессноИзолированныйНаборПолучаетЗначенияВСвоейСреде() Экспорт + + Прогон = ПрогнатьНабор("ИзолированныйПроцессныйНаборСПоставщиком"); + + Результат = РезультатТеста(Прогон, "ИзолированныйПроцессныйНаборСПоставщиком", "Тест"); + + Ожидаем.Что(Результат.Состояние(), Результат.ОписанияПричин()).Равно(СостоянияВыполненияТестов.Успех); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("ИзолированныйНаборОдиночкаСЗакрытием") +&ИсточникЗначение("ИзолированныйПроцессныйНаборОдиночкаСЗакрытием") +Процедура ЗакрытиеИзолированнойОдиночкиВРезультатеНабора(ИмяНабора) Экспорт + + Прогон = ПрогнатьНабор(ИмяНабора); + + Результат = Прогон.Статистика.Результат(ПрогоныТестов.НайтиНабор(Прогон.План, ИмяНабора)); + + // Значения конструктора одиночки закрываются с набором в его среде: исключение + // закрытия ломает набор, а вывод закрытия остается в его выводе + Ожидаем.Что(Результат.Состояние(), Результат.ОписанияПричин()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит("Закрытие не смогло"); + Ожидаем.Что(Результат.Вывод()).Содержит("Вывод закрытия ПриСозданииОбъекта.Наблюдатель"); + +КонецПроцедуры + +// Регистрацию поставщика изолированного набора проверяет его среда: при чистом +// обнаружении ошибка обнаружения набора приходит из среды составом плана. У набора +// уровня "Поделка" лямбда совета обращается к методу набора - экземпляр для нее +// создан в родителе без значений поставщиков +&ПараметризованныйТест +&ИсточникЗначение("ИзолированныйНаборСНезарегистрированнымПоставщикомИСоветомНаЭкземпляре") +&ИсточникЗначение("ИзолированныйПроцессныйНаборСНезарегистрированнымПоставщиком") +Процедура ОшибкаОбнаруженияВСредеДоходитДоРодителя(ИмяНабора) Экспорт + + План = ПоделкаНабора(ИмяНабора).НайтиЖелудь("МенеджерТестирования").Обнаружить(); + Набор = ПрогоныТестов.НайтиНабор(План, ИмяНабора); + + Ожидаем.Что(План.ЕстьОшибкиОбнаружения()).ЭтоИстина(); + Ожидаем.Что(Набор.ОшибкиОбнаружения()).ИмеетДлину(1); + Ожидаем.Что(Набор.ОшибкиОбнаружения().Получить(0).Описание).Равно( + "Не найден поставщик ПоставщикКоторогоНет у параметра Значение метода ПриСозданииОбъекта: " + + "желудь не зарегистрирован" + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("ИзолированныйНаборДляПодписчика", 1) +&ИсточникЗначение("ИзолированныйПроцессныйНаборДляПодписчика", 1) +&ИсточникЗначение("НаборСИзолированнымиШаблонамиДляПодписчика", 2) +Процедура КонтекстыЗеркалЗакрываютсяДоПубликацииКонца(ИмяНабора, КоличествоЗеркал) Экспорт + + ЖурналВыполнения.Очистить(); + + Поделка = ПоделкаНабора(ИмяНабора); + + // Подписчик родителя добавляет действие закрытия в контекст каждого теста, + // и зеркала - тоже: конец зеркала публикует не диспетчер + Поделка.НайтиЖелудь("ПодписчикЗакрытияЗеркал"); + Поделка.НайтиЖелудь("МенеджерТестирования").Тестировать(); + + Ожидаем.Что( + КоличествоЗаписейНачинающихсяС("Подписчик закрыл "), + СтрСоединить(ЖурналВыполнения.Записи, Символы.ПС) + ).Равно(КоличествоЗеркал); + + // Действие закрытия видит результат зеркала + Для Каждого Запись Из ЖурналВыполнения.Записи Цикл + Если СтрНачинаетсяС(Запись, "Подписчик закрыл ") Тогда + Ожидаем.Что(СтрЗаканчиваетсяНа(Запись, " Успех"), Запись).ЭтоИстина(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("ИзолированныйНаборСНезарегистрированнымПоставщикомИСоветомНаЭкземпляре") +&ИсточникЗначение("ИзолированныйПроцессныйНаборСНезарегистрированнымПоставщиком") +Процедура НезарегистрированныйПоставщикЛомаетИзолированныйНаборВЕгоСреде(ИмяНабора) Экспорт + + Прогон = ПрогнатьНабор(ИмяНабора); + + Результат = Прогон.Статистика.Результат(ПрогоныТестов.НайтиНабор(Прогон.План, ИмяНабора)); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(СтрСоединить(Результат.ОписанияПричин().ВМассив(), Символы.ПС)).Содержит( + "Не найден поставщик ПоставщикКоторогоНет у параметра Значение метода ПриСозданииОбъекта: " + + "желудь не зарегистрирован" + ); + +КонецПроцедуры + +// Условия изолированного теста родитель проверяет до подъема среды, но экземпляр +// набора с поставщиками в конструкторе для этого не создает: значение поставщика +// в родителе другое, и условие, решенное по нему, ложно выключило бы тест +&Тест +Процедура УсловиеИзолированногоТестаНаЗначенииПоставщикаРешаетСреда() Экспорт + + Прогон = ПрогнатьНабор("НаборСИзолированнымиТестамиИУсловиемНаПоставщике"); + + Для Каждого ИмяТеста Из СтрРазделить("ПоделочныйТест,ПроцессныйТест", ",") Цикл + + Результат = РезультатТеста(Прогон, "НаборСИзолированнымиТестамиИУсловиемНаПоставщике", ИмяТеста); + + Ожидаем.Что( + Результат.Состояние(), + ИмяТеста + ": " + СтрСоединить(Результат.ОписанияПричин().ВМассив(), Символы.ПС) + ).Равно(СостоянияВыполненияТестов.Успех); + + КонецЦикла; + +КонецПроцедуры + +// Изолированный тест с неверным объявлением исполняется в родителе ради своих +// условий, но поставщиков и тогда не спрашивают: условие по значению поставщика +// родителя скрыло бы ошибку объявления +&Тест +Процедура УсловиеНеобнаруженногоИзолированногоТестаНеСкрываетОшибку() Экспорт + + Прогон = ПрогнатьНабор("НаборСИзолированнымиТестамиИУсловиемНаПоставщике"); + + Для Каждого ИмяТеста Из СтрРазделить("ПоделочныйТестСНевернымОбъявлением,ПроцессныйТестСНевернымОбъявлением", ",") Цикл + + Результат = РезультатТеста(Прогон, "НаборСИзолированнымиТестамиИУсловиемНаПоставщике", ИмяТеста); + + Ожидаем.Что(Результат.Состояние(), ИмяТеста).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Содержит( + СтрШаблон("У параметра П метода %1 несколько поставщиков", ИмяТеста) + ); + + КонецЦикла; + +КонецПроцедуры + +// Поставщика включает совет изоляции: он есть только в среде узла, и родитель +// не отвергает изолированный узел, проверяя регистрацию у себя +&ПараметризованныйТест +&ИсточникЗначение("ИзолированныйНаборСПоставщикомИзСовета") +&ИсточникЗначение("ИзолированныйПроцессныйНаборСПоставщикомИзСовета") +&ИсточникЗначение("НаборСИзолированнымиТестамиСПоставщикомИзСовета") +Процедура ПоставщикИзСоветаИзоляцииДаетЗначенияВСредеУзла(ИмяНабора) Экспорт + + Прогон = ПрогнатьНабор(ИмяНабора); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, ИмяНабора); + + РезультатНабора = Прогон.Статистика.Результат(Набор); + + Ожидаем.Что( + РезультатНабора.Состояние(), + СтрСоединить(РезультатНабора.ОписанияПричин().ВМассив(), Символы.ПС) + ).Равно(СостоянияВыполненияТестов.Успех); + + Ожидаем.Что(Набор.Дети().Количество()).Больше(0); + + Для Каждого Тест Из Набор.Дети() Цикл + + Результат = Прогон.Статистика.Результат(Тест); + + Ожидаем.Что( + Результат.Состояние(), + Тест.Имя() + ": " + СтрСоединить(Результат.ОписанияПричин().ВМассив(), Символы.ПС) + ).Равно(СостоянияВыполненияТестов.Успех); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ЗначенияПолей + +&Тест +Процедура ПолеЗаполняетсяПослеУсловийПередМетодамиУзла() Экспорт + + Прогон = ПрогнатьНабор("НаборСПолемОтПоставщика"); + + Статистика = Прогон.Статистика.СтатистикаТестПлана(); + + Ожидаем.Что(Статистика.ПолучитьИлиУмолчание("ТестовОбнаружено", 0)).Равно(2); + Ожидаем.Что(Статистика.ПолучитьИлиУмолчание("ТестовУспешно", 0)).Равно(2); + + // Конструктор отрабатывает раньше, чем заполняется поле + ИндексЗаписи("Конструктор без поля"); + + // Набор - в своем контексте, перед ПередВсеми + ИндексЗаписи("ПередВсеми 1"); + ИндексЗаписи("Поставщик Поле.Номер для НаборСПолемОтПоставщика"); + + // Тест - в своем контексте, перед ПередКаждым: поле спросили раньше параметра + ИндексЗаписи("Поставщик Поле.Номер для Тест"); + ИндексЗаписи("ПередКаждым 1 2"); + ИндексЗаписи("Тест 1"); + ИндексЗаписи("Шаблон 1"); + + // Набор, тест и итерация шаблона; экземпляру обнаружения и экземпляру условия + // контейнера поле не заполняется + Ожидаем.Что(КоличествоЗаписейНачинающихсяС("Поставщик Поле.Номер для ")).Равно(3); + // Экземпляр обнаружения принадлежит набору, но поле заполняется только перед ПередВсеми + Ожидаем.Что(КоличествоЗаписей("Поставщик Поле.Номер для НаборСПолемОтПоставщика")).Равно(1); + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("Поставщик Поле.Номер для Шаблон")).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура ПолеОдиночкиЗаполняетсяЗановоДляКаждогоТеста() Экспорт + + ПрогнатьНабор("НаборОдиночкаСПолемОтПоставщика"); + + // Хранилище у каждого теста свое - счетчик в каждом с единицы + ИндексЗаписи("Первый 1"); + ИндексЗаписи("Второй 1"); + + ИндексЗаписи("Закрыт Первый: Поле.Номер Успех падения=Нет"); + ИндексЗаписи("Закрыт Второй: Поле.Номер Успех падения=Нет"); + + // Методов у экземпляра набора нет: для набора поле не заполняется + Ожидаем.Что(КоличествоЗаписейНачинающихсяС("Поставщик Поле.Номер для ")).Равно(2); + +КонецПроцедуры + +&Тест +Процедура ИсключениеПоставщикаПоляЛомаетТестДоЕгоМетодов() Экспорт + + Прогон = ПрогнатьНабор("НаборСПадающимПоставщикомПоля"); + + Результат = РезультатТеста(Прогон, "НаборСПадающимПоставщикомПоля", "Тест"); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся разрешить поле Поле", + "Поставщик не смог" + )); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("ПередКаждым выполнен")).ЭтоНеопределено(); + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("Тест выполнен")).ЭтоНеопределено(); + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("ПослеКаждого выполнен")).ЭтоНеопределено(); + + Ожидаем.Что(СтрНайти(Результат.Вывод(), "Вывод поставщика Поле.Поле"), Результат.Вывод()).Больше(0); + +КонецПроцедуры + +&Тест +Процедура ИсключениеПоставщикаПоляЛомаетНаборДоПередВсеми() Экспорт + + Прогон = ПрогнатьНабор("НаборСПадающимПоставщикомПоляПередВсеми"); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСПадающимПоставщикомПоляПередВсеми"); + Результат = Прогон.Статистика.Результат(Набор); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + ЦепочкиПричин.ПроверитьЗвенья(Результат.Причины().Получить(0), Массивы.ИзЭлементов( + "Не удаётся разрешить поле Поле", + "Поставщик не смог" + )); + + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("ПередВсеми выполнен")).ЭтоНеопределено(); + Ожидаем.Что(ЖурналВыполнения.Записи.Найти("Тест выполнен")).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура НеверноеОбъявлениеПоляЛомаетНабор() Экспорт + + Прогон = ПрогнатьНабор("НаборСНевернымиПолями"); + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, "НаборСНевернымиПолями"); + Результат = Прогон.Статистика.Результат(Набор); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + + Ожидаем.Что(СтрСоединить(Результат.ОписанияПричин().ВМассив(), Символы.ПС)).Содержит( + "У поля ДваПоставщика несколько поставщиков: ПоставщикЗначенийТестов, ПоставщикЗначенийТестов" + ); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("Тест", "Тест") +&ИсточникЗначение("ПередКаждым", "Тест,ПередКаждым") +&ИсточникЗначение("ПолеПервое", "Тест,ПередКаждым,ПослеКаждого,ПолеПервое") +&ИсточникЗначение("", "Тест,ПередКаждым,ПослеКаждого,ПолеПервое,ПолеВторое") +Процедура ПроверкаРегистрацииСохраняетПорядокИНеПовторяетМетоды(ОшибкаНа, ОжидаемыеВызовы) Экспорт + + Проверка = ПроверкаРегистрацииСЖурналом(); + Проверка.ОшибкаНа = ОшибкаНа; + Проверка.Вызовы = Новый СписокМассив; + + Поделка = ПоделкаНабора("НаборДляПроверкиПорядкаРегистрации"); + Проверка.Разрешение = Поделка.НайтиЖелудь("РазрешениеЗначений"); + Обнаружитель = Поделка.НайтиЖелудь("ОбнаружительТестов"); + Рефлектор = Новый Рефлектор; + Рефлектор.УстановитьСвойство(Обнаружитель, "РазрешениеЗначений", Проверка); + + План = Обнаружитель.Обнаружить(); + Набор = ПрогоныТестов.НайтиНабор(План, "НаборДляПроверкиПорядкаРегистрации"); + Тест = ПрогоныТестов.НайтиТест(Набор, "Тест"); + Ошибки = Тест.ОшибкиОбнаружения(); + + Ожидаем.Что(СтрСоединить(Проверка.Вызовы.ВМассив(), ",")).Равно(ОжидаемыеВызовы); + Ожидаем.Что(Ошибки.Количество()).Равно(?(ПустаяСтрока(ОшибкаНа), 0, 1)); + + Если Не Ошибки.Пусто() Тогда + Ожидаем.Что(Ошибки.Получить(0).Описание).Равно(ОшибкаНа); + КонецЕсли; + +КонецПроцедуры + +// Регистрацию поставщика проверяет узел, который получает значение: поле перед +// методами теста и ПередКаждым получают значения для теста, и незарегистрированный +// поставщик ломает тест, а не набор +&ПараметризованныйТест +&ИсточникЗначение("НаборСНезарегистрированнымПоставщикомПоля", "у поля Поле") +&ИсточникЗначение("НаборСНезарегистрированнымПоставщикомПередКаждым", "у параметра П метода ПередКаждым") +Процедура НезарегистрированныйПоставщикДляТестаЛомаетТест(ИмяНабора, Где) Экспорт + + Прогон = ПрогнатьНабор(ИмяНабора); + + РезультатНабора = Прогон.Статистика.Результат(ПрогоныТестов.НайтиНабор(Прогон.План, ИмяНабора)); + Результат = РезультатТеста(Прогон, ИмяНабора, "Тест"); + + Ожидаем.Что(РезультатНабора.Состояние(), РезультатНабора.ОписанияПричин()).Равно(СостоянияВыполненияТестов.Успех); + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Равно( + СтрШаблон("Не найден поставщик ПоставщикКоторогоНет %1: желудь не зарегистрирован", Где) + ); + +КонецПроцедуры + +// Поле заполняется и перед ПередВсеми - тогда его поставщика проверяет набор +&Тест +Процедура НезарегистрированныйПоставщикПоляЛомаетНаборСПередВсеми() Экспорт + + Прогон = ПрогнатьНабор("НаборСНезарегистрированнымПоставщикомПоляИПередВсеми"); + + Результат = Прогон.Статистика.Результат(ПрогоныТестов.НайтиНабор( + Прогон.План, + "НаборСНезарегистрированнымПоставщикомПоляИПередВсеми" + )); + + Ожидаем.Что(Результат.Состояние()).Равно(СостоянияВыполненияТестов.Сломан); + Ожидаем.Что(Результат.ОписанияПричин().Получить(0)).Равно( + "Не найден поставщик ПоставщикКоторогоНет у поля Поле: желудь не зарегистрирован" + ); + +КонецПроцедуры + +#КонецОбласти + +Функция ПрогнатьНабор(Знач ИмяНабора) + + ЖурналВыполнения.Очистить(); + + Возврат ПрогоныТестов.Прогнать( + ИмяНабора, + "", + "./tests/fixtures/resolvers/" + ИмяНабора + ".os" + ); + +КонецФункции + +// Проверка поставщиков с журналом обращений и заданной ошибкой +Функция ПроверкаРегистрацииСЖурналом() + + Возврат ЗагрузитьСценарийИзСтроки( + "Перем Вызовы Экспорт; + |Перем ОшибкаНа Экспорт; + |Перем Разрешение Экспорт; + | + |Функция ПрочитатьСигнатуры(ОпределениеЖелудя) Экспорт + | Возврат Разрешение.ПрочитатьСигнатуры(ОпределениеЖелудя); + |КонецФункции + | + |Функция ОшибкаРегистрации(Сигнатура) Экспорт + | Имя = Сигнатура.Метод().Имя; + | Если Имя = ""ПриСозданииОбъекта"" Тогда + | Возврат Опциональные.Пустой(); + | КонецЕсли; + | Возврат ОшибкаЭлемента(Имя); + |КонецФункции + | + |Функция ОшибкаРегистрацииПоля(Поле) Экспорт + | Возврат ОшибкаЭлемента(Поле.Имя()); + |КонецФункции + | + |Функция ОшибкаЭлемента(Имя) + | Вызовы.Добавить(Имя); + | Если Имя = ОшибкаНа Тогда + | Возврат Новый Опциональный(Новый ИнформацияОбОшибке(Имя, Неопределено)); + | КонецЕсли; + | Возврат Опциональные.Пустой(); + |КонецФункции", + Новый Структура("Опциональные", Опциональные) + ); + +КонецФункции + +// Подстановка отказа при регистрации действия и подготовке списка к закрытию +Функция СписокДействийСОшибкой() + + Возврат ЗагрузитьСценарийИзСтроки( + "Процедура Добавить(Действие) Экспорт + | Сбой(); + |КонецПроцедуры + | + |Функция ВМассив() Экспорт + | Сбой(); + | Возврат Новый Массив; + |КонецФункции + | + |Процедура Сбой() + | Попытка + | ВызватьИсключение ""Причина ошибки списка""; + | Исключение + | ВызватьИсключение Новый ИнформацияОбОшибке(""Ошибка списка действий"", , ИнформацияОбОшибке()); + | КонецПопытки; + |КонецПроцедуры" + ); + +КонецФункции + +Процедура ДействиеЗакрытия(Контекст) Экспорт // BSLLS:UnusedParameters-off +КонецПроцедуры + +// Снимает подписку РазрешениеЗначений на заполнение аргументов: значения +// параметров с поставщиками никто не дает +Процедура ОтписатьРазрешениеЗначений(Поделка) + + Публикатор = Поделка.НайтиЖелудь("ПубликаторСобытий"); + Разрешение = Поделка.НайтиЖелудь("РазрешениеЗначений"); + + УдалитьОбработчик Публикатор.ЗаполнениеАргументов, Разрешение.ЗаполнитьАргументы; + +КонецПроцедуры + +// Поделка с одним набором фикстур - для сценариев из нескольких вызовов менеджера +Функция ПоделкаНабора(Знач ИмяНабора) + + Детальки = Новый Соответствие; + Детальки.Вставить("OneUnit.КаталогиТестов", ""); + Детальки.Вставить("OneUnit.ФайлыТестов", "./tests/fixtures/resolvers/" + ИмяНабора + ".os"); + Детальки.Вставить("OneUnit.ТестовыеНаборыВключаемые", ИмяНабора); + + Возврат ПрогоныТестов.СоздатьПоделку(Детальки); + +КонецФункции + +Функция АргументыМетода(Знач ИмяМетода, Позиционные) + + План = ПоделкаНабора("НаборСПоставщикамиПараметров").НайтиЖелудь("МенеджерТестирования").Обнаружить(); + Набор = ПрогоныТестов.НайтиНабор(План, "НаборСПоставщикамиПараметров"); + + Возврат Набор.Сигнатура(ИмяМетода).СоздатьАргументы(Позиционные); + +КонецФункции + +Функция РезультатТеста(Прогон, Знач ИмяНабора, Знач ИмяТеста) + + Набор = ПрогоныТестов.НайтиНабор(Прогон.План, ИмяНабора); + + Возврат Прогон.Статистика.Результат(ПрогоныТестов.НайтиТест(Набор, ИмяТеста)); + +КонецФункции + +// Индекс записи в журнале; записи нет - тест падает с содержимым журнала +Функция ИндексЗаписи(Знач Запись) + + Индекс = ЖурналВыполнения.Записи.Найти(Запись); + + Ожидаем.Что(Индекс, СтрШаблон( + "Запись ""%1"" в журнале:%2%3", + Запись, + Символы.ПС, + СтрСоединить(ЖурналВыполнения.Записи, Символы.ПС) + )).Не_().ЭтоНеопределено(); + + Возврат Индекс; + +КонецФункции + +Функция КоличествоЗаписейНачинающихсяС(Знач Начало) + + Количество = 0; + + Для Каждого Элемент Из ЖурналВыполнения.Записи Цикл + Если СтрНачинаетсяС(Элемент, Начало) Тогда + Количество = Количество + 1; + КонецЕсли; + КонецЦикла; + + Возврат Количество; + +КонецФункции + +Функция КоличествоЗаписей(Знач Запись) + + Количество = 0; + + Для Каждого Элемент Из ЖурналВыполнения.Записи Цикл + Если Элемент = Запись Тогда + Количество = Количество + 1; + КонецЕсли; + КонецЦикла; + + Возврат Количество; + +КонецФункции