From 6b33c3e7f3bbc5f631cc7965adb14f7179f2c234 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 25 Oct 2026 20:06:41 +0300 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=B9=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Разрешать входные файлы один раз и собирать их oscript.cfg перед повторным запуском команды. - Извлекать #Использовать и #Use из сценариев, нормализовать относительные пути и сохранять условные директивы. - Предварительно загружать зависимости каждого файла до основной точки входа, чтобы ошибка одной библиотеки не останавливала остальные бенчмарки. - Сохранять директивы при оборачивании обычных алгоритмов и запуске дочернего процесса измерения. - Добавить точечные тесты порядка загрузки, путевых зависимостей, условных блоков, ошибок отдельных файлов и совместимости с OneScript 1.9.4. --- ...20\277\321\203\321\201\320\272\320\260.os" | 23 +- ...0\260\321\206\320\270\320\270OneScript.os" | 11 +- ...0\265\320\275\320\270\321\217OneScript.os" | 131 ++++++-- ...20\260\321\200\320\272\320\276\320\262.os" | 78 +++++ ...21\201\321\202\320\265\320\274\321\213.os" | 20 ++ ...20\274\320\260\321\200\320\272\320\260.os" | 224 +++++++++++++ ...20\274\320\260\321\200\320\272\320\260.os" | 75 +---- ...20\274\320\260\321\200\320\272\320\260.os" | 17 +- ...0\260\321\206\320\270\320\270OneScript.os" | 59 +++- ...0\265\320\275\320\270\321\217OneScript.os" | 244 +++++++++++++- ...20\260\321\200\320\272\320\276\320\262.os" | 304 ++++++++++++++++++ ...20\274\320\260\321\200\320\272\320\260.os" | 132 +++++++- ...20\274\320\260\321\200\320\272\320\260.os" | 67 +++- 13 files changed, 1247 insertions(+), 138 deletions(-) create mode 100644 "src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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" create mode 100644 "src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" create mode 100644 "tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" index 5c432d20..149153c0 100644 --- "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" @@ -113,15 +113,20 @@ &ВыполнениеКоманды Процедура Запустить() Экспорт - ЛокаторФайловКонфигурации = Новый ЛокаторФайловКонфигурацииOneScript(); - Перезапускатель = Новый ПерезапускательПриложенияOneScript(); - - ФайлыКонфигурацииOneScript = ЛокаторФайловКонфигурации.НайтиФайлыКонфигурации(_МассивФайлов, _Рекурсивно); - КодВозврата = Перезапускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); - - Если КодВозврата <> Неопределено Тогда - ЗавершитьРаботу(КодВозврата); - Возврат; + Если ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED") <> "1" Тогда + Перезапускатель = Новый ПерезапускательПриложенияOneScript(); + ПодготовительОкружения = Новый ПодготовительОкруженияЗапускаБенчмарков(_МассивФайлов, _Рекурсивно); + ОкружениеЗапуска = ПодготовительОкружения.Подготовить(); + + КодВозврата = Перезапускатель.ПерезапуститьСОкружениемOneScript( + ОкружениеЗапуска.ФайлыКонфигурацииOneScript, + ОкружениеЗапуска.ДирективыИспользованияБенчмарков + ); + + Если КодВозврата <> Неопределено Тогда + ЗавершитьРаботу(КодВозврата); + Возврат; + КонецЕсли; КонецЕсли; Настройки = ПрочитатьНастройки(); diff --git "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" index c5a1d500..b9f9bf01 100644 --- "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" @@ -2,23 +2,18 @@ #Область ПрограммныйИнтерфейс -// Находит файлы конфигурации OneScript для переданных файлов и каталогов бенчмарков. -// Каждый файл возвращается один раз в порядке первого появления. Порядок определяется -// порядком элементов МассивФайлов и нормализованными полными путями файлов внутри каталога. +// Находит файлы конфигурации OneScript в разрешенных входах бенчмарков. // // Параметры: -// МассивФайлов - Массив из Строка - Пути к файлам и каталогам бенчмарков -// Рекурсивно - Булево - Искать файлы бенчмарков во вложенных каталогах +// РазрешенныеВходы - Массив из Структура - Результат разрешения входных файлов бенчмарков // // Возвращаемое значение: // Массив из Строка - Уникальные нормализованные полные пути к файлам oscript.cfg // в порядке первого появления -Функция НайтиФайлыКонфигурации(МассивФайлов, Рекурсивно = Ложь) Экспорт +Функция НайтиФайлыКонфигурации(РазрешенныеВходы) Экспорт ФайлыКонфигурации = Новый Массив(); ДобавленныеФайлы = Новый Соответствие(); - РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков(); - РазрешенныеВходы = РазрешательВходныхФайлов.Разрешить(МассивФайлов, Рекурсивно); Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл diff --git "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" index aa45e4fc..b9ec1548 100644 --- "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" @@ -2,7 +2,7 @@ #Область ОбработчикиСобытий -// Инициализирует перезапускатель приложения с конфигурациями OneScript. +// Инициализирует перезапускатель приложения с окружением OneScript. // Точка входа определяется по расположению сценария класса при подготовке повторного запуска. Процедура ПриСозданииОбъекта() @@ -14,26 +14,31 @@ #Область ПрограммныйИнтерфейс -// Перезапускает приложение с указанными файлами конфигурации OneScript. +// Перезапускает приложение с указанными файлами конфигурации и директивами OneScript. // // Параметры: // ФайлыКонфигурацииOneScript - Массив из Строка - Пути к файлам oscript.cfg -// в порядке убывания приоритета +// в порядке убывания приоритета +// ДирективыИспользованияБенчмарков - Массив из Массив из Строка, Неопределено - Директивы +// использования, сгруппированные по файлам бенчмарков // // Возвращаемое значение: // Число, Неопределено - Код возврата дочернего процесса или Неопределено, -// если повторный запуск не требуется -Функция ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript) Экспорт +// если повторный запуск не требуется +Функция ПерезапуститьСОкружениемOneScript( + ФайлыКонфигурацииOneScript, + ДирективыИспользованияБенчмарков = Неопределено +) Экспорт Если ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED") = "1" Тогда Возврат Неопределено; КонецЕсли; - Если Не ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript) Тогда + Если Не ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков) Тогда Возврат Неопределено; КонецЕсли; - Возврат ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + Возврат ЗапуститьСОкружением(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков); КонецФункции @@ -41,35 +46,125 @@ #Область СлужебныеПроцедурыИФункции -Функция ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript) +Функция ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков) Если ФайлыКонфигурацииOneScript.Количество() > 0 Тогда Возврат Истина; КонецЕсли; + Если ДирективыИспользованияБенчмарков <> Неопределено + И ДирективыИспользованияБенчмарков.Количество() > 0 Тогда + Возврат Истина; + КонецЕсли; + ТекущаяКонфигурация = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "oscript.cfg")); Возврат ТекущаяКонфигурация.Существует() И ТекущаяКонфигурация.ЭтоФайл(); КонецФункции -Функция ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript) +Функция ЗапуститьСОкружением(ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков) - ПутьКТочкеВхода = ПутьКТочкеВходаПриложения(); - МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ФайлыКонфигурацииOneScript); - ПараметрыКонфигурацииOneScript = ПараметрыКонфигурацииДляПеременнойСреды(МенеджерПараметров.Прочитать()); + ПутьКТочкеВхода = ПодготовитьТочкуВхода(ДирективыИспользованияБенчмарков); - Процесс = СоздатьИЗапуститьПроцесс( - ПутьКТочкеВхода, - ТекущийКаталог(), - ПараметрыКонфигурацииOneScript - ); + Попытка + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ФайлыКонфигурацииOneScript); + ПараметрыКонфигурацииOneScript = ПараметрыКонфигурацииДляПеременнойСреды(МенеджерПараметров.Прочитать()); + + Если ЭтоВременнаяТочкаВхода(ПутьКТочкеВхода) Тогда + МенеджерПараметров.ЗаписатьВКаталог(Новый Файл(ПутьКТочкеВхода).Путь); + КонецЕсли; + + Процесс = СоздатьИЗапуститьПроцесс( + ПутьКТочкеВхода, + ТекущийКаталог(), + ПараметрыКонфигурацииOneScript + ); + + ОжидатьЗавершениеПроцесса(Процесс); + Исключение + УдалитьВременнуюТочкуВхода(ПутьКТочкеВхода); + ВызватьИсключение; + КонецПопытки; - ОжидатьЗавершениеПроцесса(Процесс); + УдалитьВременнуюТочкуВхода(ПутьКТочкеВхода); Возврат Процесс.КодВозврата; КонецФункции +Функция ПодготовитьТочкуВхода(ДирективыИспользованияБенчмарков) + + ПутьКОсновнойТочкеВхода = ПутьКТочкеВходаПриложения(); + Если ДирективыИспользованияБенчмарков = Неопределено + Или ДирективыИспользованияБенчмарков.Количество() = 0 Тогда + Возврат ПутьКОсновнойТочкеВхода; + КонецЕсли; + + СтрокиСценария = Новый Массив(); + КаталогВременнойТочкиВхода = ПолучитьИмяВременногоФайла("benchos-точка-входа"); + СоздатьКаталог(КаталогВременнойТочкиВхода); + ПутьКВременнойТочкеВхода = ОбъединитьПути(КаталогВременнойТочкиВхода, "ТочкаВхода.os"); + + Попытка + НомерНабора = 0; + Для Каждого ДирективыФайла Из ДирективыИспользованияБенчмарков Цикл + НомерНабора = НомерНабора + 1; + ПутьКСценариюЗависимостей = ОбъединитьПути( + КаталогВременнойТочкиВхода, + "Зависимости" + Строка(НомерНабора) + ".os" + ); + ЗаписатьСценарий(ПутьКСценариюЗависимостей, ДирективыФайла); + + СтрокиСценария.Добавить(СтрШаблон( + "Попытка + | ЗагрузитьСценарий(""%1""); + |Исключение + |КонецПопытки;", + ЭкранироватьКавычки(ПутьКСценариюЗависимостей) + )); + КонецЦикла; + + СтрокиСценария.Добавить( + "ЗагрузитьСценарий(""" + ЭкранироватьКавычки(ПутьКОсновнойТочкеВхода) + """);"); + ЗаписатьСценарий(ПутьКВременнойТочкеВхода, СтрокиСценария); + Исключение + УдалитьФайлы(КаталогВременнойТочкиВхода); + ВызватьИсключение; + КонецПопытки; + + Возврат ПутьКВременнойТочкеВхода; + +КонецФункции + +Процедура ЗаписатьСценарий(ПутьКФайлу, СтрокиСценария) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(СтрСоединить(СтрокиСценария, Символы.ПС)); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +Процедура УдалитьВременнуюТочкуВхода(ПутьКТочкеВхода) + + Если ЭтоВременнаяТочкаВхода(ПутьКТочкеВхода) Тогда + УдалитьФайлы(Новый Файл(ПутьКТочкеВхода).Путь); + КонецЕсли; + +КонецПроцедуры + +Функция ЭтоВременнаяТочкаВхода(ПутьКТочкеВхода) + + Возврат ПутьКТочкеВхода <> ПутьКТочкеВходаПриложения(); + +КонецФункции + +Функция ЭкранироватьКавычки(Значение) + + Кавычка = """"; + Возврат СтрЗаменить(Значение, Кавычка, Кавычка + Кавычка); + +КонецФункции + Функция ПутьКТочкеВходаПриложения() Если _ПутьКТочкеВходаПриложения <> Неопределено Тогда diff --git "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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 00000000..20be0098 --- /dev/null +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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,78 @@ +Перем _ВходныеПути; // Массив из Строка +Перем _Рекурсивно; // Булево + +#Область ОбработчикиСобытий + +// Инициализирует подготовитель окружения запуска бенчмарков. +// +// Параметры: +// ВходныеПути - Массив из Строка - Пути к бенчмаркам и каталогам бенчмарков +// Рекурсивно - Булево - Искать бенчмарки во вложенных каталогах +Процедура ПриСозданииОбъекта(ВходныеПути, Рекурсивно = Ложь) + + _ВходныеПути = ВходныеПути; + _Рекурсивно = Рекурсивно; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Подготавливает настройки окружения OneScript для запуска бенчмарков. +// +// Возвращаемое значение: +// Структура - Свойства: +// * ФайлыКонфигурацииOneScript - Массив из Строка - Пути к файлам oscript.cfg +// * ДирективыИспользованияБенчмарков - Массив из Массив из Строка - Директивы по файлам бенчмарков +Функция Подготовить() Экспорт + + РазрешенныеВходы = РазрешитьВходныеФайлыБенчмарков(); + ЛокаторФайловКонфигурации = Новый ЛокаторФайловКонфигурацииOneScript(); + + Возврат Новый Структура( + "ФайлыКонфигурацииOneScript, ДирективыИспользованияБенчмарков", + ЛокаторФайловКонфигурации.НайтиФайлыКонфигурации(РазрешенныеВходы), + ДирективыИспользованияБенчмарков(РазрешенныеВходы) + ); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция РазрешитьВходныеФайлыБенчмарков() + + РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков(); + Возврат РазрешательВходныхФайлов.Разрешить(_ВходныеПути, _Рекурсивно); + +КонецФункции + +Функция ДирективыИспользованияБенчмарков(РазрешенныеВходы) + + НаборыДиректив = Новый Массив(); + Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл + Если Не РазрешенныйВход.Разрешен Тогда + Продолжить; + КонецЕсли; + + Для Каждого ПутьКФайлу Из РазрешенныйВход.Файлы Цикл + АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлу); + Если РазрешенныйВход.ВходнойКаталог <> Неопределено + И Не АнализаторСценария.СодержитБенчмарки() Тогда + Продолжить; + КонецЕсли; + + ДирективыФайла = АнализаторСценария.ДирективыИспользования(); + Если ДирективыФайла.Количество() > 0 Тогда + НаборыДиректив.Добавить(ДирективыФайла); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат НаборыДиректив; + +КонецФункции + +#КонецОбласти diff --git "a/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\321\203\321\202\321\217\320\274\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\271\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" "b/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\321\203\321\202\321\217\320\274\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\271\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" index 53f08eac..5768a647 100644 --- "a/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\321\203\321\202\321\217\320\274\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\271\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" +++ "b/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\321\203\321\202\321\217\320\274\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\271\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" @@ -43,6 +43,26 @@ КонецЕсли; КонецФункции +// Проверяет, что путь задан явно: является абсолютным, относительным +// или содержит разделитель каталогов. +// +// Параметры: +// Путь - Строка - Проверяемый путь +// +// Возвращаемое значение: +// Булево - Истина, если значение является явным путём +Функция ЭтоЯвныйПуть(Путь) Экспорт + + Возврат ЭтоАбсолютныйПуть(Путь) + Или СтрНачинаетсяС(Путь, "./") + Или СтрНачинаетсяС(Путь, ".\") + Или СтрНачинаетсяС(Путь, "../") + Или СтрНачинаетсяС(Путь, "..\") + Или СтрНайти(Путь, "/") > 0 + Или СтрНайти(Путь, "\") > 0; + +КонецФункции + Функция ЭтоАбсолютныйПутьUnix(Знач Путь) Экспорт Путь = СокрЛП(Путь); Возврат Лев(Путь, 1) = "/"; diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" new file mode 100644 index 00000000..172d1ed8 --- /dev/null +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -0,0 +1,224 @@ +#Использовать fs + +Перем _ПутьКФайлу; // Строка +Перем _СодержимоеФайла; // Строка, Неопределено +Перем _РегуляркаДирективыИспользования; // РегулярноеВыражение +Перем _РегуляркаАргументаДирективыИспользования; // РегулярноеВыражение +Перем _РегуляркаДирективыОбласти; // РегулярноеВыражение +Перем _РегуляркаУсловнойДирективы; // РегулярноеВыражение +Перем _РегуляркаРежимаКомпиляции; // РегулярноеВыражение + +#Область ОбработчикиСобытий + +// Инициализирует анализатор входного сценария бенчмарка. +// +// Параметры: +// ПутьКФайлу - Строка - Полный путь к файлу сценария +Процедура ПриСозданииОбъекта(ПутьКФайлу) + + _ПутьКФайлу = ПутьКФайлу; + _СодержимоеФайла = Неопределено; + + _РегуляркаДирективыИспользования = Новый РегулярноеВыражение( + "^\s*#(?:Использовать|Use)(?:\s|$)" + ); + _РегуляркаДирективыИспользования.ИгнорироватьРегистр = Истина; + + _РегуляркаАргументаДирективыИспользования = Новый РегулярноеВыражение( + "^\s*#(?:Использовать|Use)\s+(?:""([^""]+)""|(\S+))" + ); + _РегуляркаАргументаДирективыИспользования.ИгнорироватьРегистр = Истина; + + _РегуляркаДирективыОбласти = Новый РегулярноеВыражение( + "^\s*#(?:Область|КонецОбласти)(?:\s|$)" + ); + _РегуляркаДирективыОбласти.ИгнорироватьРегистр = Истина; + + _РегуляркаУсловнойДирективы = Новый РегулярноеВыражение( + "^\s*#(?:Если|ИначеЕсли|Иначе|КонецЕсли|If|ElseIf|Else|EndIf)(?:\s|$)" + ); + _РегуляркаУсловнойДирективы.ИгнорироватьРегистр = Истина; + + _РегуляркаРежимаКомпиляции = Новый РегулярноеВыражение("^\s*#(?:native|stack)(?:\s|$)"); + _РегуляркаРежимаКомпиляции.ИгнорироватьРегистр = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Возвращает директивы #Использовать и #Use из сценария вместе с их условиями. +// Путевые аргументы заменяются абсолютными путями, именованные остаются без изменений. +// +// Возвращаемое значение: +// Массив из Строка - Директивы использования и их условия в порядке объявления +Функция ДирективыИспользования() Экспорт + + Возврат РазобратьДирективыИспользования(); + +КонецФункции + +// Возвращает части алгоритма, из которого можно сформировать бенчмарк. +// +// Возвращаемое значение: +// Структура - Свойства: +// * ИмяФайла - Строка - Имя исходного файла без расширения +// * Преамбула - Массив из Строка - Строки преамбулы сценария +// * ТелоАлгоритма - Массив из Строка - Остальной текст сценария +Функция ОписаниеАлгоритма() Экспорт + + Преамбула = Новый Массив(); + ТелоАлгоритма = Новый Массив(); + ТелоМодуляНачалось = Ложь; + + Для Каждого СтрокаФайла Из СтрокиСценария() Цикл + СтрокаБезОтступов = СокрЛП(СтрокаФайла); + + Если ЭтоДирективаИспользования(СтрокаБезОтступов) Тогда + Продолжить; + КонецЕсли; + + Если _РегуляркаРежимаКомпиляции.Совпадает(СтрокаБезОтступов) Тогда + Преамбула.Добавить(СтрокаФайла); + Продолжить; + КонецЕсли; + + Если Не ТелоМодуляНачалось И (ПустаяСтрока(СтрокаБезОтступов) + Или СтрНачинаетсяС(СтрокаБезОтступов, "//") + Или ЭтоДирективаОбласти(СтрокаБезОтступов)) Тогда + Преамбула.Добавить(СтрокаФайла); + Продолжить; + КонецЕсли; + + ТелоМодуляНачалось = Истина; + ТелоАлгоритма.Добавить(СтрокаФайла); + КонецЦикла; + + Для Каждого Директива Из РазобратьДирективыИспользования() Цикл + Преамбула.Добавить(Директива); + КонецЦикла; + + ИмяФайла = Новый Файл(_ПутьКФайлу).ИмяБезРасширения; + Возврат Новый Структура("ИмяФайла, Преамбула, ТелоАлгоритма", ИмяФайла, Преамбула, ТелоАлгоритма); + +КонецФункции + +// Проверяет, содержит ли сценарий аннотацию бенчмарка. +// +// Возвращаемое значение: +// Булево - Истина, если в сценарии найдена аннотация &Бенчмарк +Функция СодержитБенчмарки() Экспорт + + Для Каждого СтрокаФайла Из СтрокиСценария() Цикл + Если СтрНачинаетсяС(НРег(СокрЛП(СтрокаФайла)), "&бенчмарк") Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция РазобратьДирективыИспользования() + + Директивы = Новый Массив(); + ЕстьИспользование = Ложь; + Для Каждого СтрокаФайла Из СтрокиСценария() Цикл + СтрокаБезОтступов = СокрЛП(СтрокаФайла); + + Если _РегуляркаУсловнойДирективы.Совпадает(СтрокаБезОтступов) Тогда + Директивы.Добавить(СтрокаБезОтступов); + Продолжить; + КонецЕсли; + + Если Не ЭтоДирективаИспользования(СтрокаБезОтступов) Тогда + Продолжить; + КонецЕсли; + + Аргумент = АргументДирективыИспользования(СтрокаБезОтступов); + Если Аргумент = Неопределено Тогда + Прервать; + КонецЕсли; + + Директивы.Добавить(НормализоватьДирективуИспользования(СтрокаБезОтступов)); + ЕстьИспользование = Истина; + КонецЦикла; + + Возврат ?(ЕстьИспользование, Директивы, Новый Массив()); + +КонецФункции + +Функция ЭтоДирективаИспользования(Строка) + + Возврат _РегуляркаДирективыИспользования.Совпадает(Строка); + +КонецФункции + +Функция НормализоватьДирективуИспользования(СтрокаИспользования) + + Если Не ЭтоДирективаИспользования(СтрокаИспользования) Тогда + Возврат СтрокаИспользования; + КонецЕсли; + + Аргумент = АргументДирективыИспользования(СтрокаИспользования); + Если Аргумент = Неопределено Тогда + Возврат СтрокаИспользования; + КонецЕсли; + + Если Не Аргумент.ВКавычках И Не РаботаСПутямиФайловойСистемы.ЭтоЯвныйПуть(Аргумент.Значение) Тогда + Возврат СтрокаИспользования; + КонецЕсли; + + КаталогСценария = Новый Файл(_ПутьКФайлу).Путь; + ПолныйПуть = РаботаСПутямиФайловойСистемы.ПолучитьАбсолютныйПуть(Аргумент.Значение, КаталогСценария); + + Возврат "#Использовать """ + ЭкранироватьКавычки(ПолныйПуть) + """"; + +КонецФункции + +Функция СтрокиСценария() + + Если _СодержимоеФайла = Неопределено Тогда + ЧтениеТекста = Новый ЧтениеТекста(_ПутьКФайлу, КодировкаТекста.UTF8); + _СодержимоеФайла = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + КонецЕсли; + + Возврат СтрРазделить(_СодержимоеФайла, Символы.ПС, Ложь); + +КонецФункции + +Функция АргументДирективыИспользования(СтрокаИспользования) + + Совпадения = _РегуляркаАргументаДирективыИспользования.НайтиСовпадения(СтрокаИспользования); + Если Совпадения.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ПутьВКавычках = Совпадения[0].Группы[1].Значение; + ВКавычках = ЗначениеЗаполнено(ПутьВКавычках); + Значение = ?(ВКавычках, ПутьВКавычках, Совпадения[0].Группы[2].Значение); + + Возврат Новый Структура("Значение, ВКавычках", Значение, ВКавычках); + +КонецФункции + +Функция ЭтоДирективаОбласти(Строка) + + Возврат _РегуляркаДирективыОбласти.Совпадает(Строка); + +КонецФункции + +Функция ЭкранироватьКавычки(Значение) + + Кавычка = """"; + Возврат СтрЗаменить(Значение, Кавычка, Кавычка + Кавычка); + +КонецФункции + +#КонецОбласти diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 613db47f..fa6eb259 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -43,12 +43,12 @@ // Строка - Путь к исходному или временному файлу Функция Подготовить(ПутьКФайлу) Экспорт - СодержимоеФайла = ПрочитатьФайл(ПутьКФайлу); - Если ЕстьАннотацияБенчмарка(СодержимоеФайла) Тогда + АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлу); + Если АнализаторСценария.СодержитБенчмарки() Тогда Возврат ПутьКФайлу; КонецЕсли; - ОписаниеАлгоритма = ОписаниеАлгоритмаИзФайла(ПутьКФайлу, СодержимоеФайла); + ОписаниеАлгоритма = АнализаторСценария.ОписаниеАлгоритма(); ПутьКВременномуФайлу = СоздатьВременныйФайлБенчмарка(ОписаниеАлгоритма, ПутьКФайлу); _Лог.Отладка("Создан временный файл <%1> для запуска алгоритма из <%2>", ПутьКВременномуФайлу, ПутьКФайлу); @@ -66,7 +66,8 @@ // Булево - Истина, если в файле найден хотя бы один бенчмарк Функция СодержитБенчмарки(ПутьКФайлу) Экспорт - Возврат ЕстьАннотацияБенчмарка(ПрочитатьФайл(ПутьКФайлу)); + АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлу); + Возврат АнализаторСценария.СодержитБенчмарки(); КонецФункции @@ -84,16 +85,6 @@ #Область СлужебныеПроцедурыИФункции -Функция ПрочитатьФайл(ПутьКФайлу) - - ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8); - СодержимоеФайла = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); - - Возврат СодержимоеФайла; - -КонецФункции - Процедура ЗаписатьФайл(ПутьКФайлу, СодержимоеФайла) ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); @@ -102,44 +93,6 @@ КонецПроцедуры -Функция ЕстьАннотацияБенчмарка(СодержимоеФайла) - - Для Каждого СтрокаФайла Из СтрРазделить(СодержимоеФайла, Символы.ПС, Ложь) Цикл - Если СтрНачинаетсяС(НРег(СокрЛП(СтрокаФайла)), "&бенчмарк") Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Функция ОписаниеАлгоритмаИзФайла(ПутьКФайлу, СодержимоеФайла) - - Преамбула = Новый Массив(); - ТелоАлгоритма = Новый Массив(); - ТелоМодуляНачалось = Ложь; - - Для Каждого СтрокаФайла Из СтрРазделить(СодержимоеФайла, Символы.ПС, Ложь) Цикл - - СтрокаБезОтступов = СокрЛП(СтрокаФайла); - - Если Не ТелоМодуляНачалось И ЭтоСтрокаПреамбулы(СтрокаБезОтступов) Тогда - Преамбула.Добавить(СтрокаФайла); - Продолжить; - КонецЕсли; - - ТелоМодуляНачалось = Истина; - ТелоАлгоритма.Добавить(СтрокаФайла); - - КонецЦикла; - - ИмяФайла = Новый Файл(ПутьКФайлу).ИмяБезРасширения; - - Возврат Новый Структура("ИмяФайла, Преамбула, ТелоАлгоритма", ИмяФайла, Преамбула, ТелоАлгоритма); - -КонецФункции - Функция СоздатьВременныйФайлБенчмарка(ОписаниеАлгоритма, ПутьКИсходномуФайлу) Каталог = _МенеджерВременныхФайлов.СоздатьКаталог(); @@ -202,22 +155,4 @@ КонецФункции -Функция ЭтоСтрокаПреамбулы(СтрокаБезОтступов) - - Если Не ЗначениеЗаполнено(СтрокаБезОтступов) Тогда - Возврат Истина; - КонецЕсли; - - Если СтрНачинаетсяС(СтрокаБезОтступов, "#Использовать") Тогда - Возврат Истина; - КонецЕсли; - - Если СтрНачинаетсяС(СтрокаБезОтступов, "//") Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - #КонецОбласти diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" index dc38577b..7832ccce 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" @@ -58,11 +58,14 @@ Функция ТекстСценария(ПутьФайлаНастроекЗапуска) - ПутьКБиблиотеке = ФС.НормализоватьПуть(ОбъединитьПути(ТекущийСценарий().Каталог, "../../../../..")); + ПутьКБиблиотеке = ФС.НормализоватьПуть(ОбъединитьПути(ТекущийСценарий().Каталог, "../../../../..")); ПутьКФайлуБенчмарка = ПутьКФайлуБенчмарка(); - ИмяТипаБенчмарка = Строка(ТипКлассаБенчмарка()); + ИмяТипаБенчмарка = Строка(ТипКлассаБенчмарка()); + ТекстДирективИспользования = ТекстДирективИспользованияБенчмарка(ПутьКФайлуБенчмарка); - ТекстСценария = " + ТекстСценария = ТекстДирективИспользования + + ?(ПустаяСтрока(ТекстДирективИспользования), "", Символы.ПС) + + " |#Использовать """ + ПутьКБиблиотеке + """ | |УстановитьПеременнуюСреды(""BENCHOS_IS_CHILD_PROCESS"", 1); @@ -127,6 +130,14 @@ Возврат Новый РасширениеТипа(ТипКлассаБенчмарка()).Источник; КонецФункции +Функция ТекстДирективИспользованияБенчмарка(ПутьКФайлуБенчмарка) + + АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлуБенчмарка); + Директивы = АнализаторСценария.ДирективыИспользования(); + Возврат СтрСоединить(Директивы, Символы.ПС); + +КонецФункции + Функция ТипКлассаБенчмарка() Возврат _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); КонецФункции diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\260\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\260\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" index e79aa133..b6121199 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\260\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\233\320\276\320\272\320\260\321\202\320\276\321\200\320\260\320\244\320\260\320\271\320\273\320\276\320\262\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270OneScript.os" @@ -53,7 +53,28 @@ МассивФайлов.Добавить(ПервыйКаталог); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + ФайлыКонфигурации = НайтиФайлыКонфигурации(МассивФайлов); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(2); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(ПервыйКаталог)); + Ожидаем.Что(ФайлыКонфигурации[1]).Равно(ПутьККонфигурации(ВторойКаталог)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НайтиКонфигурацииВРазрешенныхВходах() Экспорт + + // Подготовка + ПервыйКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ВторойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + СоздатьБенчмаркСКонфигурацией(ПервыйКаталог, "ПервыйБенчмарк.os"); + СоздатьБенчмаркСКонфигурацией(ВторойКаталог, "ВторойБенчмарк.os"); + Разрешатель = Новый РазрешательВходныхФайловБенчмарков(); + РазрешенныеВходы = Разрешатель.Разрешить(МассивИзДвухЗначений(ПервыйКаталог, ВторойКаталог)); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(РазрешенныеВходы); // Проверка Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(2); @@ -70,9 +91,7 @@ ЗаписатьТекст(ПутьККонфигурации(Каталог), ""); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации( - МассивИзОдногоЗначения(Каталог) - ); + ФайлыКонфигурации = НайтиФайлыКонфигурации(МассивИзОдногоЗначения(Каталог)); // Проверка Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(1); @@ -100,7 +119,7 @@ МассивФайлов.Добавить(КаталогВВерхнемРегистре); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + ФайлыКонфигурации = НайтиФайлыКонфигурации(МассивФайлов); // Проверка Если ЭтоWindows() Тогда @@ -125,8 +144,8 @@ МассивФайлов = МассивИзОдногоЗначения(КорневойКаталог); // Действие - ФайлыБезРекурсии = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); - ФайлыСРекурсией = _Локатор.НайтиФайлыКонфигурации(МассивФайлов, Истина); + ФайлыБезРекурсии = НайтиФайлыКонфигурации(МассивФайлов); + ФайлыСРекурсией = НайтиФайлыКонфигурации(МассивФайлов, Истина); // Проверка Ожидаем.Что(ФайлыБезРекурсии).ИмеетДлину(0); @@ -146,7 +165,7 @@ СоздатьБенчмаркСКонфигурацией(ВложенныйКаталог, "ВложенныйБенчмарк.os"); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации( + ФайлыКонфигурации = НайтиФайлыКонфигурации( МассивИзОдногоЗначения(КорневойКаталог), Истина ); @@ -174,7 +193,7 @@ СоздатьБенчмаркСКонфигурацией(ПервыйКаталог, "Бенчмарк.os"); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации( + ФайлыКонфигурации = НайтиФайлыКонфигурации( МассивИзОдногоЗначения(КорневойКаталог), Истина ); @@ -198,7 +217,7 @@ ОжидаемыйПутьККонфигурации = ФС.НормализоватьПуть("oscript.cfg"); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + ФайлыКонфигурации = НайтиФайлыКонфигурации(МассивФайлов); // Проверка Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(1); @@ -222,7 +241,7 @@ МассивФайлов.Добавить(ОбъединитьПути(КаталогБенчмарков, "НесуществующийБенчмарк")); // Действие - ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + ФайлыКонфигурации = НайтиФайлыКонфигурации(МассивФайлов); // Проверка Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(0); @@ -233,6 +252,15 @@ #Область СлужебныеПроцедурыИФункции +Функция НайтиФайлыКонфигурации(ВходныеПути, Рекурсивно = Ложь) + + РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков(); + РазрешенныеВходы = РазрешательВходныхФайлов.Разрешить(ВходныеПути, Рекурсивно); + + Возврат _Локатор.НайтиФайлыКонфигурации(РазрешенныеВходы); + +КонецФункции + Процедура СоздатьБенчмаркСКонфигурацией(Каталог, ИмяФайла) ЗаписатьТекст(ОбъединитьПути(Каталог, ИмяФайла), ""); @@ -257,6 +285,15 @@ КонецФункции +Функция МассивИзДвухЗначений(ПервоеЗначение, ВтороеЗначение) + + Результат = МассивИзОдногоЗначения(ПервоеЗначение); + Результат.Добавить(ВтороеЗначение); + + Возврат Результат; + +КонецФункции + Функция ПутьККонфигурации(Каталог) Возврат ФС.НормализоватьПуть(ОбъединитьПути(Каталог, "oscript.cfg")); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" index 06007f42..673b0873 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" @@ -113,7 +113,7 @@ Перезапускатель = Новый ПерезапускательПриложенияOneScript(); // Действие - Результат = Перезапускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + Результат = Перезапускатель.ПерезапуститьСОкружениемOneScript(ФайлыКонфигурацииOneScript); // Проверка Ожидаем.Что(Результат).Равно(Неопределено); @@ -131,7 +131,7 @@ УстановитьТекущийКаталог(КаталогЗапуска); // Действие - Результат = Перезапускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + Результат = Перезапускатель.ПерезапуститьСОкружениемOneScript(ФайлыКонфигурацииOneScript); // Проверка Ожидаем.Что(Результат).Равно(Неопределено); @@ -150,7 +150,7 @@ Перезапускатель = Новый ПерезапускательПриложенияOneScript(); // Действие - Результат = Перезапускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + Результат = Перезапускатель.ПерезапуститьСОкружениемOneScript(ФайлыКонфигурацииOneScript); // Проверка Ожидаем.Что(Результат).Не_().Равно(Неопределено); @@ -158,7 +158,7 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_ОдинРазПерезапуститьRunСКонфигурациямиOneScript() Экспорт +Процедура ТестДолжен_ОдинРазПерезапуститьКомандуЗапускаСКонфигурациямиOneScript() Экспорт // Подготовка КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); @@ -231,6 +231,182 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_ПродолжитьЗапускПослеОшибкиИспользованияВДругомБенчмарке() Экспорт + + // Подготовка + КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогБенчмарков = ОбъединитьПути(КаталогЗапуска, "benchmarks"); + СоздатьКаталог(КаталогБенчмарков); + + ЗаписатьТекст(ОбъединитьПути(КаталогБенчмарков, "Плохой.os"), + "#Use отсутствующаязависимость123456 + |&Бенчмарк + |Процедура Плохой() Экспорт + |КонецПроцедуры"); + ЗаписатьТекст(ОбъединитьПути(КаталогБенчмарков, "Хороший.os"), + "#Use fs + |&Бенчмарк + |Процедура Хороший() Экспорт + |КонецПроцедуры"); + + ПутьКСтартовомуСценарию = ФС.НормализоватьПуть( + ОбъединитьПути(ТекущийКаталог(), "src/BenchmarkOneScript/cmd/main.os")); + + СтрокаКоманды = СтрШаблон( + "%1 %2 run --iterationCount 1 --warmupCount 0 --invocationCount 1 --iterationTime 1 %3", + ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки("oscript"), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки(ПутьКСтартовомуСценарию), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки("benchmarks") + ); + + // Действие + Результат = ТестированиеПроцессов.ВыполнитьКоманду(СтрокаКоманды, КаталогЗапуска); + + // Проверка + Ожидаем.Что(Результат.КодВозврата, Результат.Вывод).Равно(0); + Ожидаем.Что(Результат.Вывод).Содержит("Хороший"); + Ожидаем.Что(Результат.Вывод).Содержит("Не удалось подключить файл бенчмарка"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПерезапуститьКомандуЗапускаДляПутевойЗависимостиБенчмарка() Экспорт + + // Подготовка + КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогПроекта = ФС.НормализоватьПуть(ТекущийКаталог()); + ПутьКСтартовомуСценарию = ФС.НормализоватьПуть( + ОбъединитьПути(КаталогПроекта, "src/BenchmarkOneScript/cmd/main.os") + ); + КаталогБенчмарка = ОбъединитьПути(КаталогЗапуска, "benchmarks"); + КаталогПутевойБиблиотеки = ОбъединитьПути(КаталогБенчмарка, "oscript_modules", "pathdependency"); + КаталогБиблиотекиИзКонфигурации = ОбъединитьПути(КаталогЗапуска, "benchmark_dependencies", "configdependency"); + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + УстановитьПеременнуюСреды("OSLIB_LOADER_TRACE", "1"); + + СоздатьБенчмаркСЛокальнойЗависимостью( + КаталогБенчмарка, + "configdependency", + "ОбщаяЗависимость", + "ПутеваяЗависимость", + 1, + КаталогБенчмарка, + ОбъединитьПути(КаталогЗапуска, "benchmark_dependencies") + ); + СоздатьБенчмаркСЛокальнойЗависимостью( + КаталогБенчмарка, + "pathdependency", + "ОбщаяЗависимость", + "ПутеваяЗависимость", + 2, + _МенеджерВременныхФайлов.СоздатьКаталог(), + ОбъединитьПути(КаталогБенчмарка, "oscript_modules") + ); + ЗаписатьТекст( + ОбъединитьПути(КаталогБенчмарка, "ПутеваяЗависимость.os"), + "#Use configdependency + |#Если Windows Тогда + |#Use ""./oscript_modules/pathdependency"" + |#Иначе + |#Use ""./oscript_modules/pathdependency"" + |#КонецЕсли + | + |&Бенчмарк + |Процедура ПутеваяЗависимость() Экспорт + | Если ОбщаяЗависимость.ПолучитьЗначение() <> 1 Тогда + | ВызватьИсключение ""Путевая зависимость переопределила зависимость из oscript.cfg""; + | КонецЕсли; + |КонецПроцедуры" + ); + ВходныеФайлы = Новый Массив(); + ВходныеФайлы.Добавить(КаталогБенчмарка); + ОкружениеЗапуска = Новый ПодготовительОкруженияЗапускаБенчмарков(ВходныеФайлы).Подготовить(); + Ожидаем.Что(ОкружениеЗапуска.ФайлыКонфигурацииOneScript).ИмеетДлину(1); + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ОкружениеЗапуска.ФайлыКонфигурацииOneScript); + ДополнительныеБиблиотеки = МенеджерПараметров.Прочитать()["lib.additional"]; + Ожидаем.Что(ДополнительныеБиблиотеки).Содержит("benchmark_dependencies"); + Ожидаем.Что(ДополнительныеБиблиотеки).Не_().Содержит(ОбъединитьПути(КаталогБенчмарка, "oscript_modules")); + + СтрокаКоманды = СтрШаблон( + "%1 %2 run --iterationCount 1 --warmupCount 0 --invocationCount 1 --iterationTime 1 %3", + ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки("oscript"), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки(ПутьКСтартовомуСценарию), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки("benchmarks") + ); + + // Действие + Результат = ТестированиеПроцессов.ВыполнитьКоманду(СтрокаКоманды, КаталогЗапуска); + + // Проверка + Ожидаем.Что(Результат.КодВозврата, Результат.Вывод).Равно(0); + ПрефиксЗагрузкиБиблиотеки = "ПриЗагрузкеБиблиотеки "; + ПозицияБиблиотекиИзКонфигурации = СтрНайти( + НРег(Результат.Вывод), + НРег(ПрефиксЗагрузкиБиблиотеки + КаталогБиблиотекиИзКонфигурации) + ); + ПозицияПутевойБиблиотеки = СтрНайти( + НРег(Результат.Вывод), + НРег(ПрефиксЗагрузкиБиблиотеки + КаталогПутевойБиблиотеки) + ); + ПозицияБиблиотекиКоманд = ПозицияВторогоВхождения( + НРег(Результат.Вывод), + НРег( + ПрефиксЗагрузкиБиблиотеки + + ОбъединитьПути(КаталогПроекта, "src", "BenchmarkOneScript", "cmd") + ) + ); + Ожидаем.Что(ПозицияБиблиотекиИзКонфигурации, Результат.Вывод).Больше(0); + Ожидаем.Что(ПозицияПутевойБиблиотеки, Результат.Вывод).Больше(0); + Ожидаем.Что(ПозицияПутевойБиблиотеки, Результат.Вывод).Меньше(ПозицияБиблиотекиКоманд); + Ожидаем.Что( + КоличествоЗагрузокБиблиотеки(Результат.Вывод, "cmd"), + Результат.Вывод + ).Равно(2); + ПутьКРепозиторнойБиблиотекеФС = ОбъединитьПути(КаталогПроекта, "oscript_modules", "fs"); + Ожидаем.Что( + КоличествоВхожденийПодстроки( + НРег(Результат.Вывод), + НРег(ПрефиксЗагрузкиБиблиотеки + ПутьКРепозиторнойБиблиотекеФС) + ), + Результат.Вывод + ).Равно(3); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_УдалитьВременнуюТочкуВходаПриОшибкеПодготовкиОкружения() Экспорт + + // Подготовка + НедопустимыеФайлыКонфигурации = Новый Структура("Файл", "oscript.cfg"); + ДирективыИспользования = Новый Массив(); + ДирективыИспользования.Добавить( + "#Использовать """ + ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "fs") + """" + ); + НаборыДиректив = Новый Массив(); + НаборыДиректив.Добавить(ДирективыИспользования); + ВременныеАртефактыДоЗапуска = НайтиВременныеАртефактыТочкиВхода(); + Перезапускатель = Новый ПерезапускательПриложенияOneScript(); + + // Действие + ВозниклоИсключение = Ложь; + Попытка + Перезапускатель.ПерезапуститьСОкружениемOneScript(НедопустимыеФайлыКонфигурации, НаборыДиректив); + Исключение + ВозниклоИсключение = Истина; + КонецПопытки; + + НовыеВременныеАртефакты = НайтиНовыеВременныеФайлы( + ВременныеАртефактыДоЗапуска, + НайтиВременныеАртефактыТочкиВхода() + ); + + // Проверка + Ожидаем.Что(ВозниклоИсключение).Равно(Истина); + Ожидаем.Что(НовыеВременныеАртефакты).ИмеетДлину(0); + +КонецПроцедуры + &Тест Процедура ТестДолжен_ПереопределитьПараметрыИзНастроекПараметрамиCLI() Экспорт @@ -718,6 +894,49 @@ КонецФункции +Функция НайтиВременныеАртефактыТочкиВхода() + + ВременныеАртефакты = Новый Массив(); + Для Каждого Файл Из НайтиФайлы(КаталогВременныхФайлов(), "*.os", Ложь) Цикл + ВременныеАртефакты.Добавить(Файл.ПолноеИмя); + КонецЦикла; + + Для Каждого Файл Из НайтиФайлы(КаталогВременныхФайлов(), "*.benchos-точка-входа", Ложь) Цикл + ВременныеАртефакты.Добавить(Файл.ПолноеИмя); + КонецЦикла; + + Возврат ВременныеАртефакты; + +КонецФункции + +Функция НайтиНовыеВременныеФайлы(ВременныеФайлыДоЗапуска, ВременныеФайлыПослеЗапуска) + + НовыеФайлы = Новый Массив(); + Для Каждого ПолноеИмяФайла Из ВременныеФайлыПослеЗапуска Цикл + Если ВременныеФайлыДоЗапуска.Найти(ПолноеИмяФайла) = Неопределено Тогда + НовыеФайлы.Добавить(ПолноеИмяФайла); + КонецЕсли; + КонецЦикла; + + Возврат НовыеФайлы; + +КонецФункции + +Функция КоличествоВхожденийПодстроки(Текст, Подстрока) + + КоличествоВхождений = 0; + ПозицияВхождения = СтрНайти(Текст, Подстрока); + + Пока ПозицияВхождения > 0 Цикл + КоличествоВхождений = КоличествоВхождений + 1; + Текст = Сред(Текст, ПозицияВхождения + СтрДлина(Подстрока)); + ПозицияВхождения = СтрНайти(Текст, Подстрока); + КонецЦикла; + + Возврат КоличествоВхождений; + +КонецФункции + Функция КоличествоВхождений(Текст, Подстрока) РегулярноеВыражение = Новый РегулярноеВыражение(Подстрока); @@ -725,6 +944,23 @@ КонецФункции +Функция ПозицияВторогоВхождения(Текст, Подстрока) + + ПозицияПервогоВхождения = СтрНайти(Текст, Подстрока); + Если ПозицияПервогоВхождения = 0 Тогда + Возврат 0; + КонецЕсли; + + НачалоОставшегосяТекста = ПозицияПервогоВхождения + СтрДлина(Подстрока); + ПозицияВОставшемсяТексте = СтрНайти(Сред(Текст, НачалоОставшегосяТекста), Подстрока); + Возврат ?( + ПозицияВОставшемсяТексте = 0, + 0, + НачалоОставшегосяТекста + ПозицияВОставшемсяТексте - 1 + ); + +КонецФункции + Процедура ЗаписатьТекст(ПутьКФайлу, Текст) ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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 00000000..44ed53f0 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217\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,304 @@ +#Использовать asserts +#Использовать fs +#Использовать tempfiles +#Использовать "helpers" +#Использовать "../src/BenchmarkOneScript/cmd" + +Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов + +#Область ОбработчикиСобытий + +&Инициализация +Процедура ПередВсеми() Экспорт + + _МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); + +КонецПроцедуры + +&Завершение +Процедура ПослеВсех() Экспорт + + _МенеджерВременныхФайлов.Удалить(); + +КонецПроцедуры + +#КонецОбласти + +#Область Тесты + +&Тест +Процедура ТестДолжен_ПодготовитьКонфигурациюИДирективыБенчмаркаВИсходномПорядке() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогБиблиотеки = ОбъединитьПути(КаталогБенчмарка, "oscript_modules", "localdependency"); + СоздатьКаталог(КаталогБиблиотеки); + ЗаписатьТекст(ОбъединитьПути(КаталогБенчмарка, "oscript.cfg"), ""); + ЗаписатьТекст( + ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"), + "#Use configdependency + |#Use ""./oscript_modules/localdependency"" + |&Бенчмарк + |Процедура Замер() Экспорт + |КонецПроцедуры" + ); + Подготовитель = Новый ПодготовительОкруженияЗапускаБенчмарков( + МассивИзОдногоЗначения(КаталогБенчмарка) + ); + + // Действие + Окружение = Подготовитель.Подготовить(); + + // Проверка + Ожидаем.Что(Окружение.ФайлыКонфигурацииOneScript).ИмеетДлину(1); + Ожидаем.Что(Окружение.ФайлыКонфигурацииOneScript[0]).Равно( + ФС.НормализоватьПуть(ОбъединитьПути(КаталогБенчмарка, "oscript.cfg")) + ); + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков).ИмеетДлину(1); + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков[0]).ИмеетДлину(2); + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков[0][0]).Равно("#Use configdependency"); + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков[0][1]).Равно( + "#Использовать """ + ФС.НормализоватьПуть(КаталогБиблиотеки) + """" + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РаспознатьПутевуюДирективуВСмешанномРегистре() Экспорт + + // Действие и Проверка + ПроверитьЕдинственнуюДирективуИспользования("#uSe ""./oscript_modules/localdependency"""); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РаспознатьПутевуюДирективуБезКавычек() Экспорт + + // Действие и Проверка + ПроверитьЕдинственнуюДирективуИспользования("#Use ./oscript_modules/localdependency"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПродолжитьРазборПослеОбластиВПреамбуле() Экспорт + + // Действие и Проверка + ПроверитьЕдинственнуюДирективуИспользования( + "#Область ПодключениеЗависимостей + |#КонецОбласти + |#Use ""./oscript_modules/localdependency""" + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьИмяПакетаПриОдноименномКаталоге() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + СоздатьКаталог(ОбъединитьПути(КаталогБенчмарка, "fs")); + ПутьКБенчмарку = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКБенчмарку, "#Use fs"); + Анализатор = Новый АнализаторСценарияБенчмарка(ПутьКБенчмарку); + + // Действие + Директивы = Анализатор.ДирективыИспользования(); + + // Проверка + Ожидаем.Что(Директивы).ИмеетДлину(1); + Ожидаем.Что(Директивы[0]).Равно("#Use fs"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазрешитьПутьВКавычкахБезРазделителя() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКЛокальнойБиблиотеке = ОбъединитьПути(КаталогБенчмарка, "helpers"); + СоздатьКаталог(ПутьКЛокальнойБиблиотеке); + ПутьКБенчмарку = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКБенчмарку, "#Use ""helpers"""); + Анализатор = Новый АнализаторСценарияБенчмарка(ПутьКБенчмарку); + + // Действие + Директивы = Анализатор.ДирективыИспользования(); + + // Проверка + Ожидаем.Что(Директивы).ИмеетДлину(1); + Ожидаем.Что(Директивы[0]).Равно( + "#Использовать """ + ФС.НормализоватьПуть(ПутьКЛокальнойБиблиотеке) + """" + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьУсловиеДляДирективыИспользования() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКБенчмарку = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКБенчмарку, "#Если Windows Тогда + |#Use ""./dependency"" + |#КонецЕсли + |&Бенчмарк"); + Анализатор = Новый АнализаторСценарияБенчмарка(ПутьКБенчмарку); + + // Действие + Директивы = Анализатор.ДирективыИспользования(); + + // Проверка + Ожидаем.Что(Директивы).ИмеетДлину(3); + Ожидаем.Что(Директивы[0]).Равно("#Если Windows Тогда"); + Ожидаем.Что(Директивы[1]).Равно( + "#Использовать """ + ФС.НормализоватьПуть(ОбъединитьПути(КаталогБенчмарка, "dependency")) + """" + ); + Ожидаем.Что(Директивы[2]).Равно("#КонецЕсли"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗакрытьУсловиеОхватывающееБенчмарк() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКБенчмарку = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКБенчмарку, "#Если Windows Тогда + |#Use fs + |&Бенчмарк + |Процедура Замер() Экспорт + |КонецПроцедуры + |#КонецЕсли"); + Анализатор = Новый АнализаторСценарияБенчмарка(ПутьКБенчмарку); + + // Действие + Директивы = Анализатор.ДирективыИспользования(); + + // Проверка + Ожидаем.Что(Директивы).ИмеетДлину(3); + Ожидаем.Что(Директивы[0]).Равно("#Если Windows Тогда"); + Ожидаем.Что(Директивы[1]).Равно("#Use fs"); + Ожидаем.Что(Директивы[2]).Равно("#КонецЕсли"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПропуститьУсловиеБезДирективИспользования() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКБенчмарку = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКБенчмарку, "#Если Windows Тогда + |А = 1; + |#КонецЕсли"); + Анализатор = Новый АнализаторСценарияБенчмарка(ПутьКБенчмарку); + + // Действие + Директивы = Анализатор.ДирективыИспользования(); + + // Проверка + Ожидаем.Что(Директивы).ИмеетДлину(0); + +КонецПроцедуры + +&Тест +&Параметры("#native") +&Параметры("#stack") +Процедура ТестДолжен_НайтиДирективуИспользованияПослеРежимаКомпиляции(РежимКомпиляции) Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКБенчмарку = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКБенчмарку, РежимКомпиляции + Символы.ПС + "#Use fs" + Символы.ПС + "&Бенчмарк"); + Анализатор = Новый АнализаторСценарияБенчмарка(ПутьКБенчмарку); + + // Действие + Директивы = Анализатор.ДирективыИспользования(); + + // Проверка + Ожидаем.Что(Директивы).ИмеетДлину(1); + Ожидаем.Что(Директивы[0]).Равно("#Use fs"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПропуститьДирективыВспомогательногоФайлаПриЗапускеКаталога() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьТекст(ОбъединитьПути(КаталогБенчмарка, "Вспомогательный.os"), "#Use absentdependency"); + ЗаписатьТекст(ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"), + "#Use fs + |&Бенчмарк + |Процедура Замер() Экспорт + |КонецПроцедуры"); + Подготовитель = Новый ПодготовительОкруженияЗапускаБенчмарков(МассивИзОдногоЗначения(КаталогБенчмарка)); + + // Действие + Окружение = Подготовитель.Подготовить(); + + // Проверка + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков).ИмеетДлину(1); + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков[0][0]).Равно("#Use fs"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьДирективыЯвноУказанногоАлгоритма() Экспорт + + // Подготовка + КаталогАлгоритма = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКАлгоритму = ОбъединитьПути(КаталогАлгоритма, "Алгоритм.os"); + ЗаписатьТекст(ПутьКАлгоритму, "#Use fs + |А = 1;"); + Подготовитель = Новый ПодготовительОкруженияЗапускаБенчмарков(МассивИзОдногоЗначения(ПутьКАлгоритму)); + + // Действие + Окружение = Подготовитель.Подготовить(); + + // Проверка + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков).ИмеетДлину(1); + Ожидаем.Что(Окружение.ДирективыИспользованияБенчмарков[0][0]).Равно("#Use fs"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ЗаписатьТекст(ПутьКФайлу, Текст) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +Функция МассивИзОдногоЗначения(Значение) + + Результат = Новый Массив(); + Результат.Добавить(Значение); + + Возврат Результат; + +КонецФункции + +Процедура ПроверитьЕдинственнуюДирективуИспользования(ТекстБенчмарка) + + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогБиблиотеки = ОбъединитьПути(КаталогБенчмарка, "oscript_modules", "localdependency"); + ПутьКФайлуБенчмарка = ОбъединитьПути(КаталогБенчмарка, "Бенчмарк.os"); + СоздатьКаталог(КаталогБиблиотеки); + ЗаписатьТекст(ПутьКФайлуБенчмарка, ТекстБенчмарка); + + АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлуБенчмарка); + ДирективыИспользования = АнализаторСценария.ДирективыИспользования(); + + Ожидаем.Что(ДирективыИспользования).ИмеетДлину(1); + Ожидаем.Что(ДирективыИспользования[0]).Равно( + "#Использовать """ + ФС.НормализоватьПуть(КаталогБиблиотеки) + """" + ); + +КонецПроцедуры + +#КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 67dec3ba..5b7fda6d 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\270\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -2,6 +2,7 @@ #Использовать asserts #Использовать fs +#Использовать strings #Использовать tempfiles #Использовать "helpers" @@ -52,7 +53,7 @@ ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКФайлу); // Проверка - ТекстВременногоФайла = ПрочитатьТекст(ПодготовленныйФайл); + ТекстВременногоФайла = СтроковыеФункции.ПрочитатьФайл(ПодготовленныйФайл); Тип = Бенчмаркинг.ПодключитьБенчмарк(ПодготовленныйФайл); ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); @@ -67,6 +68,123 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_СохранитьДирективуИспользованияВСмешанномРегистреВПреамбулеАлгоритма() Экспорт + + // Подготовка + КаталогИсходногоФайла = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКИсходномуФайлу = ОбъединитьПути(КаталогИсходногоФайла, "АлгоритмСДирективойИспользования.os"); + ЗаписатьТекст( + ПутьКИсходномуФайлу, + "#uSe fs + |ФС.НормализоватьПуть(""."");" + ); + + // Действие + ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКИсходномуФайлу); + ПодключенныйТип = Бенчмаркинг.ПодключитьБенчмарк(ПодготовленныйФайл); + + // Проверка + ТекстВременногоФайла = СтроковыеФункции.ПрочитатьФайл(ПодготовленныйФайл); + Ожидаем.Что(Лев(ТекстВременногоФайла, СтрДлина("#uSe fs"))).Равно("#uSe fs"); + Ожидаем.Что(ПодключенныйТип).Не_().ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазрешитьОтносительнуюДирективуИспользованияОтИсходногоАлгоритма() Экспорт + + // Подготовка + КаталогАлгоритма = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКАлгоритму = ОбъединитьПути(КаталогАлгоритма, "Алгоритм.os"); + ЗаписатьТекст(ПутьКАлгоритму, "#Use ""./dependency"" + |А = 1;"); + + // Действие + ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКАлгоритму); + ТекстВременногоФайла = СтроковыеФункции.ПрочитатьФайл(ПодготовленныйФайл); + + // Проверка + Ожидаем.Что(ТекстВременногоФайла).Содержит( + "#Использовать """ + ФС.НормализоватьПуть(ОбъединитьПути(КаталогАлгоритма, "dependency")) + """" + ); + +КонецПроцедуры + +&Тест +&Параметры("#native") +&Параметры("#stack") +Процедура ТестДолжен_СохранитьРежимКомпиляцииВПреамбулеАлгоритма(РежимКомпиляции) Экспорт + + // Подготовка + КаталогАлгоритма = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКАлгоритму = ОбъединитьПути(КаталогАлгоритма, "Алгоритм.os"); + ЗаписатьТекст(ПутьКАлгоритму, РежимКомпиляции + Символы.ПС + "#Use fs" + Символы.ПС + "А = 1;"); + + // Действие + ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКАлгоритму); + ТекстВременногоФайла = СтроковыеФункции.ПрочитатьФайл(ПодготовленныйФайл); + + // Проверка + Ожидаем.Что(ТекстВременногоФайла).Содержит(РежимКомпиляции + Символы.ПС + "#Use fs"); + Ожидаем.Что(СтрНайти(ТекстВременногоФайла, РежимКомпиляции)).Меньше( + СтрНайти(ТекстВременногоФайла, "&Бенчмарк") + ); + + Если Не ТестированиеБенчмарков.ЭтоOneScript1() Тогда + ТипБенчмарка = Бенчмаркинг.ПодключитьБенчмарк(ПодготовленныйФайл); + Ожидаем.Что(ТипБенчмарка).Не_().ЭтоНеопределено(); + КонецЕсли; + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьУсловныйКодИИспользованиеВОбернутомАлгоритме() Экспорт + + // Подготовка + КаталогАлгоритма = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКАлгоритму = ОбъединитьПути(КаталогАлгоритма, "УсловныйАлгоритм.os"); + ЗаписатьТекст(ПутьКАлгоритму, "#Если Windows Тогда + |#Use fs + |А = 1; + |#Иначе + |#Use fs + |А = 2; + |#КонецЕсли"); + + // Действие + ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКАлгоритму); + ПодключенныйТип = Бенчмаркинг.ПодключитьБенчмарк(ПодготовленныйФайл); + + // Проверка + Ожидаем.Что(ПодключенныйТип).Не_().ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьОбластьВПреамбулеОбычногоАлгоритма() Экспорт + + // Подготовка + КаталогИсходногоФайла = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКИсходномуФайлу = ОбъединитьПути(КаталогИсходногоФайла, "АлгоритмСОбластью.os"); + ЗаписатьТекст( + ПутьКИсходномуФайлу, + "#Область Подготовка + |#КонецОбласти + |ФС.НормализоватьПуть(""."");" + ); + + // Действие + ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКИсходномуФайлу); + ТекстВременногоФайла = СтроковыеФункции.ПрочитатьФайл(ПодготовленныйФайл); + + // Проверка + ПозицияАннотацииБенчмарка = СтрНайти(ТекстВременногоФайла, "&Бенчмарк"); + Ожидаем.Что(СтрНайти(ТекстВременногоФайла, "#Область Подготовка")).Меньше(ПозицияАннотацииБенчмарка); + Ожидаем.Что(СтрНайти(ТекстВременногоФайла, "#КонецОбласти")).Меньше(ПозицияАннотацииБенчмарка); + +КонецПроцедуры + &Тест Процедура ТестДолжен_УдалитьВременныйКаталогПриОчистке() Экспорт @@ -109,7 +227,7 @@ ); Ожидаем.Что(ФС.ФайлСуществует(ПутьКПодготовленнойКонфигурации)).Равно(Истина); - ТекстКонфигурации = ПрочитатьТекст(ПутьКПодготовленнойКонфигурации); + ТекстКонфигурации = СтроковыеФункции.ПрочитатьФайл(ПутьКПодготовленнойКонфигурации); Ожидаем.Что(ТекстКонфигурации).Содержит(ФС.НормализоватьПуть(КаталогЛокальныхБиблиотек)); Ожидаем.Что(ТекстКонфигурации).Содержит("custom.option=benchmark"); @@ -132,16 +250,6 @@ #Область СлужебныеПроцедурыИФункции -Функция ПрочитатьТекст(ПутьКФайлу) - - ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8); - Текст = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); - - Возврат Текст; - -КонецФункции - Процедура ЗаписатьТекст(ПутьКФайлу, Текст) ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" index 7723811f..ef4ba8b5 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" @@ -3,6 +3,7 @@ #Использовать asserts #Использовать fs +#Использовать strings #Использовать tempfiles #Использовать "helpers" #Использовать "fixtures/benchmarks" @@ -114,9 +115,7 @@ // Действие Сценарий.Записать(ПутьКФайлуСценария, КейсПустогоБенчмарка(1)); - ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуСценария, КодировкаТекста.UTF8); - ТекстСценария = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); + ТекстСценария = СтроковыеФункции.ПрочитатьФайл(ПутьКФайлуСценария); // Проверка Ожидаем.Что(ТекстСценария).Содержит("ДиспетчерСобытийВыполненияБенчмарков"); @@ -128,6 +127,68 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_СохранитьПорядокДирективБенчмаркаДоБиблиотеки() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогЗависимости = ОбъединитьПути(КаталогБенчмарка, "helpers"); + КаталогМодулейЗависимости = ОбъединитьПути(КаталогЗависимости, "src", "Модули"); + ПутьКФайлуБенчмарка = ОбъединитьПути(КаталогБенчмарка, "БенчмаркСЗависимостью.os"); + ПутьКФайлуСценария = _МенеджерВременныхФайлов.НовоеИмяФайла("os"); + ФС.ОбеспечитьКаталог(КаталогМодулейЗависимости); + + ЗаписьТекста = Новый ЗаписьТекста( + ОбъединитьПути(КаталогМодулейЗависимости, "ТестоваяЗависимость.os"), + КодировкаТекста.UTF8 + ); + ЗаписьТекста.Записать( + "Функция Получить() Экспорт + |КонецФункции" + ); + ЗаписьТекста.Закрыть(); + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлуБенчмарка, КодировкаТекста.UTF8); + ЗаписьТекста.Записать( + "#Use fs + |#Use ""./helpers"" + |&Бенчмарк + |Процедура Бенчмарк() Экспорт + |КонецПроцедуры" + ); + ЗаписьТекста.Закрыть(); + + ТипБенчмарка = Бенчмаркинг.ПодключитьБенчмарк(ПутьКФайлуБенчмарка); + Сценарий = Новый СценарийЗапускаБенчмарка( + Новый КоллекцияДескрипторовБенчмарков(ТипБенчмарка), + ТестированиеБенчмарков.КонфигурацияПоУмолчанию() + ); + + // Действие + Сценарий.Записать(ПутьКФайлуСценария, Новый КейсБенчмарка( + 1, + Новый КоллекцияДескрипторовБенчмарков(ТипБенчмарка).ПолучитьПервый() + )); + + // Проверка + ТекстСценария = СтроковыеФункции.ПрочитатьФайл(ПутьКФайлуСценария); + + ПозицияИменованнойЗависимости = СтрНайти(ТекстСценария, "#Use fs"); + ПозицияПутевойЗависимости = СтрНайти( + ТекстСценария, + "#Использовать """ + ФС.НормализоватьПуть(КаталогЗависимости) + """" + ); + ПозицияБиблиотеки = СтрНайти( + ТекстСценария, + "#Использовать """ + ФС.НормализоватьПуть(ТекущийКаталог()) + """" + ); + + Ожидаем.Что(ПозицияИменованнойЗависимости).Больше(0); + Ожидаем.Что(ПозицияИменованнойЗависимости).Меньше(ПозицияПутевойЗависимости); + Ожидаем.Что(ПозицияПутевойЗависимости).Меньше(ПозицияБиблиотеки); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции From df0cba2d959a5f9f99652ea6b7aa594cc4daa456 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 25 Oct 2026 20:26:34 +0300 Subject: [PATCH 2/3] =?UTF-8?q?test:=20=D1=81=D0=B1=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BC=D0=B0=D1=80=D0=BA=D0=B5?= =?UTF-8?q?=D1=80=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D1=85=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оба теста требуют повторного запуска, но могли наследовать маркер BENCHOS_OSCRIPT_CONFIG_APPLIED=1 от другого теста. Явно очищать его в подготовке, чтобы проверка обработки ошибки и предварительной загрузки зависимостей не зависела от порядка запуска тестов. --- ...320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" index 673b0873..89972686 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" @@ -235,6 +235,7 @@ Процедура ТестДолжен_ПродолжитьЗапускПослеОшибкиИспользованияВДругомБенчмарке() Экспорт // Подготовка + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); КаталогБенчмарков = ОбъединитьПути(КаталогЗапуска, "benchmarks"); СоздатьКаталог(КаталогБенчмарков); @@ -378,6 +379,7 @@ Процедура ТестДолжен_УдалитьВременнуюТочкуВходаПриОшибкеПодготовкиОкружения() Экспорт // Подготовка + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); НедопустимыеФайлыКонфигурации = Новый Структура("Файл", "oscript.cfg"); ДирективыИспользования = Новый Массив(); ДирективыИспользования.Добавить( From 3900fc67124632a01b61b00ddb665c7d2e1c82ee Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 25 Oct 2026 20:40:19 +0300 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B6?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0=D1=80?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=B1=D0=B8=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B5=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Удалить предварительное подключение директив #Использовать/#Use из сгенерированного сценария измерения. Обработчики бенчмарка могут использовать типы BenchmarkOneScript и не компилируются до загрузки библиотеки; ошибка затрагивала запуск, отчеты, сериализацию и экспорт. Подключать исходный бенчмарк после библиотеки и обновить проверку порядка загрузки в тесте сценария. Предварительная загрузка зависимостей в точке входа CLI остается без изменений. --- ...20\274\320\260\321\200\320\272\320\260.os" | 15 +--- ...0\265\320\275\320\270\321\217OneScript.os" | 69 +++++++++++-------- ...20\274\320\260\321\200\320\272\320\260.os" | 16 ++--- 3 files changed, 47 insertions(+), 53 deletions(-) diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" index 7832ccce..2ded1139 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\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\260.os" @@ -43,7 +43,7 @@ ПодготовитьФайлНастроекЗапуска(ПутьФайлаНастроекЗапуска, Кейсы, Чекпоинт); ТекстСценария = ТекстСценария(ПутьФайлаНастроекЗапуска); - + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); ЗаписьТекста.Записать(ТекстСценария); ЗаписьТекста.Закрыть(); @@ -61,11 +61,8 @@ ПутьКБиблиотеке = ФС.НормализоватьПуть(ОбъединитьПути(ТекущийСценарий().Каталог, "../../../../..")); ПутьКФайлуБенчмарка = ПутьКФайлуБенчмарка(); ИмяТипаБенчмарка = Строка(ТипКлассаБенчмарка()); - ТекстДирективИспользования = ТекстДирективИспользованияБенчмарка(ПутьКФайлуБенчмарка); - ТекстСценария = ТекстДирективИспользования - + ?(ПустаяСтрока(ТекстДирективИспользования), "", Символы.ПС) - + " + ТекстСценария = " |#Использовать """ + ПутьКБиблиотеке + """ | |УстановитьПеременнуюСреды(""BENCHOS_IS_CHILD_PROCESS"", 1); @@ -130,14 +127,6 @@ Возврат Новый РасширениеТипа(ТипКлассаБенчмарка()).Источник; КонецФункции -Функция ТекстДирективИспользованияБенчмарка(ПутьКФайлуБенчмарка) - - АнализаторСценария = Новый АнализаторСценарияБенчмарка(ПутьКФайлуБенчмарка); - Директивы = АнализаторСценария.ДирективыИспользования(); - Возврат СтрСоединить(Директивы, Символы.ПС); - -КонецФункции - Функция ТипКлассаБенчмарка() Возврат _ДескрипторыБенчмарков.ПолучитьПервый().ТипКласса(); КонецФункции diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" index 89972686..31b80adb 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\237\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217OneScript.os" @@ -281,7 +281,6 @@ ОбъединитьПути(КаталогПроекта, "src/BenchmarkOneScript/cmd/main.os") ); КаталогБенчмарка = ОбъединитьПути(КаталогЗапуска, "benchmarks"); - КаталогПутевойБиблиотеки = ОбъединитьПути(КаталогБенчмарка, "oscript_modules", "pathdependency"); КаталогБиблиотекиИзКонфигурации = ОбъединитьПути(КаталогЗапуска, "benchmark_dependencies", "configdependency"); УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); УстановитьПеременнуюСреды("OSLIB_LOADER_TRACE", "1"); @@ -341,29 +340,23 @@ // Проверка Ожидаем.Что(Результат.КодВозврата, Результат.Вывод).Равно(0); + ПрефиксЗагрузкиБиблиотеки = "ПриЗагрузкеБиблиотеки "; ПозицияБиблиотекиИзКонфигурации = СтрНайти( НРег(Результат.Вывод), НРег(ПрефиксЗагрузкиБиблиотеки + КаталогБиблиотекиИзКонфигурации) ); - ПозицияПутевойБиблиотеки = СтрНайти( - НРег(Результат.Вывод), - НРег(ПрефиксЗагрузкиБиблиотеки + КаталогПутевойБиблиотеки) - ); - ПозицияБиблиотекиКоманд = ПозицияВторогоВхождения( - НРег(Результат.Вывод), - НРег( - ПрефиксЗагрузкиБиблиотеки - + ОбъединитьПути(КаталогПроекта, "src", "BenchmarkOneScript", "cmd") - ) - ); + ПорядокЗагрузкиПутевойБиблиотеки = ПорядокЗагрузкиБиблиотеки(Результат.Вывод, "pathdependency"); + ПорядокЗагрузкиБиблиотекиКоманд = ПорядокЗагрузкиБиблиотеки(Результат.Вывод, "cmd", 2); + Ожидаем.Что(ПозицияБиблиотекиИзКонфигурации, Результат.Вывод).Больше(0); - Ожидаем.Что(ПозицияПутевойБиблиотеки, Результат.Вывод).Больше(0); - Ожидаем.Что(ПозицияПутевойБиблиотеки, Результат.Вывод).Меньше(ПозицияБиблиотекиКоманд); + Ожидаем.Что(ПорядокЗагрузкиПутевойБиблиотеки, Результат.Вывод).Больше(0); + Ожидаем.Что(ПорядокЗагрузкиПутевойБиблиотеки, Результат.Вывод).Меньше(ПорядокЗагрузкиБиблиотекиКоманд); Ожидаем.Что( КоличествоЗагрузокБиблиотеки(Результат.Вывод, "cmd"), Результат.Вывод ).Равно(2); + ПутьКРепозиторнойБиблиотекеФС = ОбъединитьПути(КаталогПроекта, "oscript_modules", "fs"); Ожидаем.Что( КоличествоВхожденийПодстроки( @@ -886,13 +879,12 @@ Функция КоличествоЗагрузокБиблиотеки(Вывод, ИмяБиблиотеки) - Шаблон = СтрШаблон( - "(?im)ПриЗагрузкеБиблиотеки[ \t]+[^\r\n]*[/\\]%1\r?$", - ИмяБиблиотеки - ); - РегулярноеВыражение = Новый РегулярноеВыражение(Шаблон); + КоличествоЗагрузок = 0; + Пока ПорядокЗагрузкиБиблиотеки(Вывод, ИмяБиблиотеки, КоличествоЗагрузок + 1) > 0 Цикл + КоличествоЗагрузок = КоличествоЗагрузок + 1; + КонецЦикла; - Возврат РегулярноеВыражение.НайтиСовпадения(Вывод).Количество(); + Возврат КоличествоЗагрузок; КонецФункции @@ -946,20 +938,37 @@ КонецФункции -Функция ПозицияВторогоВхождения(Текст, Подстрока) +Функция ПорядокЗагрузкиБиблиотеки(Вывод, ИмяБиблиотеки, НомерВхождения = 1) - ПозицияПервогоВхождения = СтрНайти(Текст, Подстрока); - Если ПозицияПервогоВхождения = 0 Тогда + ПрефиксЗагрузки = "ПриЗагрузкеБиблиотеки "; + ПозицияПервойЗагрузки = СтрНайти(Вывод, ПрефиксЗагрузки); + Если ПозицияПервойЗагрузки = 0 Тогда Возврат 0; КонецЕсли; - НачалоОставшегосяТекста = ПозицияПервогоВхождения + СтрДлина(Подстрока); - ПозицияВОставшемсяТексте = СтрНайти(Сред(Текст, НачалоОставшегосяТекста), Подстрока); - Возврат ?( - ПозицияВОставшемсяТексте = 0, - 0, - НачалоОставшегосяТекста + ПозицияВОставшемсяТексте - 1 - ); + Шаблон = СтрШаблон("(?i)^.*[/\\]%1[/\\]?$", ИмяБиблиотеки); + РегулярноеВыражение = Новый РегулярноеВыражение(Шаблон); + ПорядокЗагрузки = 0; + КоличествоВхождений = 0; + + ТекстЗагрузок = Сред(Вывод, ПозицияПервойЗагрузки); + Для Каждого ЧастьВывода Из СтрРазделить(ТекстЗагрузок, ПрефиксЗагрузки, Ложь) Цикл + СтрокиЧасти = СтрРазделить(ЧастьВывода, Символы.ПС, Ложь); + Если СтрокиЧасти.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ПорядокЗагрузки = ПорядокЗагрузки + 1; + ПерваяСтрока = СтрокиЧасти[0]; + Если РегулярноеВыражение.Совпадает(СокрЛП(ПерваяСтрока)) Тогда + КоличествоВхождений = КоличествоВхождений + 1; + Если КоличествоВхождений = НомерВхождения Тогда + Возврат ПорядокЗагрузки; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат 0; КонецФункции diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" index ef4ba8b5..273337da 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217\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\260.os" @@ -128,7 +128,7 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_СохранитьПорядокДирективБенчмаркаДоБиблиотеки() Экспорт +Процедура ТестДолжен_ПодключитьБенчмаркПослеБиблиотекиВПроцессеИзмерения() Экспорт // Подготовка КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); @@ -172,20 +172,16 @@ // Проверка ТекстСценария = СтроковыеФункции.ПрочитатьФайл(ПутьКФайлуСценария); - - ПозицияИменованнойЗависимости = СтрНайти(ТекстСценария, "#Use fs"); - ПозицияПутевойЗависимости = СтрНайти( - ТекстСценария, - "#Использовать """ + ФС.НормализоватьПуть(КаталогЗависимости) + """" - ); ПозицияБиблиотеки = СтрНайти( ТекстСценария, "#Использовать """ + ФС.НормализоватьПуть(ТекущийКаталог()) + """" ); + ПозицияПодключенияБенчмарка = СтрНайти(ТекстСценария, "Бенчмаркинг.ПодключитьБенчмарк("); - Ожидаем.Что(ПозицияИменованнойЗависимости).Больше(0); - Ожидаем.Что(ПозицияИменованнойЗависимости).Меньше(ПозицияПутевойЗависимости); - Ожидаем.Что(ПозицияПутевойЗависимости).Меньше(ПозицияБиблиотеки); + Ожидаем.Что(ПозицияБиблиотеки).Больше(0); + Ожидаем.Что(ПозицияПодключенияБенчмарка).Больше(ПозицияБиблиотеки); + Ожидаем.Что(ТекстСценария).Не_().Содержит("#Use fs"); + Ожидаем.Что(ТекстСценария).Не_().Содержит(ФС.НормализоватьПуть(КаталогЗависимости)); КонецПроцедуры