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..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); ЗаписьТекста.Записать(ТекстСценария); ЗаписьТекста.Закрыть(); @@ -58,9 +58,9 @@ Функция ТекстСценария(ПутьФайлаНастроекЗапуска) - ПутьКБиблиотеке = ФС.НормализоватьПуть(ОбъединитьПути(ТекущийСценарий().Каталог, "../../../../..")); + ПутьКБиблиотеке = ФС.НормализоватьПуть(ОбъединитьПути(ТекущийСценарий().Каталог, "../../../../..")); ПутьКФайлуБенчмарка = ПутьКФайлуБенчмарка(); - ИмяТипаБенчмарка = Строка(ТипКлассаБенчмарка()); + ИмяТипаБенчмарка = Строка(ТипКлассаБенчмарка()); ТекстСценария = " |#Использовать """ + ПутьКБиблиотеке + """ 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..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" @@ -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,177 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_ПродолжитьЗапускПослеОшибкиИспользованияВДругомБенчмарке() Экспорт + + // Подготовка + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогБенчмарков = ОбъединитьПути(КаталогЗапуска, "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"); + КаталогБиблиотекиИзКонфигурации = ОбъединитьПути(КаталогЗапуска, "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); + + ПрефиксЗагрузкиБиблиотеки = "ПриЗагрузкеБиблиотеки "; + ПозицияБиблиотекиИзКонфигурации = СтрНайти( + НРег(Результат.Вывод), + НРег(ПрефиксЗагрузкиБиблиотеки + КаталогБиблиотекиИзКонфигурации) + ); + ПорядокЗагрузкиПутевойБиблиотеки = ПорядокЗагрузкиБиблиотеки(Результат.Вывод, "pathdependency"); + ПорядокЗагрузкиБиблиотекиКоманд = ПорядокЗагрузкиБиблиотеки(Результат.Вывод, "cmd", 2); + + Ожидаем.Что(ПозицияБиблиотекиИзКонфигурации, Результат.Вывод).Больше(0); + Ожидаем.Что(ПорядокЗагрузкиПутевойБиблиотеки, Результат.Вывод).Больше(0); + Ожидаем.Что(ПорядокЗагрузкиПутевойБиблиотеки, Результат.Вывод).Меньше(ПорядокЗагрузкиБиблиотекиКоманд); + Ожидаем.Что( + КоличествоЗагрузокБиблиотеки(Результат.Вывод, "cmd"), + Результат.Вывод + ).Равно(2); + + ПутьКРепозиторнойБиблиотекеФС = ОбъединитьПути(КаталогПроекта, "oscript_modules", "fs"); + Ожидаем.Что( + КоличествоВхожденийПодстроки( + НРег(Результат.Вывод), + НРег(ПрефиксЗагрузкиБиблиотеки + ПутьКРепозиторнойБиблиотекеФС) + ), + Результат.Вывод + ).Равно(3); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_УдалитьВременнуюТочкуВходаПриОшибкеПодготовкиОкружения() Экспорт + + // Подготовка + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + НедопустимыеФайлыКонфигурации = Новый Структура("Файл", "oscript.cfg"); + ДирективыИспользования = Новый Массив(); + ДирективыИспользования.Добавить( + "#Использовать """ + ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "fs") + """" + ); + НаборыДиректив = Новый Массив(); + НаборыДиректив.Добавить(ДирективыИспользования); + ВременныеАртефактыДоЗапуска = НайтиВременныеАртефактыТочкиВхода(); + Перезапускатель = Новый ПерезапускательПриложенияOneScript(); + + // Действие + ВозниклоИсключение = Ложь; + Попытка + Перезапускатель.ПерезапуститьСОкружениемOneScript(НедопустимыеФайлыКонфигурации, НаборыДиректив); + Исключение + ВозниклоИсключение = Истина; + КонецПопытки; + + НовыеВременныеАртефакты = НайтиНовыеВременныеФайлы( + ВременныеАртефактыДоЗапуска, + НайтиВременныеАртефактыТочкиВхода() + ); + + // Проверка + Ожидаем.Что(ВозниклоИсключение).Равно(Истина); + Ожидаем.Что(НовыеВременныеАртефакты).ИмеетДлину(0); + +КонецПроцедуры + &Тест Процедура ТестДолжен_ПереопределитьПараметрыИзНастроекПараметрамиCLI() Экспорт @@ -708,13 +879,55 @@ Функция КоличествоЗагрузокБиблиотеки(Вывод, ИмяБиблиотеки) - Шаблон = СтрШаблон( - "(?im)ПриЗагрузкеБиблиотеки[ \t]+[^\r\n]*[/\\]%1\r?$", - ИмяБиблиотеки - ); - РегулярноеВыражение = Новый РегулярноеВыражение(Шаблон); + КоличествоЗагрузок = 0; + Пока ПорядокЗагрузкиБиблиотеки(Вывод, ИмяБиблиотеки, КоличествоЗагрузок + 1) > 0 Цикл + КоличествоЗагрузок = КоличествоЗагрузок + 1; + КонецЦикла; - Возврат РегулярноеВыражение.НайтиСовпадения(Вывод).Количество(); + Возврат КоличествоЗагрузок; + +КонецФункции + +Функция НайтиВременныеАртефактыТочкиВхода() + + ВременныеАртефакты = Новый Массив(); + Для Каждого Файл Из НайтиФайлы(КаталогВременныхФайлов(), "*.os", Ложь) Цикл + ВременныеАртефакты.Добавить(Файл.ПолноеИмя); + КонецЦикла; + + Для Каждого Файл Из НайтиФайлы(КаталогВременныхФайлов(), "*.benchos-точка-входа", Ложь) Цикл + ВременныеАртефакты.Добавить(Файл.ПолноеИмя); + КонецЦикла; + + Возврат ВременныеАртефакты; + +КонецФункции + +Функция НайтиНовыеВременныеФайлы(ВременныеФайлыДоЗапуска, ВременныеФайлыПослеЗапуска) + + НовыеФайлы = Новый Массив(); + Для Каждого ПолноеИмяФайла Из ВременныеФайлыПослеЗапуска Цикл + Если ВременныеФайлыДоЗапуска.Найти(ПолноеИмяФайла) = Неопределено Тогда + НовыеФайлы.Добавить(ПолноеИмяФайла); + КонецЕсли; + КонецЦикла; + + Возврат НовыеФайлы; + +КонецФункции + +Функция КоличествоВхожденийПодстроки(Текст, Подстрока) + + КоличествоВхождений = 0; + ПозицияВхождения = СтрНайти(Текст, Подстрока); + + Пока ПозицияВхождения > 0 Цикл + КоличествоВхождений = КоличествоВхождений + 1; + Текст = Сред(Текст, ПозицияВхождения + СтрДлина(Подстрока)); + ПозицияВхождения = СтрНайти(Текст, Подстрока); + КонецЦикла; + + Возврат КоличествоВхождений; КонецФункции @@ -725,6 +938,40 @@ КонецФункции +Функция ПорядокЗагрузкиБиблиотеки(Вывод, ИмяБиблиотеки, НомерВхождения = 1) + + ПрефиксЗагрузки = "ПриЗагрузкеБиблиотеки "; + ПозицияПервойЗагрузки = СтрНайти(Вывод, ПрефиксЗагрузки); + Если ПозицияПервойЗагрузки = 0 Тогда + Возврат 0; + КонецЕсли; + + Шаблон = СтрШаблон("(?i)^.*[/\\]%1[/\\]?$", ИмяБиблиотеки); + РегулярноеВыражение = Новый РегулярноеВыражение(Шаблон); + ПорядокЗагрузки = 0; + КоличествоВхождений = 0; + + ТекстЗагрузок = Сред(Вывод, ПозицияПервойЗагрузки); + Для Каждого ЧастьВывода Из СтрРазделить(ТекстЗагрузок, ПрефиксЗагрузки, Ложь) Цикл + СтрокиЧасти = СтрРазделить(ЧастьВывода, Символы.ПС, Ложь); + Если СтрокиЧасти.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ПорядокЗагрузки = ПорядокЗагрузки + 1; + ПерваяСтрока = СтрокиЧасти[0]; + Если РегулярноеВыражение.Совпадает(СокрЛП(ПерваяСтрока)) Тогда + КоличествоВхождений = КоличествоВхождений + 1; + Если КоличествоВхождений = НомерВхождения Тогда + Возврат ПорядокЗагрузки; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат 0; + +КонецФункции + Процедура ЗаписатьТекст(ПутьКФайлу, Текст) ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.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..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" @@ -3,6 +3,7 @@ #Использовать asserts #Использовать fs +#Использовать strings #Использовать tempfiles #Использовать "helpers" #Использовать "fixtures/benchmarks" @@ -114,9 +115,7 @@ // Действие Сценарий.Записать(ПутьКФайлуСценария, КейсПустогоБенчмарка(1)); - ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуСценария, КодировкаТекста.UTF8); - ТекстСценария = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); + ТекстСценария = СтроковыеФункции.ПрочитатьФайл(ПутьКФайлуСценария); // Проверка Ожидаем.Что(ТекстСценария).Содержит("ДиспетчерСобытийВыполненияБенчмарков"); @@ -128,6 +127,64 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_ПодключитьБенчмаркПослеБиблиотекиВПроцессеИзмерения() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогЗависимости = ОбъединитьПути(КаталогБенчмарка, "helpers"); + КаталогМодулейЗависимости = ОбъединитьПути(КаталогЗависимости, "src", "Модули"); + ПутьКФайлуБенчмарка = ОбъединитьПути(КаталогБенчмарка, "БенчмаркСЗависимостью.os"); + ПутьКФайлуСценария = _МенеджерВременныхФайлов.НовоеИмяФайла("os"); + ФС.ОбеспечитьКаталог(КаталогМодулейЗависимости); + + ЗаписьТекста = Новый ЗаписьТекста( + ОбъединитьПути(КаталогМодулейЗависимости, "ТестоваяЗависимость.os"), + КодировкаТекста.UTF8 + ); + ЗаписьТекста.Записать( + "Функция Получить() Экспорт + |КонецФункции" + ); + ЗаписьТекста.Закрыть(); + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлуБенчмарка, КодировкаТекста.UTF8); + ЗаписьТекста.Записать( + "#Use fs + |#Use ""./helpers"" + |&Бенчмарк + |Процедура Бенчмарк() Экспорт + |КонецПроцедуры" + ); + ЗаписьТекста.Закрыть(); + + ТипБенчмарка = Бенчмаркинг.ПодключитьБенчмарк(ПутьКФайлуБенчмарка); + Сценарий = Новый СценарийЗапускаБенчмарка( + Новый КоллекцияДескрипторовБенчмарков(ТипБенчмарка), + ТестированиеБенчмарков.КонфигурацияПоУмолчанию() + ); + + // Действие + Сценарий.Записать(ПутьКФайлуСценария, Новый КейсБенчмарка( + 1, + Новый КоллекцияДескрипторовБенчмарков(ТипБенчмарка).ПолучитьПервый() + )); + + // Проверка + ТекстСценария = СтроковыеФункции.ПрочитатьФайл(ПутьКФайлуСценария); + ПозицияБиблиотеки = СтрНайти( + ТекстСценария, + "#Использовать """ + ФС.НормализоватьПуть(ТекущийКаталог()) + """" + ); + ПозицияПодключенияБенчмарка = СтрНайти(ТекстСценария, "Бенчмаркинг.ПодключитьБенчмарк("); + + Ожидаем.Что(ПозицияБиблиотеки).Больше(0); + Ожидаем.Что(ПозицияПодключенияБенчмарка).Больше(ПозицияБиблиотеки); + Ожидаем.Что(ТекстСценария).Не_().Содержит("#Use fs"); + Ожидаем.Что(ТекстСценария).Не_().Содержит(ФС.НормализоватьПуть(КаталогЗависимости)); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции