diff --git a/.bsl-language-server.json b/.bsl-language-server.json index 1487d68..7a1b8e6 100644 --- a/.bsl-language-server.json +++ b/.bsl-language-server.json @@ -5,7 +5,7 @@ "listOfIncorrectFirstSymbol": ";" }, "Typo": { - "userWordsToIgnore": "Разворачиватель,Блестяшка,Блестяшек,Блестяшки,Блестяшками,Блестяшку,Блестяшкой,Инит,Структурочка,Запускатель,Осенизатор,Просканированные,Аппендера" + "userWordsToIgnore": "Разворачиватель,Блестяшка,Блестяшек,Блестяшки,Блестяшками,Блестяшку,Блестяшкой,Инит,Структурочка,Запускатель,Осенизатор,Прилеплятор,Просканированные,Аппендера" } } } diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index c1b9888..d65ed49 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -10,19 +10,7 @@ jobs: uses: autumn-library/workflows/.github/workflows/sonar.yml@coverage with: github_repository: autumn-library/autumn + codecov: true secrets: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - coverage: - runs-on: ubuntu-latest - needs: [sonar] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Download artifacts - uses: actions/download-artifact@v4 - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v4.0.1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: autumn-library/autumn - + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index 4d29ee6..ab8c727 100644 --- a/README.md +++ b/README.md @@ -759,6 +759,32 @@ JSON обычно содержит вложенные объекты и масс Метод обработки напильником возвращает желудь, причем не обязательно возвращать *тот же самый* желудь. Вам может захотеться обернуть его в объект-контейнер и накинуть на него несколько новых методов, например, с помощью [decorator](https://github.com/nixel2007/decorator). +Не каждый напильник стоит применять ко всем желудям. Вспоминая замечательный пример с панками, мы можем захотеть добавить напильник для полировки заклепок на напульсниках наших музыкантов. При этом очевидно, что далеко не все носят напульсники, да еще и с заклепками. В задаче ограничения применения напильника поможет повторяемый параметр аннотации `&Напильник` под названием `ПрименяетсяТолькоНа`. В нем можно указать имена или прозвища желудей, к которым применяется данный напильник. + +```bsl +// file: Классы/ПолировщикЗаклепок.os + +&Напильник(ПрименяетсяТолькоНа = "Панк") +Процедура ПриСозданииОбъекта() + +КонецПроцедуры +``` + +С другой стороны сам желудь может захотеть ограничить список напильников, которые могут по нему вжухнуть. Или даже вовсе отключить вжухание всех напильников. Для этого на желудь можно навесить аннотацию `&ОсобоеОбращение`, которая может принимать булев параметр `ОтключитьВсеНапильники`, повторяемый строковый параметр `ПрименятьТолькоНапильник` и опять же повторяемый строковый параметр `НеПрименятьНапильник`. Назначение первого параметра, надеемся, достаточно очевидно, поэтому вот пример работы с одним из других: + +```bsl +// file: Классы/ПозерВНапульсниках.os + +&Желудь +&ОсобоеОбращение( + ПрименятьТолькоНапильник = "ПолировщикЗаклепок" +) +Процедура ПриСозданииОбъекта() +КонецПроцедуры +``` + +Зачем все это может быть нужно? Перфоманса ради, например. В случае большого количества компанейских желудей, которые не нуждаются в обработке напильником, можно отключить работу всех напильников для них. Ведь зачем тратить время на обработку, если она не нужна? При этом можно сохранить все плюшки от внедрения зависимостей и деталек через конструктор. Удобненько. + Напильник в этой удивительной осенней вселенной тоже является желудем, поэтому может иметь зависимости от других желудей. Но тут надо аккуратно - можно окончательно упороться и улететь таки на дно циклических зависимостей. > Чтобы уберечь себя ото дна, все напильники инициализируются перед запуском приложения. Как в жизни - сначала разложил рядом инструменты, а потом начинаешь творить. diff --git "a/src/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\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272.os" "b/src/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\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272.os" index af76f38..c0e4ff9 100644 --- "a/src/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\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272.os" +++ "b/src/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\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272.os" @@ -1,5 +1,38 @@ +#Использовать asserts +#Использовать collectionos + +Перем _ПрименяетсяТолькоНа; + +Функция МожетПрименятьсяНа(ОпределениеЖелудя) Экспорт + + НапильникМожетПрименяться = Ложь; + + Если _ПрименяетсяТолькоНа.Количество() = 0 Тогда + НапильникМожетПрименяться = Истина; + Иначе + + Для Каждого Идентификатор Из ОпределениеЖелудя.Прозвища() Цикл + Если _ПрименяетсяТолькоНа.Содержит(Идентификатор) Тогда + НапильникМожетПрименяться = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Возврат НапильникМожетПрименяться; + +КонецФункции + &Аннотация("Напильник") &Прозвище("Напильник") -Процедура ПриСозданииОбъекта(Значение = "") +Процедура ПриСозданииОбъекта(Значение = "", &Повторяемый ПрименяетсяТолькоНа = Неопределено) + + _ПрименяетсяТолькоНа = Новый МножествоСоответствие(); + Для Каждого МестоПрименения Из ПрименяетсяТолькоНа Цикл + Ожидаем.Что(МестоПрименения, "Ограничение применения напильника должно быть задано строкой").ИмеетТип("Строка"); + + _ПрименяетсяТолькоНа.Добавить(МестоПрименения); + КонецЦикла; КонецПроцедуры diff --git "a/src/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\236\321\201\320\276\320\261\320\276\320\265\320\236\320\261\321\200\320\260\321\211\320\265\320\275\320\270\320\265.os" "b/src/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\236\321\201\320\276\320\261\320\276\320\265\320\236\320\261\321\200\320\260\321\211\320\265\320\275\320\270\320\265.os" new file mode 100644 index 0000000..af09401 --- /dev/null +++ "b/src/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\236\321\201\320\276\320\261\320\276\320\265\320\236\320\261\321\200\320\260\321\211\320\265\320\275\320\270\320\265.os" @@ -0,0 +1,54 @@ +#Использовать asserts + +Перем _ОтключитьВсеНапильники; +Перем _ПрименятьТолькоНапильники; +Перем _НеПрименятьНапильники; + +Функция НапильникМожетПрименяться(ИмяНапильника) Экспорт + + Если _ОтключитьВсеНапильники Тогда + Возврат Ложь; + КонецЕсли; + + Если _ПрименятьТолькоНапильники.Количество() > 0 Тогда + Возврат _ПрименятьТолькоНапильники.Найти(ИмяНапильника) <> Неопределено; + Иначе + Возврат _НеПрименятьНапильники.Найти(ИмяНапильника) = Неопределено; + КонецЕсли; + +КонецФункции + +&Аннотация("ОсобоеОбращение") +Процедура ПриСозданииОбъекта( + ОтключитьВсеНапильники = Ложь, + &Повторяемый ПрименятьТолькоНапильник = Неопределено, + &Повторяемый НеПрименятьНапильник = Неопределено +) + + Для Каждого МестоПрименения Из ПрименятьТолькоНапильник Цикл + Ожидаем.Что(МестоПрименения, "Ограничение ""только"" применения напильника должно быть задано строкой") + .ИмеетТип("Строка"); + КонецЦикла; + + Для Каждого МестоПрименения Из НеПрименятьНапильник Цикл + Ожидаем.Что(МестоПрименения, "Ограничение ""не"" применения напильника должно быть задано строкой") + .ИмеетТип("Строка"); + КонецЦикла; + + Если ОтключитьВсеНапильники И ПрименятьТолькоНапильник.Количество() > 0 Тогда + ВызватьИсключение "Нельзя одновременно отключать все напильники и задавать ограничения ""только"""; + КонецЕсли; + + Если ОтключитьВсеНапильники И НеПрименятьНапильник.Количество() > 0 Тогда + ВызватьИсключение "Нельзя одновременно отключать все напильники и задавать ограничения ""не"""; + КонецЕсли; + + Если ПрименятьТолькоНапильник.Количество() > 0 И НеПрименятьНапильник.Количество() > 0 Тогда + ВызватьИсключение "Нельзя одновременно задавать ограничения ""только"" и ""не"""; + КонецЕсли; + + _ОтключитьВсеНапильники = ОтключитьВсеНапильники; + _ПрименятьТолькоНапильники = ПрименятьТолькоНапильник; + _НеПрименятьНапильники = НеПрименятьНапильник; + +КонецПроцедуры diff --git "a/src/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\226\320\265\320\273\321\203\320\264\320\265\320\271.os" "b/src/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\226\320\265\320\273\321\203\320\264\320\265\320\271.os" index fe4c871..ca519f7 100644 --- "a/src/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\226\320\265\320\273\321\203\320\264\320\265\320\271.os" +++ "b/src/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\226\320\265\320\273\321\203\320\264\320\265\320\271.os" @@ -12,7 +12,7 @@ // ПрилепляторЧастиц - объект, который умеет прилеплять частицы к желудям. Перем ПрилепляторЧастиц; -// Соответствие, в котором хранятся все определения желудей. +// Соответствие, в котором хранятся все определения желудей: // * Ключ - Строка - имя желудя. // * Значение - ОпределениеЖелудя - определение желудя. Перем ОпределенияЖелудейПоИмени; @@ -25,14 +25,23 @@ // Массив из ОпределениеЖелудя - Список определений желудей, являющихся напильниками. Перем ОпределенияНапильников; -// Соответствие, в котором хранятся все определения желудей, являющихся напильниками. +// Соответствие, в котором хранятся все определения желудей, являющихся напильниками. // * Ключ - Строка - имя желудя. -// * Значение - ОпределениеЖелудя - определение желудя. +// * Значение - ОпределениеЖелудя - определение напильника. Перем ОпределенияНапильниковПоИмени; +// Соответствие - Соответствие, в котором хранится список применяемых к конкретному +// желудю напильников. +// * Ключ - Строка - имя желудя. +// * Значение - ОпределениеЖелудя - определение напильника. +Перем КэшПрименяемыхНапильников; + // Массив из ОпределениеЖелудя - Список инициализируемых в данный момент напильников. Перем ИнициализируемыеНапильники; +// Лог - Логгер ФабрикиЖелудей. +Перем Лог; + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -106,12 +115,13 @@ Функция ДобавитьДуб(ТипДуба) Экспорт + ИмяКорневойАннотации = "Завязь"; ОпределениеЖелудя = ДобавитьЖителяЛеса(ТипДуба, "", "Дуб"); - МетодыЗавязи = ОпределениеЖелудя.НайтиМетодыСАннотациями("Завязь"); + МетодыЗавязи = ОпределениеЖелудя.НайтиМетодыСАннотациями(ИмяКорневойАннотации); Для Каждого МетодЗавязи Из МетодыЗавязи Цикл - ИмяЖелудя = ПрочитатьИмяЖелудя(МетодЗавязи.Аннотации, "Завязь", МетодЗавязи.Имя); + ИмяЖелудя = ПрочитатьИмяЖелудя(МетодЗавязи.Аннотации, ИмяКорневойАннотации, МетодЗавязи.Имя); ТипЖелудя = ПрочитатьТипЖелудя(МетодЗавязи, МетодЗавязи.Аннотации); ОпределениеЗавязи = СоздатьОпределениеЖелудя( @@ -119,7 +129,8 @@ ТипЖелудя, ТипДуба, МетодЗавязи, - МетодЗавязи.Аннотации + МетодЗавязи.Аннотации, + ИмяКорневойАннотации ); СохранитьОпределениеЖелудя(ОпределениеЗавязи); @@ -208,13 +219,29 @@ ИнициализируемыеНапильники.Удалить(ИндексНапильника); Иначе Если НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда - Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл + + ПрименяемыеНапильники = ОпределитьПрименяемыеНапильники(ОпределениеЖелудя); + + Для Каждого ОпределениеНапильника Из ПрименяемыеНапильники Цикл Если ОпределениеНапильника.Имя() = ОпределениеЖелудя.Имя() Тогда + ТекстСообщения = СтрШаблон( + "Напильник %1 не может быть применен сам к себе", + ОпределениеНапильника.Имя() + ); + Лог.Отладка(ТекстСообщения); + Продолжить; КонецЕсли; + Если ИнициализируемыеНапильники.Найти(ОпределениеНапильника.Имя()) <> Неопределено Тогда - // TODO: Сообщение о пропуске запуска напильника на желуде из-за циклической зависимости + ТекстСообщения = СтрШаблон( + "Напильник %1 не может быть применен к желудю %2, так как он уже инициализируется.", + ОпределениеНапильника.Имя(), + ОпределениеЖелудя.Имя() + ); + Лог.Отладка(ТекстСообщения); + Продолжить; КонецЕсли; @@ -301,7 +328,8 @@ ТипЖителяЛеса, ТипЖителяЛеса, Конструктор, - Аннотации + Аннотации, + АннотацияНадКонструктором ); СохранитьОпределениеЖелудя(ОпределениеЖелудя); @@ -313,7 +341,14 @@ КонецФункции -Функция СоздатьОпределениеЖелудя(ИмяЖелудя, ТипЖелудя, ТипВладельцаСвойств, Конструктор, Аннотации) +Функция СоздатьОпределениеЖелудя( + ИмяЖелудя, + ТипЖелудя, + ТипВладельцаСвойств, + Конструктор, + Аннотации, + ИмяКорневойАннотации +) Завязь = СоздатьЗавязь(ТипВладельцаСвойств, Конструктор); @@ -323,6 +358,7 @@ Порядок = ПрочитатьПорядок(Аннотации); Верховный = ПрочитатьПризнакВерховногоЖелудя(Аннотации); Спецификация = ПрочитатьСпецификацию(Аннотации); + КорневаяАннотация = ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации); // TODO: Унести в Приемку &Дуб // Если Спецификация = СостоянияПриложения.Инициализация() @@ -345,13 +381,16 @@ Прозвища, Порядок, Верховный, - Спецификация + Спецификация, + КорневаяАннотация ); Возврат ОпределениеЖелудя; КонецФункции +#Область СозданиеЗавязи + Функция СоздатьЗавязь(ТипВладельцаСвойств, Конструктор) Если НРег(Конструктор.Имя) = НРег("ПриСозданииОбъекта") @@ -385,6 +424,10 @@ КонецФункции +#КонецОбласти + +#Область ЧтениеПараметровЖелудя + Функция ПрочитатьИмяЖелудя(Аннотации, АннотацияНадМетодом, ЗначениеПоУмолчанию) Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, АннотацияНадМетодом); @@ -458,16 +501,12 @@ Функция ПрочитатьПрозвища(Аннотации, ЗначениеПоУмолчанию) Результат = Новый Массив; - + Результат.Добавить(ЗначениеПоУмолчанию); + Прозвища = РаботаСАннотациями.НайтиАннотации(Аннотации, "Прозвище"); - Если Прозвища.Количество() = 0 Тогда - Результат.Добавить(ЗначениеПоУмолчанию); - Возврат Результат; - КонецЕсли; - Для Каждого Аннотация Из Прозвища Цикл Прозвище = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация); - + Результат.Добавить(Прозвище); КонецЦикла; @@ -503,6 +542,19 @@ КонецФункции +Функция ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации) + + КорневаяАннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, ИмяКорневойАннотации); + ОпределениеАннотации = Поделка.ПолучитьОпределениеАннотации(КорневаяАннотация.Имя); + + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(КорневаяАннотация); + + Возврат ОбъектАннотации; + +КонецФункции + +#КонецОбласти + Процедура ДобавитьОпределениеНапильника(ОпределениеНапильника, Системный = Ложь) Порядок = ОпределениеНапильника.Порядок(); @@ -525,6 +577,7 @@ // Реинициализация сортированного списка напильников для возможности их использования в заготовках. ОпределенияНапильников = ПолучитьСписокОпределенийЖелудей("Напильник"); + КэшПрименяемыхНапильников.Очистить(); ОпределенияНапильниковПоИмени.Вставить(ОпределениеНапильника.Имя(), ОпределениеНапильника); КонецПроцедуры @@ -563,6 +616,64 @@ КонецПроцедуры +Функция ОпределитьПрименяемыеНапильники(ОпределениеЖелудя) + + ИмяЖелудя = ОпределениеЖелудя.Имя(); + + ПрименяемыеНапильники = КэшПрименяемыхНапильников.Получить(ИмяЖелудя); + Если ПрименяемыеНапильники <> Неопределено Тогда + Возврат ПрименяемыеНапильники; + КонецЕсли; + + Лог.Отладка("Кэш применяемых напильников для желудя %1 пуст. Выполняется расчет...", ИмяЖелудя); + + ПрименяемыеНапильники = Новый Массив; + + АннотацииЗавязи = ОпределениеЖелудя.Завязь().ДанныеМетода().Аннотации; + АннотацияОсобоеОбращение = РаботаСАннотациями.НайтиАннотацию(АннотацииЗавязи, "ОсобоеОбращение"); + ОпределениеАннотацииОсобоеОбращение = Поделка.ПолучитьОпределениеАннотации("ОсобоеОбращение"); + Если АннотацияОсобоеОбращение <> Неопределено Тогда + ОбъектАннотацииОсобоеОбращение = ОпределениеАннотацииОсобоеОбращение.СоздатьОбъектАннотации(АннотацияОсобоеОбращение); + КонецЕсли; + + Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл + + ИмяНапильника = ОпределениеНапильника.Имя(); + Лог.Отладка("Проверка применения напильника %1", ИмяНапильника); + + КорневаяАннотация = ОпределениеНапильника.КорневаяАннотация(); + + НапильникМожетПрименяться = КорневаяАннотация.МожетПрименятьсяНа(ОпределениеЖелудя); + + Лог.Отладка("Напильник %1 может применяться на желуде %2: %3", + ИмяНапильника, + ИмяЖелудя, + НапильникМожетПрименяться + ); + + Если НапильникМожетПрименяться И ОбъектАннотацииОсобоеОбращение <> Неопределено Тогда + НапильникМожетПрименяться = ОбъектАннотацииОсобоеОбращение.НапильникМожетПрименяться(ИмяНапильника); + + Лог.Отладка( + "Желудь %1 требует особого обращения. Напильник %2 применяется: %3", + ИмяЖелудя, + ИмяНапильника, + НапильникМожетПрименяться + ); + КонецЕсли; + + Если НапильникМожетПрименяться Тогда + ПрименяемыеНапильники.Добавить(ОпределениеНапильника); + КонецЕсли; + + КонецЦикла; + + КэшПрименяемыхНапильников.Вставить(ИмяЖелудя, ПрименяемыеНапильники); + + Возврат ПрименяемыеНапильники; + +КонецФункции + #КонецОбласти #Область Инициализация @@ -580,6 +691,9 @@ ОпределенияНапильниковПоИмени = Новый Соответствие(); ОпределенияНапильников = Новый Массив(); + КэшПрименяемыхНапильников = Новый Соответствие(); + + Лог = Логирование.ПолучитьЛог("oscript.lib.autumn.core.ФабрикаЖелудей"); КонецПроцедуры diff --git "a/src/\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\226\320\265\320\273\321\203\320\264\321\217.os" "b/src/\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\226\320\265\320\273\321\203\320\264\321\217.os" index 2a92608..1f99cb1 100644 --- "a/src/\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\226\320\265\320\273\321\203\320\264\321\217.os" +++ "b/src/\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\226\320\265\320\273\321\203\320\264\321\217.os" @@ -11,6 +11,7 @@ Перем _Верховный; Перем _Порядок; Перем _Спецификация; +Перем _КорневаяАннотация; Перем _РефлекторОбъекта; Перем _РазворачивательАннотаций; @@ -62,6 +63,10 @@ Возврат _Спецификация; КонецФункции +Функция КорневаяАннотация() Экспорт + Возврат _КорневаяАннотация; +КонецФункции + Функция Свойства() Экспорт Если Свойства = Неопределено Тогда Свойства = ?(ЭтоПримитивныйТип, Новый ТаблицаЗначений, _РефлекторОбъекта.ПолучитьТаблицуСвойств(Неопределено, Истина)); @@ -98,7 +103,8 @@ Прозвища, Порядок, Верховный, - Спецификация + Спецификация, + КорневаяАннотация ) Ожидаем.Что(РазворачивательАннотаций).ИмеетТип("РазворачивательАннотаций"); Ожидаем.Что(ТипЖелудя).ИмеетТип("Тип"); @@ -112,6 +118,7 @@ Ожидаем.Что(Порядок).ИмеетТип("Число"); Ожидаем.Что(Верховный).ИмеетТип("Булево"); Ожидаем.Что(Спецификация).ИмеетТип("Строка"); + Ожидаем.Что(КорневаяАннотация).Не_().ИмеетТип("СтрокаТаблицыЗначений"); Если Спецификация = СостоянияПриложения.Инициализация() Тогда ТекстСообщения = СтрШаблон( @@ -134,6 +141,7 @@ _Порядок = Порядок; _Верховный = Верховный; _Спецификация = Спецификация; + _КорневаяАннотация = КорневаяАннотация; _РазворачивательАннотаций = РазворачивательАннотаций; _РефлекторОбъекта = Новый РефлекторОбъекта(ТипЖелудя); diff --git "a/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" "b/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" index 53da288..e711c94 100644 --- "a/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" +++ "b/tests/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" @@ -879,3 +879,62 @@ .ВыбрасываетИсключение("Неизвестная прилепляемая коллекция Нечто"); КонецПроцедуры + +&Тест +Процедура ФильтрНапильниковПрименяетсяТолькоНаРаботает() Экспорт + + // Дано + Поделка = Новый Поделка; + Поделка.ЗапуститьПриложение(); + + НапильникПоПрозвищам = Поделка.НайтиЖелудь("НапильникПрименяющийсяТолькоНаКругляшах"); + НапильникПоИмени = Поделка.НайтиЖелудь("НапильникПрименяющийсяТолькоНаКонкретномЖелуде"); + + // Когда + Кругляши = Поделка.НайтиЖелуди("Кругляш"); + Мелкие = Поделка.НайтиЖелуди("Мелкий"); + СлучайныйЖелудьСПрозвищами = Поделка.НайтиЖелудь("МногоимённыйЖелудь"); + СлучайныйОдиночныйЖелудь = Поделка.НайтиЖелудь("КомпанейскийЖелудь"); + + // Тогда + Ожидаем.Что(НапильникПоПрозвищам.СработалоРаз).Равно(Кругляши.Количество()); + Ожидаем.Что(НапильникПоИмени.СработалоРаз).Равно(1); + +КонецПроцедуры + +&Тест +Процедура ФильтрНапильниковИзЖелудяРаботает() Экспорт + + // Дано + Поделка = Новый Поделка; + Поделка.ЗапуститьПриложение(); + + // Когда + Желудь = Поделка.НайтиЖелудь("ЖелудьИзбирательноПрименяющийНапильники"); + ЖелудьНижнегоУровня = Поделка.НайтиЖелудь("ЖелудьНижнегоУровня"); + + // Тогда + Ожидаем.Что(Желудь.ЖелудьНижнегоУровня, "Желудь должен внедриться в поле") + .Равно(ЖелудьНижнегоУровня); + Ожидаем.Что(Желудь.ВторойЖелудьНижнегоУровня, "Желудь не должен инициализироваться в методе ФинальныйШтрих") + .Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ОтключениеНапильниковНаЖелудеРаботает() Экспорт + + // Дано + Поделка = Новый Поделка; + Поделка.ЗапуститьПриложение(); + + // Когда + Желудь = Поделка.НайтиЖелудь("ЖелудьСОтключеннымиНапильниками"); + + // Тогда + Ожидаем.Что(Желудь.ЖелудьНижнегоУровня, "Желудь не должен внедриться в поле") + .Равно(Неопределено); + Ожидаем.Что(Желудь.ВторойЖелудьНижнегоУровня, "Желудь не должен инициализироваться в методе ФинальныйШтрих") + .Равно(Неопределено); + +КонецПроцедуры diff --git "a/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\226\320\265\320\273\321\203\320\264\321\214\320\230\320\267\320\261\320\270\321\200\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\226\320\265\320\273\321\203\320\264\321\214\320\230\320\267\320\261\320\270\321\200\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\270.os" new file mode 100644 index 0000000..55bf18b --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\226\320\265\320\273\321\203\320\264\321\214\320\230\320\267\320\261\320\270\321\200\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\270.os" @@ -0,0 +1,20 @@ +// BSLLS:MissingVariablesDescription-off +// BSLLS:ExportVariables-off + +&Пластилин +Перем ЖелудьНижнегоУровня Экспорт; + +Перем ВторойЖелудьНижнегоУровня Экспорт; + +&ФинальныйШтрих +Процедура Инит() Экспорт + ВторойЖелудьНижнегоУровня = ЖелудьНижнегоУровня; +КонецПроцедуры + +&Желудь +&ОсобоеОбращение( + ПрименятьТолькоНапильник = "ОбработкаНапильникомПластилинаНаПолях" +) +Процедура ПриСозданииОбъекта() + +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\226\320\265\320\273\321\203\320\264\321\214\320\241\320\236\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\213\320\274\320\270\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\260\320\274\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\226\320\265\320\273\321\203\320\264\321\214\320\241\320\236\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\213\320\274\320\270\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\260\320\274\320\270.os" new file mode 100644 index 0000000..859e499 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\226\320\265\320\273\321\203\320\264\321\214\320\241\320\236\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\213\320\274\320\270\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\260\320\274\320\270.os" @@ -0,0 +1,20 @@ +// BSLLS:MissingVariablesDescription-off +// BSLLS:ExportVariables-off + +&Пластилин +Перем ЖелудьНижнегоУровня Экспорт; + +Перем ВторойЖелудьНижнегоУровня Экспорт; + +&ФинальныйШтрих +Процедура Инит() Экспорт + ВторойЖелудьНижнегоУровня = ЖелудьНижнегоУровня; +КонецПроцедуры + +&Желудь +&ОсобоеОбращение( + ОтключитьВсеНапильники = Истина +) +Процедура ПриСозданииОбъекта() + +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\321\201\321\217\320\242\320\276\320\273\321\214\320\272\320\276\320\235\320\260\320\232\320\276\320\275\320\272\321\200\320\265\321\202\320\275\320\276\320\274\320\226\320\265\320\273\321\203\320\264\320\265.os" "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\321\201\321\217\320\242\320\276\320\273\321\214\320\272\320\276\320\235\320\260\320\232\320\276\320\275\320\272\321\200\320\265\321\202\320\275\320\276\320\274\320\226\320\265\320\273\321\203\320\264\320\265.os" new file mode 100644 index 0000000..8d4fe83 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\321\201\321\217\320\242\320\276\320\273\321\214\320\272\320\276\320\235\320\260\320\232\320\276\320\275\320\272\321\200\320\265\321\202\320\275\320\276\320\274\320\226\320\265\320\273\321\203\320\264\320\265.os" @@ -0,0 +1,14 @@ +// BSLLS:MissingVariablesDescription-off +// BSLLS:ExportVariables-off + +Перем СработалоРаз Экспорт; + +Функция ОбработатьЖелудь(Желудь, ОпределениеЖелудя) Экспорт // BSLLS:UnusedParameters-off + СработалоРаз = СработалоРаз + 1; + Возврат Желудь; +КонецФункции + +&Напильник(ПрименяетсяТолькоНа = "КомпанейскийЖелудь") +Процедура ПриСозданииОбъекта() + СработалоРаз = 0; +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\321\201\321\217\320\242\320\276\320\273\321\214\320\272\320\276\320\235\320\260\320\232\321\200\321\203\320\263\320\273\321\217\321\210\320\260\321\205.os" "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\321\201\321\217\320\242\320\276\320\273\321\214\320\272\320\276\320\235\320\260\320\232\321\200\321\203\320\263\320\273\321\217\321\210\320\260\321\205.os" new file mode 100644 index 0000000..60e9b64 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\237\321\200\320\270\320\274\320\265\320\275\321\217\321\216\321\211\320\270\320\271\321\201\321\217\320\242\320\276\320\273\321\214\320\272\320\276\320\235\320\260\320\232\321\200\321\203\320\263\320\273\321\217\321\210\320\260\321\205.os" @@ -0,0 +1,14 @@ +// BSLLS:MissingVariablesDescription-off +// BSLLS:ExportVariables-off + +Перем СработалоРаз Экспорт; + +Функция ОбработатьЖелудь(Желудь, ОпределениеЖелудя) Экспорт // BSLLS:UnusedParameters-off + СработалоРаз = СработалоРаз + 1; + Возврат Желудь; +КонецФункции + +&Напильник(ПрименяетсяТолькоНа = "Кругляш") +Процедура ПриСозданииОбъекта() + СработалоРаз = 0; +КонецПроцедуры \ No newline at end of file