From fe15abe7845b6be86f992a0d2e7e2d942dc464cc Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Thu, 30 Apr 2026 01:10:45 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=B0=20=D0=9A=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=20?= =?UTF-8?q?=D1=83=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\202\320\276\320\264\320\260.os" | 91 +++++++++++++++++++ ...20\265\320\263\320\260\321\202\320\260.os" | 59 ++---------- ...20\260\321\200\320\272\320\276\320\262.os" | 67 ++++++++++++++ ...20\261\321\213\321\202\320\270\320\271.os" | 6 ++ ...20\260\321\200\320\272\320\276\320\262.os" | 14 ++- 5 files changed, 183 insertions(+), 54 deletions(-) create mode 100644 "src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" diff --git "a/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" new file mode 100644 index 0000000..b37fd56 --- /dev/null +++ "b/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" @@ -0,0 +1,91 @@ +Перем _КвалифицированноеИмяМетода; // Строка +Перем _Объект; // Произвольный + +#Область ОбработчикиСобытий + +// Инициализирует разбор квалифицированного имени метода. +// +// Параметры: +// КвалифицированноеИмяМетода - Строка - Имя метода в формате: +// - <ИмяМетода> - метод объекта +// - <ИмяМодуля>.<ИмяМетода> - метод модуля +// - <ИмяТипа>.<ИмяМетода> - метод экземпляра типа +// Объект - Произвольный - Объект-владелец метода для формата <ИмяМетода>. +Процедура ПриСозданииОбъекта(КвалифицированноеИмяМетода, Объект = Неопределено) + + _КвалифицированноеИмяМетода = КвалифицированноеИмяМетода; + _Объект = Объект; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Разбирает квалифицированное имя метода. +// +// Возвращаемое значение: +// Структура: +// * Владелец - Произвольный - объект, тип или модуль, в котором расположен метод +// * ИмяМетода - Строка - имя метода без квалификатора +Функция Разобрать() Экспорт + + ЧастиИмени = СтрРазделить(_КвалифицированноеИмяМетода, "."); + КоличествоЧастей = ЧастиИмени.Количество(); + + Если КоличествоЧастей = 1 Тогда + Возврат РазобратьМетодОбъекта(); + ИначеЕсли КоличествоЧастей = 2 Тогда + Возврат РазобратьКвалифицированныйМетод(ЧастиИмени); + Иначе + ВызватьИсключение СтрШаблон("Квалифицированное имя метода <%1> задано некорректно", _КвалифицированноеИмяМетода); + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция РазобратьМетодОбъекта() + + Если Не ЗначениеЗаполнено(_Объект) Тогда + ВызватьИсключение СтрШаблон("Для разбора метода <%1> не указан объект-владелец", _КвалифицированноеИмяМетода); + КонецЕсли; + + Возврат Новый Структура("Владелец, ИмяМетода", _Объект, _КвалифицированноеИмяМетода); + +КонецФункции + +Функция РазобратьКвалифицированныйМетод(ЧастиИмени) + + ИмяМодуляИлиТипа = ЧастиИмени[0]; + ИмяМетода = ЧастиИмени[1]; + + Владелец = ПолучитьМодульПоИмени(ИмяМодуляИлиТипа); + + Если Владелец = Неопределено Тогда + Владелец = Тип(ИмяМодуляИлиТипа); + КонецЕсли; + + Возврат Новый Структура("Владелец, ИмяМетода", Владелец, ИмяМетода); + +КонецФункции + +Функция ПолучитьМодульПоИмени(ИмяМодуля) + + Попытка + НайденныйОбъект = Вычислить(ИмяМодуля); + Исключение + Возврат Неопределено; + КонецПопытки; + + Если ТипЗнч(НайденныйОбъект) <> Тип("Сценарий") Тогда + ВызватьИсключение СтрШаблон("Модуль <%1> не является сценарием", ИмяМодуля); + КонецЕсли; + + Возврат НайденныйОбъект; + +КонецФункции + +#КонецОбласти diff --git "a/src/BenchmarkOneScript/core/common/\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\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" "b/src/BenchmarkOneScript/core/common/\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\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" index a0f95c4..6c3560a 100644 --- "a/src/BenchmarkOneScript/core/common/\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\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" +++ "b/src/BenchmarkOneScript/core/common/\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\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" @@ -52,7 +52,7 @@ _КешированныйДелегат = СоздатьДелегатПоКвалифицированномуИмени(); Возврат _КешированныйДелегат; - + КонецФункции #КонецОбласти @@ -60,59 +60,18 @@ #Область СлужебныеПроцедурыИФункции Функция СоздатьДелегатПоКвалифицированномуИмени() - - ЧастиИмени = СтрРазделить(_КвалифицированноеИмяМетода, "."); - КоличествоЧастей = ЧастиИмени.Количество(); - - Если КоличествоЧастей = 1 Тогда - Возврат СоздатьДелегатДляМетодаОбъекта(); - ИначеЕсли КоличествоЧастей = 2 Тогда - Возврат СоздатьДелегатДляКвалифицированногоМетода(ЧастиИмени); - Иначе - ВызватьИсключение СтрШаблон("Квалифицированное имя метода <%1> задано некорректно", _КвалифицированноеИмяМетода); - КонецЕсли; - -КонецФункции - -Функция СоздатьДелегатДляМетодаОбъекта() - - Если Не ЗначениеЗаполнено(_Объект) Тогда - ВызватьИсключение СтрШаблон("Для создания делегата <%1> не указан объект", _КвалифицированноеИмяМетода); - КонецЕсли; - - Возврат Новый Действие(_Объект, _КвалифицированноеИмяМетода); - -КонецФункции -Функция СоздатьДелегатДляКвалифицированногоМетода(ЧастиИмени) - - ИмяМодуляИлиТипа = ЧастиИмени[0]; - ИмяМетода = ЧастиИмени[1]; + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода(_КвалифицированноеИмяМетода, _Объект); + ОписаниеМетода = РазборИмениМетода.Разобрать(); - ОбъектВладелец = ПолучитьМодульПоИмени(ИмяМодуляИлиТипа); - - Если ОбъектВладелец = Неопределено Тогда - ОбъектВладелец = Новый(ИмяМодуляИлиТипа); - КонецЕсли; - - Возврат Новый Действие(ОбъектВладелец, ИмяМетода); - -КонецФункции - -Функция ПолучитьМодульПоИмени(ИмяМодуля) - - Попытка - НайденныйОбъект = Вычислить(ИмяМодуля); - Исключение - Возврат Неопределено; - КонецПопытки; - - Если ТипЗнч(НайденныйОбъект) <> Тип("Сценарий") Тогда - ВызватьИсключение СтрШаблон("Модуль <%1> не является сценарием", ИмяМодуля); + Если ТипЗнч(ОписаниеМетода.Владелец) = Тип("Тип") Тогда + Объект = Новый(ОписаниеМетода.Владелец); + Иначе + Объект = ОписаниеМетода.Владелец; КонецЕсли; - Возврат НайденныйОбъект; + Возврат Новый Действие(Объект, ОписаниеМетода.ИмяМетода); КонецФункции -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 8fb5c0b..3072acb 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -3,10 +3,12 @@ #Использовать logos #Использовать fluent +#Использовать reflector Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков Перем _Конфигурация; // КонфигурацияБенчмарков Перем _НайденныеОшибки; // Массив из Строка +Перем _Рефлектор; // Рефлектор #Область ОбработчикиСобытий @@ -23,6 +25,7 @@ _ДескрипторыБенчмарков = ДескрипторыБенчмарков; _Конфигурация = Конфигурация; _НайденныеОшибки = Новый Массив(); + _Рефлектор = Новый Рефлектор(); КонецПроцедуры @@ -39,6 +42,7 @@ // 4. Уникальность эталонных бенчмарков в пределах категории // 5. Поддержка пользовательских колонок текущей версией OneScript // 6. Сериализуемость всех параметров (примитивные типы) +// 7. Наличие параметра Контекст у обработчиков событий // // Возвращаемое значение: // Булево - Истина, если конфигурация корректна и запуск возможен; @@ -53,6 +57,7 @@ ПроверитьУникальностьЭталонныхБенчмарков(); ПроверитьПоддержкуПользовательскихКолонок(); ПроверитьСериализуемостьПараметров(); + ПроверитьОбработчикиСобытий(); Результат = _НайденныеОшибки.Количество() = 0; @@ -282,6 +287,68 @@ КонецПроцедуры +// Проверяет, что все обработчики событий объявлены экспортными процедурами +// с единственным параметром. +// +Процедура ПроверитьОбработчикиСобытий() + + Если _ДескрипторыБенчмарков.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ТипКлассаБенчмарков = _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); + + Для Каждого Обработчик Из _Конфигурация.ОбработчикиСобытий() Цикл + + Если ОбработчикСобытияВалиден(Обработчик, ТипКлассаБенчмарков) Тогда + Продолжить; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Обработчик события <%1> должен быть экспортной процедурой с единственным параметром <Контекст>.", + Обработчик.ИмяМетода() + )); + + КонецЦикла; + +КонецПроцедуры + +Функция ОбработчикСобытияВалиден(Обработчик, ТипКлассаБенчмарков) + + СвойстваМетода = НайтиСвойстваМетодаОбработчика(Обработчик.ИмяМетода(), ТипКлассаБенчмарков); + + Если СвойстваМетода = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если Не СвойстваМетода.Экспорт Тогда + Возврат Ложь; + КонецЕсли; + + ПараметрыМетода = СвойстваМетода.Параметры; + + Если ПараметрыМетода.Количество() <> 1 Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция НайтиСвойстваМетодаОбработчика(КвалифицированноеИмяМетода, ТипКлассаБенчмарков) + + Попытка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода(КвалифицированноеИмяМетода, ТипКлассаБенчмарков); + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + ТаблицаМетодов = _Рефлектор.ПолучитьТаблицуМетодов(ОписаниеМетода.Владелец); + Возврат ТаблицаМетодов.Найти(ОписаниеМетода.ИмяМетода, "Имя"); + Исключение + Возврат Неопределено; + КонецПопытки; + +КонецФункции + Процедура ДобавитьОшибку(ТекстОшибки) Если _НайденныеОшибки.Найти(ТекстОшибки) = Неопределено Тогда diff --git "a/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" "b/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" index a1ac040..2c572fb 100644 --- "a/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" +++ "b/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" @@ -98,4 +98,10 @@ Процедура БезАннотации(Контекст) Экспорт ЗаписьЛога.ЗаписатьСтроку("БезАннотации"); +КонецПроцедуры + +Процедура ОбработчикБезКонтекста() Экспорт +КонецПроцедуры + +Процедура ОбработчикБезЭкспорта(Контекст) КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\276\320\262\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\276\320\262\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index bf9cc6f..2c29bea 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\276\320\262\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\276\320\262\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -105,15 +105,18 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_ВыброситьИсключениеНаНесуществующемОбработчикеСобытия() Экспорт +&Параметры("ОбработчикБезКонтекста") +&Параметры("ОбработчикБезЭкспорта") +&Параметры("НесуществующийОбработчик") +Процедура ТестДолжен_ВыброситьИсключениеНаНеВалидномОбработчикеСобытия(ИмяОбработчика) Экспорт // Подготовка - Тип = Тип("ПустойБенчмарк"); + Тип = Тип("БенчмаркСОбработчикамиСобытий"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Конфигурация.ДобавитьОбработчикСобытия("НесуществующийОбработчик", СобытияБенчмарков.ПередКаждымКейсом); + Конфигурация.ДобавитьОбработчикСобытия(ИмяОбработчика, СобытияБенчмарков.ПередКаждымКейсом); ПараметрыМетода = Новый Массив(); ПараметрыМетода.Добавить(Тип); @@ -123,7 +126,10 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Ошибка в обработчике события <НесуществующийОбработчик>: Метод объекта не обнаружен"); + .ВыбрасываетИсключение(СтрШаблон( + "Обработчик события <%1> должен быть экспортной процедурой с единственным параметром <Контекст>.", + ИмяОбработчика + )); КонецПроцедуры From d67636675638cbddaa47e58f8daa03e545d14343 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Thu, 30 Apr 2026 09:47:25 +0300 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0=D1=80?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - проверять методы бенчмарков, поля параметров и источники параметров - учитывать источники параметров из внешних модулей - добавить интеграционные тесты валидации запуска --- ...20\260\321\200\320\272\320\276\320\262.os" | 149 +++++++++++++++++- ...20\275\321\202\320\260\320\274\320\270.os" | 32 ++++ ...20\265\321\202\321\200\320\276\320\262.os" | 11 +- ...20\260\321\200\320\272\320\276\320\262.os" | 127 +++++++++++++++ 4 files changed, 311 insertions(+), 8 deletions(-) create mode 100644 "tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\235\320\265\320\277\321\203\320\261\320\273\320\270\321\207\320\275\321\213\320\274\320\270\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260\320\274\320\270.os" create mode 100644 "tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 3072acb..861fc88 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -8,7 +8,7 @@ Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков Перем _Конфигурация; // КонфигурацияБенчмарков Перем _НайденныеОшибки; // Массив из Строка -Перем _Рефлектор; // Рефлектор +Перем _РефлекторыОбъектов; // Соответствие из РефлекторОбъекта #Область ОбработчикиСобытий @@ -25,7 +25,7 @@ _ДескрипторыБенчмарков = ДескрипторыБенчмарков; _Конфигурация = Конфигурация; _НайденныеОшибки = Новый Массив(); - _Рефлектор = Новый Рефлектор(); + _РефлекторыОбъектов = Новый Соответствие(); КонецПроцедуры @@ -42,7 +42,8 @@ // 4. Уникальность эталонных бенчмарков в пределах категории // 5. Поддержка пользовательских колонок текущей версией OneScript // 6. Сериализуемость всех параметров (примитивные типы) -// 7. Наличие параметра Контекст у обработчиков событий +// 7. Экспортность методов бенчмарков, полей и источников параметров +// 8. Наличие параметра Контекст у обработчиков событий // // Возвращаемое значение: // Булево - Истина, если конфигурация корректна и запуск возможен; @@ -57,6 +58,7 @@ ПроверитьУникальностьЭталонныхБенчмарков(); ПроверитьПоддержкуПользовательскихКолонок(); ПроверитьСериализуемостьПараметров(); + ПроверитьЭкспортностьЭлементовБенчмарков(); ПроверитьОбработчикиСобытий(); Результат = _НайденныеОшибки.Количество() = 0; @@ -287,6 +289,104 @@ КонецПроцедуры +// Проверяет экспортность методов бенчмарков, общих полей и источников параметров. +// +Процедура ПроверитьЭкспортностьЭлементовБенчмарков() + + Если _ДескрипторыБенчмарков.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ПроверитьЭкспортностьМетодовБенчмарков(); + ПроверитьЭкспортностьПолейПараметров(); + ПроверитьЭкспортностьИсточниковПараметров(); + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьМетодовБенчмарков() + + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл + + СвойстваМетода = НайтиСвойстваМетода(ДескрипторБенчмарка.ТипКласса(), ДескрипторБенчмарка.Метод()); + Если СвойстваМетода <> Неопределено И СвойстваМетода.Экспорт Тогда + Продолжить; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Метод бенчмарка <%1> должен быть экспортным.", + ДескрипторБенчмарка.Метод() + )); + + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьПолейПараметров() + + ТипКлассаБенчмарков = _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); + + Для Каждого Параметр Из _Конфигурация.Параметры() Цикл + ПроверитьЭкспортностьПоляПараметра(Параметр.Имя(), ТипКлассаБенчмарков); + КонецЦикла; + + Для Каждого ИсточникПараметров Из _Конфигурация.ИсточникиПараметров() Цикл + ПроверитьЭкспортностьПоляПараметра(ИсточникПараметров.ИмяПоля, ТипКлассаБенчмарков); + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьПоляПараметра(ИмяПоля, ТипКлассаБенчмарков) + + СвойстваПоля = НайтиСвойстваПоля(ТипКлассаБенчмарков, ИмяПоля); + Если СвойстваПоля = Неопределено Тогда + Возврат; + КонецЕсли; + + Если СвойстваПоля.Экспорт Тогда + Возврат; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Поле параметра <%1> должно быть экспортным.", + ИмяПоля + )); + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьИсточниковПараметров() + + ТипКлассаБенчмарков = _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); + + Для Каждого ИсточникПараметров Из _Конфигурация.ИсточникиПараметров() Цикл + ПроверитьЭкспортностьИсточникаПараметров(ИсточникПараметров.Источник, ТипКлассаБенчмарков); + КонецЦикла; + + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл + Для Каждого ИсточникПараметров Из ДескрипторБенчмарка.ИсточникиПараметров() Цикл + ПроверитьЭкспортностьИсточникаПараметров(ИсточникПараметров, ДескрипторБенчмарка.ТипКласса()); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьИсточникаПараметров(КвалифицированноеИмяМетода, ТипКлассаБенчмарков) + + СвойстваМетода = НайтиСвойстваКвалифицированногоМетода(КвалифицированноеИмяМетода, ТипКлассаБенчмарков); + Если СвойстваМетода = Неопределено Тогда + Возврат; + КонецЕсли; + + Если СвойстваМетода.Экспорт Тогда + Возврат; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Метод-источник параметров <%1> должен быть экспортным.", + КвалифицированноеИмяМетода + )); + +КонецПроцедуры + // Проверяет, что все обработчики событий объявлены экспортными процедурами // с единственным параметром. // @@ -315,7 +415,7 @@ Функция ОбработчикСобытияВалиден(Обработчик, ТипКлассаБенчмарков) - СвойстваМетода = НайтиСвойстваМетодаОбработчика(Обработчик.ИмяМетода(), ТипКлассаБенчмарков); + СвойстваМетода = НайтиСвойстваКвалифицированногоМетода(Обработчик.ИмяМетода(), ТипКлассаБенчмарков); Если СвойстваМетода = Неопределено Тогда Возврат Ложь; @@ -335,20 +435,55 @@ КонецФункции -Функция НайтиСвойстваМетодаОбработчика(КвалифицированноеИмяМетода, ТипКлассаБенчмарков) +Функция НайтиСвойстваКвалифицированногоМетода(КвалифицированноеИмяМетода, ТипКлассаБенчмарков) Попытка РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода(КвалифицированноеИмяМетода, ТипКлассаБенчмарков); ОписаниеМетода = РазборИмениМетода.Разобрать(); - ТаблицаМетодов = _Рефлектор.ПолучитьТаблицуМетодов(ОписаниеМетода.Владелец); - Возврат ТаблицаМетодов.Найти(ОписаниеМетода.ИмяМетода, "Имя"); + Возврат НайтиСвойстваМетода(ОписаниеМетода.Владелец, ОписаниеМетода.ИмяМетода); Исключение Возврат Неопределено; КонецПопытки; КонецФункции +Функция НайтиСвойстваМетода(Владелец, ИмяМетода) + + Попытка + РефлекторОбъекта = ПолучитьРефлекторОбъекта(Владелец); + ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов(, Ложь); + Возврат ТаблицаМетодов.Найти(ИмяМетода, "Имя"); + Исключение + Возврат Неопределено; + КонецПопытки; + +КонецФункции + +Функция НайтиСвойстваПоля(Владелец, ИмяПоля) + + Попытка + РефлекторОбъекта = ПолучитьРефлекторОбъекта(Владелец); + ТаблицаСвойств = РефлекторОбъекта.ПолучитьТаблицуСвойств(, Истина); + Возврат ТаблицаСвойств.Найти(ИмяПоля, "Имя"); + Исключение + Возврат Неопределено; + КонецПопытки; + +КонецФункции + +Функция ПолучитьРефлекторОбъекта(Владелец) + + РефлекторОбъекта = _РефлекторыОбъектов[Владелец]; + Если РефлекторОбъекта = Неопределено Тогда + РефлекторОбъекта = Новый РефлекторОбъекта(Владелец); + _РефлекторыОбъектов[Владелец] = РефлекторОбъекта; + КонецЕсли; + + Возврат РефлекторОбъекта; + +КонецФункции + Процедура ДобавитьОшибку(ТекстОшибки) Если _НайденныеОшибки.Найти(ТекстОшибки) = Неопределено Тогда diff --git "a/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\235\320\265\320\277\321\203\320\261\320\273\320\270\321\207\320\275\321\213\320\274\320\270\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260\320\274\320\270.os" "b/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\235\320\265\320\277\321\203\320\261\320\273\320\270\321\207\320\275\321\213\320\274\320\270\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260\320\274\320\270.os" new file mode 100644 index 0000000..687f372 --- /dev/null +++ "b/tests/fixtures/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\235\320\265\320\277\321\203\320\261\320\273\320\270\321\207\320\275\321\213\320\274\320\270\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260\320\274\320\270.os" @@ -0,0 +1,32 @@ +Перем ОткрытоеПоле Экспорт; +Перем ЗакрытоеПоле; + +&Бенчмарк +Процедура Бенчмарк() Экспорт +КонецПроцедуры + +&Бенчмарк +Процедура БенчмаркСПараметром(Парам) Экспорт +КонецПроцедуры + +Процедура ЗакрытыйБенчмарк() +КонецПроцедуры + +Функция ОткрытыйИсточник() Экспорт + + Значения = Новый Массив(); + Значения.Добавить(1); + + Возврат Значения; + +КонецФункции + +Функция ЗакрытыйИсточник() + + Значения = Новый Массив(); + Значения.Добавить(1); + + Возврат Значения; + +КонецФункции + diff --git "a/tests/fixtures/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\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/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\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" index 636f55d..36969de 100644 --- "a/tests/fixtures/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\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/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\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" @@ -17,4 +17,13 @@ Возврат Значения; -КонецФункции \ No newline at end of file +КонецФункции + +Функция ЗакрытыйИсточникИзМодуля() + + Значения = Новый Массив(); + Значения.Добавить(1); + + Возврат Значения; + +КонецФункции diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" new file mode 100644 index 0000000..c8efa79 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -0,0 +1,127 @@ +// BSLLS:LineLength-off + +#Использовать fluent +#Использовать "helpers" +#Использовать "fixtures/benchmarks" +#Использовать "fixtures/paramsSources" + +#Область Тесты + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномМетодеБенчмарка() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором("ЗакрытыйБенчмарк"); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод бенчмарка <ЗакрытыйБенчмарк> должен быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномПолеПараметра() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + Конфигурация.ДобавитьПараметр("ЗакрытоеПоле", 1); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Поле параметра <ЗакрытоеПоле> должно быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеОбщегоПараметра() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + Конфигурация.ДобавитьИсточникПараметров("ОткрытоеПоле", "ЗакрытыйИсточник"); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод-источник параметров <ЗакрытыйИсточник> должен быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеОбщегоПараметраИзМодуля() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + Конфигурация.ДобавитьИсточникПараметров( + "ОткрытоеПоле", + "МодульСИсточникамиПараметров.ЗакрытыйИсточникИзМодуля" + ); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод-источник параметров <МодульСИсточникамиПараметров.ЗакрытыйИсточникИзМодуля> должен быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеПараметровБенчмарка() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором("БенчмаркСПараметром"); + ДескрипторыБенчмарков.ПолучитьПервый().ДобавитьИсточникПараметров("ЗакрытыйИсточник"); + + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод-источник параметров <ЗакрытыйИсточник> должен быть экспортным." + ); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьКоллекциюСДескриптором(ИмяМетода = "Бенчмарк") + + ТипБенчмарка = Тип("БенчмаркСНепубличнымиЭлементами"); + + ДескрипторБенчмарка = Новый ДескрипторБенчмарка(ТипБенчмарка, ИмяМетода); + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); + ДескрипторыБенчмарков.Добавить(ДескрипторБенчмарка); + + Возврат ДескрипторыБенчмарков; + +КонецФункции + +Процедура ПроверитьИсключениеЗапуска(ИсточникБенчмарков, Конфигурация, ТекстИсключения) + + ПараметрыМетода = Новый Массив(); + ПараметрыМетода.Добавить(ИсточникБенчмарков); + ПараметрыМетода.Добавить(Конфигурация); + + Ожидаем + .Что(Бенчмаркинг) + .Метод("Запустить", ПараметрыМетода) + .ВыбрасываетИсключение(ТекстИсключения); + +КонецПроцедуры + +#КонецОбласти From e7a6df9c795811f1770449d26d6fe42190f48df4 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Thu, 30 Apr 2026 10:01:40 +0300 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=D0=97=D0=B0=D1=89=D0=B8=D1=82=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BE=D1=82=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - проверять имя модуля перед вызовом Вычислить - запретить небезопасные выражения в квалифицированном имени метода - покрыть разбор имени метода для объекта, модуля, типа и ошибок формата --- ...20\265\321\202\320\276\320\264\320\260.os" | 23 ++++ ...20\265\321\202\320\276\320\264\320\260.os" | 118 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 "tests/\320\242\320\265\321\201\321\202\321\213\320\240\320\260\320\267\320\261\320\276\321\200\320\260\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" diff --git "a/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" index b37fd56..4725c53 100644 --- "a/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" +++ "b/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\320\261\320\276\321\200\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" @@ -1,5 +1,6 @@ Перем _КвалифицированноеИмяМетода; // Строка Перем _Объект; // Произвольный +Перем _РегуляркаИмениМодуля; // РегулярноеВыражение #Область ОбработчикиСобытий @@ -74,6 +75,8 @@ Функция ПолучитьМодульПоИмени(ИмяМодуля) + ПроверитьИмяМодуля(ИмяМодуля); + Попытка НайденныйОбъект = Вычислить(ИмяМодуля); Исключение @@ -88,4 +91,24 @@ КонецФункции +Процедура ПроверитьИмяМодуля(ИмяМодуля) + + Если ИмяМодуляВалидно(ИмяМодуля) Тогда + Возврат; + КонецЕсли; + + ВызватьИсключение СтрШаблон("Имя модуля <%1> задано некорректно.", ИмяМодуля); + +КонецПроцедуры + +Функция ИмяМодуляВалидно(ИмяМодуля) + + Если _РегуляркаИмениМодуля = Неопределено Тогда + _РегуляркаИмениМодуля = Новый РегулярноеВыражение("^[a-zA-Zа-яА-ЯёЁ_][a-zA-Zа-яА-ЯёЁ0-9_]*$"); + КонецЕсли; + + Возврат _РегуляркаИмениМодуля.Совпадает(ИмяМодуля); + +КонецФункции + #КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\240\320\260\320\267\320\261\320\276\321\200\320\260\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\240\320\260\320\267\320\261\320\276\321\200\320\260\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" new file mode 100644 index 0000000..efb4987 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\240\320\260\320\267\320\261\320\276\321\200\320\260\320\232\320\262\320\260\320\273\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\276\320\263\320\276\320\230\320\274\320\265\320\275\320\270\320\234\320\265\321\202\320\276\320\264\320\260.os" @@ -0,0 +1,118 @@ +// BSLLS:LineLength-off + +#Использовать fluent +#Использовать "helpers" +#Использовать "fixtures/benchmarks" +#Использовать "fixtures/paramsSources" + +#Область Тесты + +&Тест +Процедура ТестДолжен_РазобратьИмяМетодаОбъекта() Экспорт + + // Подготовка + Объект = Новый Структура("Имя", "Владелец"); + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("МетодОбъекта", Объект); + + // Действие + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + // Проверка + Ожидаем.Что(ОписаниеМетода.Владелец).Равно(Объект); + Ожидаем.Что(ОписаниеМетода.ИмяМетода).Равно("МетодОбъекта"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьИмяМетодаМодуля() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода( + "МодульСИсточникамиПараметров.ПолучитьЧисловыеЗначения" + ); + + // Действие + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + // Проверка + Ожидаем.Что(ТипЗнч(ОписаниеМетода.Владелец)).ИмеетТип("Сценарий"); + Ожидаем.Что(ОписаниеМетода.ИмяМетода).Равно("ПолучитьЧисловыеЗначения"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьИмяМетодаТипа() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("ПустойБенчмарк.Бенчмарк"); + + // Действие + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + // Проверка + Ожидаем.Что(ОписаниеМетода.Владелец).ИмеетТип("ПустойБенчмарк"); + Ожидаем.Что(ОписаниеМетода.ИмяМетода).Равно("Бенчмарк"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеЕслиДляМетодаОбъектаНеПереданОбъект() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("МетодОбъекта"); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение("Для разбора метода <МетодОбъекта> не указан объект-владелец"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНекорректномКвалифицированномИмени() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("Модуль.Объект.Метод"); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение( + "Квалифицированное имя метода <Модуль.Объект.Метод> задано некорректно" + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗапретитьНебезопасноеИмяМодуля() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода( + "Сообщить(""Произвольный код"").Метод" + ); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение("Имя модуля <Сообщить(""Произвольный код"")> задано некорректно."); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеЕслиИмяМодуляУказываетНеНаСценарий() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("Истина.Метод"); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение("Модуль <Истина> не является сценарием"); + +КонецПроцедуры + +#КонецОбласти From 38b95c0bd446e6c43afab9f7b350bdf505556591 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Thu, 30 Apr 2026 10:05:30 +0300 Subject: [PATCH 4/4] =?UTF-8?q?tests:=20=D0=98=D1=81=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20os=20v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\207\320\274\320\260\321\200\320\272\320\276\320\262.os" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index c8efa79..79615a8 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -61,6 +61,10 @@ Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеОбщегоПараметраИзМодуля() Экспорт // Подготовка + Если ТестированиеБенчмарков.ЭтоOneScript1() Тогда + Возврат; + КонецЕсли; + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); Конфигурация.ДобавитьИсточникПараметров(