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..4725c53 --- /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,114 @@ +Перем _КвалифицированноеИмяМетода; // Строка +Перем _Объект; // Произвольный +Перем _РегуляркаИмениМодуля; // РегулярноеВыражение + +#Область ОбработчикиСобытий + +// Инициализирует разбор квалифицированного имени метода. +// +// Параметры: +// КвалифицированноеИмяМетода - Строка - Имя метода в формате: +// - <ИмяМетода> - метод объекта +// - <ИмяМодуля>.<ИмяМетода> - метод модуля +// - <ИмяТипа>.<ИмяМетода> - метод экземпляра типа +// Объект - Произвольный - Объект-владелец метода для формата <ИмяМетода>. +Процедура ПриСозданииОбъекта(КвалифицированноеИмяМетода, Объект = Неопределено) + + _КвалифицированноеИмяМетода = КвалифицированноеИмяМетода; + _Объект = Объект; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Разбирает квалифицированное имя метода. +// +// Возвращаемое значение: +// Структура: +// * Владелец - Произвольный - объект, тип или модуль, в котором расположен метод +// * ИмяМетода - Строка - имя метода без квалификатора +Функция Разобрать() Экспорт + + ЧастиИмени = СтрРазделить(_КвалифицированноеИмяМетода, "."); + КоличествоЧастей = ЧастиИмени.Количество(); + + Если КоличествоЧастей = 1 Тогда + Возврат РазобратьМетодОбъекта(); + ИначеЕсли КоличествоЧастей = 2 Тогда + Возврат РазобратьКвалифицированныйМетод(ЧастиИмени); + Иначе + ВызватьИсключение СтрШаблон("Квалифицированное имя метода <%1> задано некорректно", _КвалифицированноеИмяМетода); + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция РазобратьМетодОбъекта() + + Если Не ЗначениеЗаполнено(_Объект) Тогда + ВызватьИсключение СтрШаблон("Для разбора метода <%1> не указан объект-владелец", _КвалифицированноеИмяМетода); + КонецЕсли; + + Возврат Новый Структура("Владелец, ИмяМетода", _Объект, _КвалифицированноеИмяМетода); + +КонецФункции + +Функция РазобратьКвалифицированныйМетод(ЧастиИмени) + + ИмяМодуляИлиТипа = ЧастиИмени[0]; + ИмяМетода = ЧастиИмени[1]; + + Владелец = ПолучитьМодульПоИмени(ИмяМодуляИлиТипа); + + Если Владелец = Неопределено Тогда + Владелец = Тип(ИмяМодуляИлиТипа); + КонецЕсли; + + Возврат Новый Структура("Владелец, ИмяМетода", Владелец, ИмяМетода); + +КонецФункции + +Функция ПолучитьМодульПоИмени(ИмяМодуля) + + ПроверитьИмяМодуля(ИмяМодуля); + + Попытка + НайденныйОбъект = Вычислить(ИмяМодуля); + Исключение + Возврат Неопределено; + КонецПопытки; + + Если ТипЗнч(НайденныйОбъект) <> Тип("Сценарий") Тогда + ВызватьИсключение СтрШаблон("Модуль <%1> не является сценарием", ИмяМодуля); + КонецЕсли; + + Возврат НайденныйОбъект; + +КонецФункции + +Процедура ПроверитьИмяМодуля(ИмяМодуля) + + Если ИмяМодуляВалидно(ИмяМодуля) Тогда + Возврат; + КонецЕсли; + + ВызватьИсключение СтрШаблон("Имя модуля <%1> задано некорректно.", ИмяМодуля); + +КонецПроцедуры + +Функция ИмяМодуляВалидно(ИмяМодуля) + + Если _РегуляркаИмениМодуля = Неопределено Тогда + _РегуляркаИмениМодуля = Новый РегулярноеВыражение("^[a-zA-Zа-яА-ЯёЁ_][a-zA-Zа-яА-ЯёЁ0-9_]*$"); + КонецЕсли; + + Возврат _РегуляркаИмениМодуля.Совпадает(ИмяМодуля); + +КонецФункции + +#КонецОбласти 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..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" @@ -3,10 +3,12 @@ #Использовать logos #Использовать fluent +#Использовать reflector Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков Перем _Конфигурация; // КонфигурацияБенчмарков Перем _НайденныеОшибки; // Массив из Строка +Перем _РефлекторыОбъектов; // Соответствие из РефлекторОбъекта #Область ОбработчикиСобытий @@ -23,6 +25,7 @@ _ДескрипторыБенчмарков = ДескрипторыБенчмарков; _Конфигурация = Конфигурация; _НайденныеОшибки = Новый Массив(); + _РефлекторыОбъектов = Новый Соответствие(); КонецПроцедуры @@ -39,6 +42,8 @@ // 4. Уникальность эталонных бенчмарков в пределах категории // 5. Поддержка пользовательских колонок текущей версией OneScript // 6. Сериализуемость всех параметров (примитивные типы) +// 7. Экспортность методов бенчмарков, полей и источников параметров +// 8. Наличие параметра Контекст у обработчиков событий // // Возвращаемое значение: // Булево - Истина, если конфигурация корректна и запуск возможен; @@ -53,6 +58,8 @@ ПроверитьУникальностьЭталонныхБенчмарков(); ПроверитьПоддержкуПользовательскихКолонок(); ПроверитьСериализуемостьПараметров(); + ПроверитьЭкспортностьЭлементовБенчмарков(); + ПроверитьОбработчикиСобытий(); Результат = _НайденныеОшибки.Количество() = 0; @@ -282,6 +289,201 @@ КонецПроцедуры +// Проверяет экспортность методов бенчмарков, общих полей и источников параметров. +// +Процедура ПроверитьЭкспортностьЭлементовБенчмарков() + + Если _ДескрипторыБенчмарков.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ПроверитьЭкспортностьМетодовБенчмарков(); + ПроверитьЭкспортностьПолейПараметров(); + ПроверитьЭкспортностьИсточниковПараметров(); + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьМетодовБенчмарков() + + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл + + СвойстваМетода = НайтиСвойстваМетода(ДескрипторБенчмарка.ТипКласса(), ДескрипторБенчмарка.Метод()); + Если СвойстваМетода <> Неопределено И СвойстваМетода.Экспорт Тогда + Продолжить; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Метод бенчмарка <%1> должен быть экспортным.", + ДескрипторБенчмарка.Метод() + )); + + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьПолейПараметров() + + ТипКлассаБенчмарков = _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); + + Для Каждого Параметр Из _Конфигурация.Параметры() Цикл + ПроверитьЭкспортностьПоляПараметра(Параметр.Имя(), ТипКлассаБенчмарков); + КонецЦикла; + + Для Каждого ИсточникПараметров Из _Конфигурация.ИсточникиПараметров() Цикл + ПроверитьЭкспортностьПоляПараметра(ИсточникПараметров.ИмяПоля, ТипКлассаБенчмарков); + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьПоляПараметра(ИмяПоля, ТипКлассаБенчмарков) + + СвойстваПоля = НайтиСвойстваПоля(ТипКлассаБенчмарков, ИмяПоля); + Если СвойстваПоля = Неопределено Тогда + Возврат; + КонецЕсли; + + Если СвойстваПоля.Экспорт Тогда + Возврат; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Поле параметра <%1> должно быть экспортным.", + ИмяПоля + )); + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьИсточниковПараметров() + + ТипКлассаБенчмарков = _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); + + Для Каждого ИсточникПараметров Из _Конфигурация.ИсточникиПараметров() Цикл + ПроверитьЭкспортностьИсточникаПараметров(ИсточникПараметров.Источник, ТипКлассаБенчмарков); + КонецЦикла; + + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл + Для Каждого ИсточникПараметров Из ДескрипторБенчмарка.ИсточникиПараметров() Цикл + ПроверитьЭкспортностьИсточникаПараметров(ИсточникПараметров, ДескрипторБенчмарка.ТипКласса()); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЭкспортностьИсточникаПараметров(КвалифицированноеИмяМетода, ТипКлассаБенчмарков) + + СвойстваМетода = НайтиСвойстваКвалифицированногоМетода(КвалифицированноеИмяМетода, ТипКлассаБенчмарков); + Если СвойстваМетода = Неопределено Тогда + Возврат; + КонецЕсли; + + Если СвойстваМетода.Экспорт Тогда + Возврат; + КонецЕсли; + + ДобавитьОшибку(СтрШаблон( + "Метод-источник параметров <%1> должен быть экспортным.", + КвалифицированноеИмяМетода + )); + +КонецПроцедуры + +// Проверяет, что все обработчики событий объявлены экспортными процедурами +// с единственным параметром. +// +Процедура ПроверитьОбработчикиСобытий() + + Если _ДескрипторыБенчмарков.Количество() = 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\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/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/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..79615a8 --- /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,131 @@ +// BSLLS:LineLength-off + +#Использовать fluent +#Использовать "helpers" +#Использовать "fixtures/benchmarks" +#Использовать "fixtures/paramsSources" + +#Область Тесты + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномМетодеБенчмарка() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором("ЗакрытыйБенчмарк"); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод бенчмарка <ЗакрытыйБенчмарк> должен быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномПолеПараметра() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + Конфигурация.ДобавитьПараметр("ЗакрытоеПоле", 1); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Поле параметра <ЗакрытоеПоле> должно быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеОбщегоПараметра() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + Конфигурация.ДобавитьИсточникПараметров("ОткрытоеПоле", "ЗакрытыйИсточник"); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод-источник параметров <ЗакрытыйИсточник> должен быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеОбщегоПараметраИзМодуля() Экспорт + + // Подготовка + Если ТестированиеБенчмарков.ЭтоOneScript1() Тогда + Возврат; + КонецЕсли; + + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором(); + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + Конфигурация.ДобавитьИсточникПараметров( + "ОткрытоеПоле", + "МодульСИсточникамиПараметров.ЗакрытыйИсточникИзМодуля" + ); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод-источник параметров <МодульСИсточникамиПараметров.ЗакрытыйИсточникИзМодуля> должен быть экспортным." + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНепубличномИсточникеПараметровБенчмарка() Экспорт + + // Подготовка + ДескрипторыБенчмарков = СоздатьКоллекциюСДескриптором("БенчмаркСПараметром"); + ДескрипторыБенчмарков.ПолучитьПервый().ДобавитьИсточникПараметров("ЗакрытыйИсточник"); + + Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию(); + + // Действие и Проверка + ПроверитьИсключениеЗапуска( + ДескрипторыБенчмарков, + Конфигурация, + "Метод-источник параметров <ЗакрытыйИсточник> должен быть экспортным." + ); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьКоллекциюСДескриптором(ИмяМетода = "Бенчмарк") + + ТипБенчмарка = Тип("БенчмаркСНепубличнымиЭлементами"); + + ДескрипторБенчмарка = Новый ДескрипторБенчмарка(ТипБенчмарка, ИмяМетода); + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); + ДескрипторыБенчмарков.Добавить(ДескрипторБенчмарка); + + Возврат ДескрипторыБенчмарков; + +КонецФункции + +Процедура ПроверитьИсключениеЗапуска(ИсточникБенчмарков, Конфигурация, ТекстИсключения) + + ПараметрыМетода = Новый Массив(); + ПараметрыМетода.Добавить(ИсточникБенчмарков); + ПараметрыМетода.Добавить(Конфигурация); + + Ожидаем + .Что(Бенчмаркинг) + .Метод("Запустить", ПараметрыМетода) + .ВыбрасываетИсключение(ТекстИсключения); + +КонецПроцедуры + +#КонецОбласти 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> должен быть экспортной процедурой с единственным параметром <Контекст>.", + ИмяОбработчика + )); КонецПроцедуры 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" + +#Область Тесты + +&Тест +Процедура ТестДолжен_РазобратьИмяМетодаОбъекта() Экспорт + + // Подготовка + Объект = Новый Структура("Имя", "Владелец"); + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("МетодОбъекта", Объект); + + // Действие + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + // Проверка + Ожидаем.Что(ОписаниеМетода.Владелец).Равно(Объект); + Ожидаем.Что(ОписаниеМетода.ИмяМетода).Равно("МетодОбъекта"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьИмяМетодаМодуля() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода( + "МодульСИсточникамиПараметров.ПолучитьЧисловыеЗначения" + ); + + // Действие + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + // Проверка + Ожидаем.Что(ТипЗнч(ОписаниеМетода.Владелец)).ИмеетТип("Сценарий"); + Ожидаем.Что(ОписаниеМетода.ИмяМетода).Равно("ПолучитьЧисловыеЗначения"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьИмяМетодаТипа() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("ПустойБенчмарк.Бенчмарк"); + + // Действие + ОписаниеМетода = РазборИмениМетода.Разобрать(); + + // Проверка + Ожидаем.Что(ОписаниеМетода.Владелец).ИмеетТип("ПустойБенчмарк"); + Ожидаем.Что(ОписаниеМетода.ИмяМетода).Равно("Бенчмарк"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеЕслиДляМетодаОбъектаНеПереданОбъект() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("МетодОбъекта"); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение("Для разбора метода <МетодОбъекта> не указан объект-владелец"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеНаНекорректномКвалифицированномИмени() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("Модуль.Объект.Метод"); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение( + "Квалифицированное имя метода <Модуль.Объект.Метод> задано некорректно" + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗапретитьНебезопасноеИмяМодуля() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода( + "Сообщить(""Произвольный код"").Метод" + ); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение("Имя модуля <Сообщить(""Произвольный код"")> задано некорректно."); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыброситьИсключениеЕслиИмяМодуляУказываетНеНаСценарий() Экспорт + + // Подготовка + РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода("Истина.Метод"); + + // Действие и Проверка + Ожидаем + .Что(РазборИмениМетода) + .Метод("Разобрать") + .ВыбрасываетИсключение("Модуль <Истина> не является сценарием"); + +КонецПроцедуры + +#КонецОбласти