diff --git a/.gitignore b/.gitignore index 7f39705..37f48b6 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,8 @@ oscript_modules/ .vs/ +# Git +.worktrees/ + # Benchmark -BenchmarkArtifacts/ \ No newline at end of file +BenchmarkArtifacts/ diff --git a/docs/CLI.md b/docs/CLI.md index 0004a7c..0962b05 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -24,6 +24,7 @@ benchos run [OPTIONS] [FILE] - если передан каталог, CLI ищет в нем файлы `*.os`, а с опцией `-r` делает это рекурсивно; - если явно передан `.os`-файл без методов с `&Бенчмарк`, CLI считает, что в файле в сценарии расположен один алгоритм; - если передано несколько `.os`-файлов без методов с аннотацией `&Бенчмарк`, каждый из них запускается отдельно, а результаты объединяются в один общий отчет; +- файл `oscript.cfg`, расположенный рядом с файлом бенчмарка, используется для подключения его зависимостей и отдельного запуска; - при запуске каталога ожидаются обычные файлы бенчмарков с аннотациями. ### Опции diff --git "a/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" "b/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" index 9e0d21b..55913ec 100644 --- "a/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" +++ "b/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" @@ -72,6 +72,27 @@ benchos run -r ./benchmarks - при запуске каталога ожидаются обычные файлы бенчмарков с аннотациями; - автозапуск файлов без `&Бенчмарк` для каталога не применяется. +### Локальные зависимости + +Команда `benchos run` учитывает файлы `oscript.cfg`, расположенные непосредственно +рядом с файлами бенчмарков. Это позволяет подключать зависимости бенчмарка из +локальных каталогов, в том числе когда команда запускается из другого каталога. + +При первичном подключении бенчмарков из найденных файлов конфигурации используются +параметры `lib.system` и `lib.additional`. Если файлов конфигурации несколько, пути +к библиотекам учитываются в порядке переданных файлов и найденных бенчмарков. + +Для изолированного запуска каждого бенчмарка применяются все параметры из файла +`oscript.cfg`, расположенного рядом именно с этим бенчмарком. Его настройки имеют +приоритет над настройками из текущего каталога и каталога программы. Пути из +`lib.system` и `lib.additional` объединяются от локальных к глобальным, а +относительные пути разрешаются относительно каталога соответствующего +`oscript.cfg`. + +То же правило действует для явно переданного `.os`-файла без аннотаций +`&Бенчмарк`: его локальная конфигурация сохраняется при подготовке временного +файла для запуска. + ### Примеры ```bash diff --git a/src/BenchmarkOneScript/cmd/main.os b/src/BenchmarkOneScript/cmd/main.os index 5bdb9c4..903106a 100644 --- a/src/BenchmarkOneScript/cmd/main.os +++ b/src/BenchmarkOneScript/cmd/main.os @@ -4,4 +4,4 @@ #Использовать "." Поделка = Новый Поделка(); -Поделка.ЗапуститьПриложение(); \ No newline at end of file +Поделка.ЗапуститьПриложение(); diff --git "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\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\217\320\241\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\265\320\271OneScript.os" "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\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\217\320\241\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\265\320\271OneScript.os" new file mode 100644 index 0000000..271b862 --- /dev/null +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\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\217\320\241\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\265\320\271OneScript.os" @@ -0,0 +1,164 @@ +Перем _ПутьКТочкеВходаПриложения; // Строка, Неопределено + +#Область ОбработчикиСобытий + +// Инициализирует запускатель приложения с конфигурациями OneScript. +// Точка входа определяется по расположению сценария класса при подготовке повторного запуска. +Процедура ПриСозданииОбъекта() + + _ПутьКТочкеВходаПриложения = Неопределено; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Перезапускает приложение с указанными файлами конфигурации OneScript. +// +// Параметры: +// ФайлыКонфигурацииOneScript - Массив из Строка - Пути к файлам oscript.cfg +// в порядке убывания приоритета +// +// Возвращаемое значение: +// Число, Неопределено - Код возврата дочернего процесса или Неопределено, +// если повторный запуск не требуется +Функция ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript) Экспорт + + Если ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED") = "1" Тогда + Возврат Неопределено; + КонецЕсли; + + Если Не ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript) + + Если ФайлыКонфигурацииOneScript.Количество() > 0 Тогда + Возврат Истина; + КонецЕсли; + + ТекущаяКонфигурация = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "oscript.cfg")); + Возврат ТекущаяКонфигурация.Существует() И ТекущаяКонфигурация.ЭтоФайл(); + +КонецФункции + +Функция ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript) + + ПутьКТочкеВхода = ПутьКТочкеВходаПриложения(); + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ФайлыКонфигурацииOneScript); + ПараметрыКонфигурацииOneScript = ПараметрыКонфигурацииДляПеременнойСреды(МенеджерПараметров.Прочитать()); + + Процесс = СоздатьИЗапуститьПроцесс( + ПутьКТочкеВхода, + ТекущийКаталог(), + ПараметрыКонфигурацииOneScript + ); + + ОжидатьЗавершениеПроцесса(Процесс); + + Возврат Процесс.КодВозврата; + +КонецФункции + +Функция ПутьКТочкеВходаПриложения() + + Если _ПутьКТочкеВходаПриложения <> Неопределено Тогда + Возврат _ПутьКТочкеВходаПриложения; + КонецЕсли; + + _ПутьКТочкеВходаПриложения = Новый Файл( + ОбъединитьПути(ТекущийСценарий().Каталог, "..", "main.os") + ).ПолноеИмя; + + Возврат _ПутьКТочкеВходаПриложения; + +КонецФункции + +Функция ПараметрыКонфигурацииДляПеременнойСреды(Параметры) + + ЧастиКонфигурации = Новый Массив(); + Для Каждого Параметр Из Параметры Цикл + ЧастиКонфигурации.Добавить(СтрШаблон( + "%1=%2", + Параметр.Ключ, + ЗначениеКонфигурацииДляПеременнойСреды(Параметр.Значение) + )); + КонецЦикла; + + Возврат СтрСоединить(ЧастиКонфигурации, ";"); + +КонецФункции + +Функция ЗначениеКонфигурацииДляПеременнойСреды(Значение) + + Кавычка = """"; + ЭкранированноеЗначение = СтрЗаменить(Строка(Значение), Кавычка, Кавычка + Кавычка); + + Возврат Кавычка + ЭкранированноеЗначение + Кавычка; + +КонецФункции + +Функция СоздатьИЗапуститьПроцесс(ПутьКТочкеВхода, РабочийКаталог, ПараметрыКонфигурацииOneScript) + + ЛокаторИсполняющейСреды = Новый ЛокаторИсполняющейСреды(); + ПутьИсполняемогоФайла = ЛокаторИсполняющейСреды.НайтиИсполняемыйФайлВКаталоге(КаталогПрограммы()); + + ЧастиКоманды = Новый Массив(); + // OneScript извлекает executable до разбора аргументов и снимает только двойные кавычки. + ЧастиКоманды.Добавить( + ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки( + ПутьИсполняемогоФайла + ) + ); + ЧастиКоманды.Добавить( + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + ПутьКТочкеВхода + ) + ); + + Для Каждого Аргумент Из АргументыКоманднойСтроки Цикл + ЧастиКоманды.Добавить( + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + Аргумент + ) + ); + КонецЦикла; + + ПеременныеСредыПроцесса = ПеременныеСреды(); + ПеременныеСредыПроцесса.Вставить("BENCHOS_OSCRIPT_CONFIG_APPLIED", "1"); + ПеременныеСредыПроцесса.Вставить("OSCRIPT_CONFIG", ПараметрыКонфигурацииOneScript); + + Процесс = СоздатьПроцесс( + СтрСоединить(ЧастиКоманды, " "), + РабочийКаталог, + Ложь, + Ложь, + , + ПеременныеСредыПроцесса + ); + + Процесс.Запустить(); + + Возврат Процесс; + +КонецФункции + +Процедура ОжидатьЗавершениеПроцесса(Процесс) + + Пока Не Процесс.Завершен Цикл + Приостановить(100); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти 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 85cb16e..905de89 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" @@ -65,14 +65,32 @@ Перем _ПарсерПараметровБенчмарковCLI; // ПарсерПараметровБенчмарковCLI +// Инициализирует команду запуска бенчмарков. &КомандаПриложения(Имя = "run", Описание = "Запуск бенчмарков") Процедура ПриСозданииОбъекта() _ПарсерПараметровБенчмарковCLI = Новый ПарсерПараметровБенчмарковCLI(); КонецПроцедуры +// Запускает бенчмарки с учетом их локальных конфигураций OneScript. &ВыполнениеКоманды Процедура Запустить() Экспорт + ФайлыКонфигурацииOneScript = Новый ЛокаторФайловКонфигурации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" new file mode 100644 index 0000000..c5a1d50 --- /dev/null +++ "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" @@ -0,0 +1,91 @@ +#Использовать fs + +#Область ПрограммныйИнтерфейс + +// Находит файлы конфигурации OneScript для переданных файлов и каталогов бенчмарков. +// Каждый файл возвращается один раз в порядке первого появления. Порядок определяется +// порядком элементов МассивФайлов и нормализованными полными путями файлов внутри каталога. +// +// Параметры: +// МассивФайлов - Массив из Строка - Пути к файлам и каталогам бенчмарков +// Рекурсивно - Булево - Искать файлы бенчмарков во вложенных каталогах +// +// Возвращаемое значение: +// Массив из Строка - Уникальные нормализованные полные пути к файлам oscript.cfg +// в порядке первого появления +Функция НайтиФайлыКонфигурации(МассивФайлов, Рекурсивно = Ложь) Экспорт + + ФайлыКонфигурации = Новый Массив(); + ДобавленныеФайлы = Новый Соответствие(); + РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков(); + РазрешенныеВходы = РазрешательВходныхФайлов.Разрешить(МассивФайлов, Рекурсивно); + + Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл + + Если Не РазрешенныйВход.Разрешен Тогда + Продолжить; + КонецЕсли; + + Если РазрешенныйВход.ВходнойКаталог <> Неопределено Тогда + ДобавитьФайлКонфигурации( + РазрешенныйВход.ВходнойКаталог, + ФайлыКонфигурации, + ДобавленныеФайлы + ); + КонецЕсли; + + Для Каждого ПолноеИмяФайла Из РазрешенныйВход.Файлы Цикл + ДобавитьФайлКонфигурации( + Новый Файл(ПолноеИмяФайла).Путь, + ФайлыКонфигурации, + ДобавленныеФайлы + ); + КонецЦикла; + + КонецЦикла; + + Возврат ФайлыКонфигурации; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ДобавитьФайлКонфигурации(Каталог, ФайлыКонфигурации, ДобавленныеФайлы) + + ПутьККонфигурации = ФС.НормализоватьПуть(ОбъединитьПути(Каталог, "oscript.cfg")); + Если Не ФС.ФайлСуществует(ПутьККонфигурации) Тогда + Возврат; + КонецЕсли; + + КлючФайла = КлючДедупликацииФайла(ПутьККонфигурации); + Если ДобавленныеФайлы.Получить(КлючФайла) <> Неопределено Тогда + Возврат; + КонецЕсли; + + ДобавленныеФайлы.Вставить(КлючФайла, Истина); + ФайлыКонфигурации.Добавить(ПутьККонфигурации); + +КонецПроцедуры + +Функция КлючДедупликацииФайла(ПутьКФайлу) + + Если ЭтоWindows() Тогда + Возврат НРег(ПутьКФайлу); + КонецЕсли; + + Возврат ПутьКФайлу; + +КонецФункции + +Функция ЭтоWindows() + + ТекущаяПлатформа = Новый СистемнаяИнформация().ТипПлатформы; + + Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Windows_x86; + +КонецФункции + +#КонецОбласти diff --git "a/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\321\200\320\265\321\210\320\260\321\202\320\265\320\273\321\214\320\222\321\205\320\276\320\264\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\321\200\320\265\321\210\320\260\321\202\320\265\320\273\321\214\320\222\321\205\320\276\320\264\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" new file mode 100644 index 0000000..7c0c6ce --- /dev/null +++ "b/src/BenchmarkOneScript/core/common/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\267\321\200\320\265\321\210\320\260\321\202\320\265\320\273\321\214\320\222\321\205\320\276\320\264\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -0,0 +1,138 @@ +#Использовать fs +#Использовать collectionos + +#Область ПрограммныйИнтерфейс + +// Разрешает входные пути к файлам и каталогам бенчмарков. +// Файлы каждого каталога возвращаются в порядке нормализованных полных путей. +// Один и тот же файл включается только для первого содержащего его входа. +// +// Параметры: +// МассивВходныхПутей - Массив из Строка - Пути к файлам и каталогам бенчмарков +// Рекурсивно - Булево - Искать *.os во вложенных каталогах +// +// Возвращаемое значение: +// Массив из Структура - Результаты разрешения входов с полями: +// ИсходныйПуть - Строка - Переданный входной путь +// Разрешен - Булево - Признак существующего файла или каталога +// ВходнойКаталог - Строка, Неопределено - Нормализованный путь входного каталога +// Файлы - Массив из Строка - Уникальные нормализованные полные пути к *.os +Функция Разрешить(МассивВходныхПутей, Рекурсивно = Ложь) Экспорт + + Результат = Новый Массив(); + ДобавленныеФайлы = Новый Соответствие(); + + Для Каждого ВходнойПуть Из МассивВходныхПутей Цикл + + Если ФС.КаталогСуществует(ВходнойПуть) Тогда + Результат.Добавить(РазрешитьКаталог(ВходнойПуть, Рекурсивно, ДобавленныеФайлы)); + Иначе + Результат.Добавить(РазрешитьФайл(ВходнойПуть, ДобавленныеФайлы)); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция РазрешитьКаталог(ВходнойПуть, Рекурсивно, ДобавленныеФайлы) + + ВходнойКаталог = ФС.НормализоватьПуть(ВходнойПуть); + НайденныеФайлы = НайтиФайлы(ВходнойКаталог, "*.os", Рекурсивно); + ПолныеИменаФайлов = ОтсортированныеПолныеИменаФайлов(НайденныеФайлы); + Файлы = УникальныеФайлы(ПолныеИменаФайлов, ДобавленныеФайлы); + + Возврат НовыйРезультатРазрешения(ВходнойПуть, Истина, ВходнойКаталог, Файлы); + +КонецФункции + +Функция РазрешитьФайл(ВходнойПуть, ДобавленныеФайлы) + + ПолноеИмяФайла = РаботаСПутямиФайловойСистемы.НайтиПолноеИмяФайлаСценария(ВходнойПуть); + Если ПолноеИмяФайла = Неопределено Тогда + Возврат НовыйРезультатРазрешения( + ВходнойПуть, + Ложь, + Неопределено, + Новый Массив() + ); + КонецЕсли; + + ПолныеИменаФайлов = Новый Массив(); + ПолныеИменаФайлов.Добавить(ПолноеИмяФайла); + Файлы = УникальныеФайлы(ПолныеИменаФайлов, ДобавленныеФайлы); + + Возврат НовыйРезультатРазрешения(ВходнойПуть, Истина, Неопределено, Файлы); + +КонецФункции + +Функция ОтсортированныеПолныеИменаФайлов(НайденныеФайлы) + + ПолныеИменаФайлов = Новый Массив(); + Для Каждого Файл Из НайденныеФайлы Цикл + ПолныеИменаФайлов.Добавить(ФС.НормализоватьПуть(Файл.ПолноеИмя)); + КонецЦикла; + + Массивы.Сортировать(ПолныеИменаФайлов, СравнениеЗначений.ПрямойПорядок()); + + Возврат ПолныеИменаФайлов; + +КонецФункции + +Функция УникальныеФайлы(ПолныеИменаФайлов, ДобавленныеФайлы) + + Результат = Новый Массив(); + + Для Каждого ПолноеИмяФайла Из ПолныеИменаФайлов Цикл + + КлючФайла = КлючДедупликацииФайла(ПолноеИмяФайла); + Если ДобавленныеФайлы.Получить(КлючФайла) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + ДобавленныеФайлы.Вставить(КлючФайла, Истина); + Результат.Добавить(ПолноеИмяФайла); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция НовыйРезультатРазрешения(ИсходныйПуть, Разрешен, ВходнойКаталог, Файлы) + + Возврат Новый Структура( + "ИсходныйПуть, Разрешен, ВходнойКаталог, Файлы", + ИсходныйПуть, + Разрешен, + ВходнойКаталог, + Файлы + ); + +КонецФункции + +Функция КлючДедупликацииФайла(ПутьКФайлу) + + Если ЭтоWindows() Тогда + Возврат НРег(ПутьКФайлу); + КонецЕсли; + + Возврат ПутьКФайлу; + +КонецФункции + +Функция ЭтоWindows() + + ТекущаяПлатформа = Новый СистемнаяИнформация().ТипПлатформы; + + Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Windows_x86; + +КонецФункции + +#КонецОбласти 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 57c7950..53f08ea 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" @@ -1,5 +1,30 @@ #Использовать fs +// Находит полный путь к файлу сценария, разрешая относительный путь и имя без расширения. +// +// Параметры: +// ИмяФайла - Строка - Путь к сценарию или его имя без расширения .os +// +// Возвращаемое значение: +// Строка - Нормализованный полный путь к найденному сценарию +// Неопределено - Если сценарий не найден +Функция НайтиПолноеИмяФайлаСценария(ИмяФайла) Экспорт + + ВариантыПутей = Новый Массив(); + ВариантыПутей.Добавить(ИмяФайла); + ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайла)); + ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайла + ".os")); + + Для Каждого ПолноеИмяФайла Из ВариантыПутей Цикл + Если ФС.ФайлСуществует(ПолноеИмяФайла) Тогда + Возврат ФС.НормализоватьПуть(ПолноеИмяФайла); + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + Функция ПолучитьАбсолютныйПуть(Путь, КаталогРазрешенияПутей) Экспорт Если ЭтоАбсолютныйПуть(Путь) Тогда @@ -60,4 +85,4 @@ Функция ЭтоWindows() Платформа = Новый СистемнаяИнформация().ТипПлатформы; Возврат Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64; -КонецФункции \ No newline at end of file +КонецФункции diff --git "a/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\255\320\272\321\200\320\260\320\275\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262\320\232\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271\320\241\321\202\321\200\320\276\320\272\320\270.os" "b/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\255\320\272\321\200\320\260\320\275\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262\320\232\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271\320\241\321\202\321\200\320\276\320\272\320\270.os" new file mode 100644 index 0000000..32a9f4d --- /dev/null +++ "b/src/BenchmarkOneScript/core/common/\320\234\320\276\320\264\321\203\320\273\320\270/\320\255\320\272\321\200\320\260\320\275\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262\320\232\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271\320\241\321\202\321\200\320\276\320\272\320\270.os" @@ -0,0 +1,105 @@ +#Область ПрограммныйИнтерфейс + +// Оборачивает путь к исполняемому файлу в двойные кавычки. +// +// Параметры: +// Строка - Строка - Путь к исполняемому файлу +// +// Возвращаемое значение: +// Строка +Функция ОбернутьИсполняемыйФайлВКавычки(Строка) Экспорт + + Кавычка = """"; + Возврат Кавычка + Строка + Кавычка; + +КонецФункции + +// Экранирует аргумент командной строки и оборачивает его в кавычки текущей платформы. +// +// Параметры: +// Строка - Строка - Аргумент командной строки +// +// Возвращаемое значение: +// Строка +Функция ОбернутьАргументКоманднойСтрокиВКавычки(Строка) Экспорт + + Если ЭтоWindows() Тогда + Возврат ОбернутьВКавычкиДляWindows(Строка); + КонецЕсли; + + Возврат ОбернутьВКавычкиДляUnix(Строка); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ОбернутьВКавычкиДляWindows(Строка) + + Кавычка = """"; + Результат = Кавычка; + КоличествоОбратныхКосыхЧерт = 0; + + Для Индекс = 1 По СтрДлина(Строка) Цикл + + ТекущийСимвол = Сред(Строка, Индекс, 1); + Если ТекущийСимвол = "\" Тогда + КоличествоОбратныхКосыхЧерт = КоличествоОбратныхКосыхЧерт + 1; + ИначеЕсли ТекущийСимвол = Кавычка Тогда + Результат = Результат + + ОбратныеКосыеЧерты(КоличествоОбратныхКосыхЧерт * 2 + 1) + + Кавычка; + КоличествоОбратныхКосыхЧерт = 0; + Иначе + Результат = Результат + + ОбратныеКосыеЧерты(КоличествоОбратныхКосыхЧерт) + + ТекущийСимвол; + КоличествоОбратныхКосыхЧерт = 0; + КонецЕсли; + + КонецЦикла; + + Возврат Результат + + ОбратныеКосыеЧерты(КоличествоОбратныхКосыхЧерт * 2) + + Кавычка; + +КонецФункции + +Функция ОбернутьВКавычкиДляUnix(Строка) + + ОдинарнаяКавычка = "'"; + ДвойнаяКавычка = """"; + ЭкранированнаяОдинарнаяКавычка = ОдинарнаяКавычка + + ДвойнаяКавычка + + ОдинарнаяКавычка + + ДвойнаяКавычка + + ОдинарнаяКавычка; + + Возврат ОдинарнаяКавычка + + СтрЗаменить(Строка, ОдинарнаяКавычка, ЭкранированнаяОдинарнаяКавычка) + + ОдинарнаяКавычка; + +КонецФункции + +Функция ОбратныеКосыеЧерты(Количество) + + Результат = ""; + Для Индекс = 1 По Количество Цикл + Результат = Результат + "\"; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ЭтоWindows() + + ТекущаяПлатформа = Новый СистемнаяИнформация().ТипПлатформы; + + Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Windows_x86; + +КонецФункции + +#КонецОбласти diff --git "a/src/BenchmarkOneScript/core/config/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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/core/config/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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 d44074d..f1de9b2 100644 --- "a/src/BenchmarkOneScript/core/config/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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/core/config/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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" @@ -1,6 +1,11 @@ +#Использовать fs #Использовать logos -Перем _ДополнительныйКаталог; // Строка +Перем _ДополнительныеФайлыКонфигурацииOneScript; // Массив +Перем _ИмяФайлаКонфигурации; // Строка +Перем _ИмяПараметраДополнительныхБиблиотек; // Строка +Перем _ИмяПараметраСистемныхБиблиотек; // Строка +Перем _УчитыватьВсеПараметрыДополнительныхФайлов; // Булево Перем _Лог; // Лог #Область ОбработчикиСобытий @@ -8,14 +13,21 @@ // Обеспечивает чтение и запись конфигурационных файлов OneScript // // Параметры: -// ДополнительныйКаталог - Строка - Дополнительный каталог для поиска файла -// oscript.cfg. Значения из этого каталога -// будут прочитаны с высоким приоритетом и -// могут переопределить настройки из других -// источников. -Процедура ПриСозданииОбъекта(ДополнительныйКаталог = "") - - _ДополнительныйКаталог = ДополнительныйКаталог; +// ДополнительныеФайлыКонфигурацииOneScript - Строка, Массив из Строка, +// ФиксированныйМассив из Строка, Неопределено - +// Пути к файлам oscript.cfg или каталогам с ними +// в порядке убывания приоритета. По умолчанию из +// этих файлов читаются только параметры lib.system +// и lib.additional. +Процедура ПриСозданииОбъекта(ДополнительныеФайлыКонфигурацииOneScript = Неопределено) + + _ИмяФайлаКонфигурации = "oscript.cfg"; + _ИмяПараметраДополнительныхБиблиотек = "lib.additional"; + _ИмяПараметраСистемныхБиблиотек = "lib.system"; + _УчитыватьВсеПараметрыДополнительныхФайлов = Ложь; + _ДополнительныеФайлыКонфигурацииOneScript = НормализоватьДополнительныеФайлыКонфигурацииOneScript( + ДополнительныеФайлыКонфигурацииOneScript + ); _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.МенеджерПараметровКонфигурацииOneScript"); КонецПроцедуры @@ -24,17 +36,31 @@ #Область ПрограммныйИнтерфейс +// Включает чтение всех параметров из дополнительных файлов oscript.cfg. +// По умолчанию из них читаются только параметры lib.system и lib.additional. +// +// Возвращаемое значение: +// МенеджерПараметровКонфигурацииOneScript - Этот объект +Функция УчитыватьВсеПараметрыДополнительныхФайлов() Экспорт + + _УчитыватьВсеПараметрыДополнительныхФайлов = Истина; + + Возврат ЭтотОбъект; + +КонецФункции + // Выполняет поиск и чтение конфигурационных файлов oscript.cfg из всех доступных источников // -// Порядок поиска файлов конфигурации: -// 1. Каталог программы +// Порядок приоритета файлов конфигурации: +// 1. Дополнительные файлы конфигурации в переданном порядке // 2. Текущий каталог -// 3. Каталог стартового сценария -// 4. Дополнительный каталог (если указан) +// 3. Каталог программы // // Особенности: -// - Настройки из файлов с более высоким приоритетом переопределяют предыдущие +// - Настройки из первого подходящего файла имеют приоритет // - Пути к библиотекам (lib.system, lib.additional) автоматически разрешаются +// - Каталоги lib.additional и lib.system из всех файлов объединяются в +// lib.additional от локального к глобальному // // Возвращаемое значение: // Соответствие @@ -51,7 +77,7 @@ // Каталог - Строка - Путь к каталогу, в котором будет создан файл oscript.cfg Процедура ЗаписатьВКаталог(Каталог) Экспорт - ПутьКФайлу = ОбъединитьПути(Каталог, "oscript.cfg"); + ПутьКФайлу = ОбъединитьПути(Каталог, _ИмяФайлаКонфигурации); ЗаписатьВФайл(ПутьКФайлу); КонецПроцедуры @@ -76,7 +102,7 @@ ЗаписьТекста.Закрыть(); _Лог.Отладка("Записаны параметры конфигурации в <%1>", ПутьКФайлу); - + КонецПроцедуры #КонецОбласти @@ -85,35 +111,129 @@ Функция НайтиИПрочитатьФайлы() - ИмяФайла = "oscript.cfg"; - - КаталогиПоиска = Новый Массив(); - КаталогиПоиска.Добавить(КаталогПрограммы()); - КаталогиПоиска.Добавить(ТекущийКаталог()); - КаталогиПоиска.Добавить(СтартовыйСценарий().Каталог); - - Если ЗначениеЗаполнено(_ДополнительныйКаталог) Тогда - КаталогиПоиска.Добавить(_ДополнительныйКаталог); - КонецЕсли; - + ИсточникиКонфигурации = СформироватьИсточникиКонфигурации(); ПрочитанныеНастройки = Новый Соответствие(); + КаталогиБиблиотек = Новый Массив(); - Для Каждого Каталог Из КаталогиПоиска Цикл + Для Каждого ИсточникКонфигурации Из ИсточникиКонфигурации Цикл - ПутьКФайлу = ОбъединитьПути(Каталог, ИмяФайла); - Если Не ФС.ФайлСуществует(ПутьКФайлу) Тогда + Если Не ФС.ФайлСуществует(ИсточникКонфигурации.ПутьКФайлу) Тогда Продолжить; КонецЕсли; - ПрочитатьКонфигурационныйФайл(ПутьКФайлу, ПрочитанныеНастройки); + НастройкиФайла = Новый Соответствие(); + ПрочитатьКонфигурационныйФайл( + ИсточникКонфигурации.ПутьКФайлу, + НастройкиФайла, + ИсточникКонфигурации.ТолькоПараметрыБиблиотек + ); + ДобавитьОтсутствующиеНастройки(ПрочитанныеНастройки, НастройкиФайла); + ДобавитьКаталогиБиблиотек( + КаталогиБиблиотек, + НастройкиФайла[_ИмяПараметраДополнительныхБиблиотек] + ); + ДобавитьКаталогиБиблиотек( + КаталогиБиблиотек, + НастройкиФайла[_ИмяПараметраСистемныхБиблиотек] + ); КонецЦикла; + Если КаталогиБиблиотек.Количество() > 0 Тогда + ПрочитанныеНастройки.Вставить( + _ИмяПараметраДополнительныхБиблиотек, + СтрСоединить(КаталогиБиблиотек, ";") + ); + КонецЕсли; + Возврат ПрочитанныеНастройки; КонецФункции -Процедура ПрочитатьКонфигурационныйФайл(ПутьКФайлу, ПрочитанныеНастройки) +Функция СформироватьИсточникиКонфигурации() + + ИсточникиКонфигурации = Новый Массив(); + Для Каждого ДополнительныйФайлКонфигурацииOneScript Из _ДополнительныеФайлыКонфигурацииOneScript Цикл + ИсточникиКонфигурации.Добавить(НовыйИсточникКонфигурации( + ДополнительныйФайлКонфигурацииOneScript, + Не _УчитыватьВсеПараметрыДополнительныхФайлов + )); + КонецЦикла; + + ИсточникиКонфигурации.Добавить(НовыйИсточникКонфигурации( + ОбъединитьПути(СтартовыйСценарий().Каталог, _ИмяФайлаКонфигурации), + Ложь + )); + + ИсточникиКонфигурации.Добавить(НовыйИсточникКонфигурации( + ОбъединитьПути(ТекущийКаталог(), _ИмяФайлаКонфигурации), + Ложь + )); + + ИсточникиКонфигурации.Добавить(НовыйИсточникКонфигурации( + ОбъединитьПути(КаталогПрограммы(), _ИмяФайлаКонфигурации), + Ложь + )); + + Возврат ИсточникиКонфигурации; + +КонецФункции + +Функция НовыйИсточникКонфигурации(ПутьКФайлу, ТолькоПараметрыБиблиотек) + + Возврат Новый Структура( + "ПутьКФайлу, ТолькоПараметрыБиблиотек", + ПутьКФайлу, + ТолькоПараметрыБиблиотек + ); + +КонецФункции + +Функция НормализоватьДополнительныеФайлыКонфигурацииOneScript(ДополнительныеФайлыКонфигурацииOneScript) + + НормализованныеФайлы = Новый Массив(); + + Если ДополнительныеФайлыКонфигурацииOneScript = Неопределено Тогда + Возврат НормализованныеФайлы; + КонецЕсли; + + ТипФайлов = ТипЗнч(ДополнительныеФайлыКонфигурацииOneScript); + Если ТипФайлов = Тип("Строка") Тогда + ДобавитьНормализованныйФайл(НормализованныеФайлы, ДополнительныеФайлыКонфигурацииOneScript); + ИначеЕсли ТипФайлов = Тип("Массив") Или ТипФайлов = Тип("ФиксированныйМассив") Тогда + Для Каждого ДополнительныйФайлКонфигурацииOneScript Из ДополнительныеФайлыКонфигурацииOneScript Цикл + ДобавитьНормализованныйФайл(НормализованныеФайлы, ДополнительныйФайлКонфигурацииOneScript); + КонецЦикла; + Иначе + ШаблонИсключения = "Дополнительные файлы конфигурации должны иметь тип Строка, Массив из Строка " + + "или ФиксированныйМассив из Строка, получен тип <%1>"; + ВызватьИсключение СтрШаблон( + ШаблонИсключения, + ТипФайлов + ); + КонецЕсли; + + Возврат НормализованныеФайлы; + +КонецФункции + +Процедура ДобавитьНормализованныйФайл(Файлы, ПутьКФайлу) + + Если ФС.КаталогСуществует(ПутьКФайлу) Тогда + ПутьКФайлу = ОбъединитьПути(ПутьКФайлу, _ИмяФайлаКонфигурации); + КонецЕсли; + + ПолныйПуть = ФС.НормализоватьПуть(ПутьКФайлу); + Если Файлы.Найти(ПолныйПуть) = Неопределено Тогда + Файлы.Добавить(ПолныйПуть); + КонецЕсли; + +КонецПроцедуры + +Процедура ПрочитатьКонфигурационныйФайл( + ПутьКФайлу, + ПрочитанныеНастройки, + ТолькоПараметрыБиблиотек = Ложь) КаталогРазрешенияПутей = Новый Файл(ПутьКФайлу).Путь; @@ -128,8 +248,14 @@ Ключ = НРег(Совпадение.Группы[1].Значение); Значение = Совпадение.Группы[2].Значение; + ЭтоПараметрБиблиотеки = Ключ = _ИмяПараметраСистемныхБиблиотек + Или Ключ = _ИмяПараметраДополнительныхБиблиотек; + + Если ТолькоПараметрыБиблиотек И Не ЭтоПараметрБиблиотеки Тогда + Продолжить; + КонецЕсли; - Если Ключ = "lib.system" Или Ключ = "lib.additional" Тогда + Если ЭтоПараметрБиблиотеки Тогда Значение = РазрешитьПутиКаталоговБиблиотекИзНастройки(Значение, КаталогРазрешенияПутей); КонецЕсли; @@ -139,13 +265,37 @@ КонецПроцедуры +Процедура ДобавитьОтсутствующиеНастройки(Приемник, Источник) + + Для Каждого Параметр Из Источник Цикл + Если Приемник[Параметр.Ключ] = Неопределено Тогда + Приемник.Вставить(Параметр.Ключ, Параметр.Значение); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьКаталогиБиблиотек(КаталогиБиблиотек, КаталогиСтрокой) + + Если Не ЗначениеЗаполнено(КаталогиСтрокой) Тогда + Возврат; + КонецЕсли; + + Для Каждого Каталог Из СтрРазделить(КаталогиСтрокой, ";", Ложь) Цикл + Если КаталогиБиблиотек.Найти(Каталог) = Неопределено Тогда + КаталогиБиблиотек.Добавить(Каталог); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + Функция РазрешитьПутиКаталоговБиблиотекИзНастройки(КаталогиСтрокой, КаталогРазрешенияПутей) Каталоги = СтрРазделить(КаталогиСтрокой, ";", Ложь); РазрешенныеКаталоги = Новый Массив(); Для Каждого Каталог Из Каталоги Цикл - АбсолютныйПуть = ПолучитьАбсолютныйПуть(Каталог, КаталогРазрешенияПутей); + АбсолютныйПуть = ПолучитьАбсолютныйПуть(СокрЛП(Каталог), КаталогРазрешенияПутей); РазрешенныеКаталоги.Добавить(АбсолютныйПуть); КонецЦикла; diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 3c8b33e..cf258e3 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,6 +1,5 @@ #Использовать fs #Использовать logos -#Использовать collectionos Перем _Лог; // Лог Перем _МассивФайлов; // Массив из Строка @@ -114,47 +113,39 @@ Функция НайтиГруппыФайловБенчмарков() ГруппыФайлов = Новый Массив(); - ДобавленныеИсходныеФайлы = Новый МножествоКарта(); ГруппаОбычныхАлгоритмов = Неопределено; + РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков(); + РазрешенныеВходы = РазрешательВходныхФайлов.Разрешить(_МассивФайлов, _Рекурсивно); - Для Каждого ИмяФайла Из _МассивФайлов Цикл + Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл - Если ФС.КаталогСуществует(ИмяФайла) Тогда - - НайденныеФайлы = НайтиФайлы(ИмяФайла, "*.os", _Рекурсивно); - - Для Каждого Файл Из НайденныеФайлы Цикл - - Если ДобавленныеИсходныеФайлы.Содержит(Файл.ПолноеИмя) Тогда - Продолжить; - КонецЕсли; + Если Не РазрешенныйВход.Разрешен Тогда + ВызватьИсключение СтрШаблон("Файл <%1> не существует", РазрешенныйВход.ИсходныйПуть); + КонецЕсли; - ДобавленныеИсходныеФайлы.Добавить(Файл.ПолноеИмя); - ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(Файл.ПолноеИмя), Ложь)); - + Если РазрешенныйВход.ВходнойКаталог <> Неопределено Тогда + Для Каждого ПолноеИмяФайла Из РазрешенныйВход.Файлы Цикл + ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(ПолноеИмяФайла), Ложь)); КонецЦикла; + Продолжить; + КонецЕсли; - Иначе + Для Каждого ПолноеИмяФайла Из РазрешенныйВход.Файлы Цикл - ПолноеИмяФайла = ПолноеИмяФайлаСценария(ИмяФайла); - Если ДобавленныеИсходныеФайлы.Содержит(ПолноеИмяФайла) Тогда + Если _ПодготовительФайлаБенчмарка.СодержитБенчмарки(ПолноеИмяФайла) Тогда + ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(ПолноеИмяФайла), Ложь)); Продолжить; КонецЕсли; - ДобавленныеИсходныеФайлы.Добавить(ПолноеИмяФайла); + Если ГруппаОбычныхАлгоритмов = Неопределено Тогда + ГруппаОбычныхАлгоритмов = НоваяГруппаФайловБенчмарков(Новый Массив(), Истина); + ГруппыФайлов.Добавить(ГруппаОбычныхАлгоритмов); + КонецЕсли; - Если _ПодготовительФайлаБенчмарка.СодержитБенчмарки(ПолноеИмяФайла) Тогда - ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(ПолноеИмяФайла), Ложь)); - Иначе - Если ГруппаОбычныхАлгоритмов = Неопределено Тогда - ГруппаОбычныхАлгоритмов = НоваяГруппаФайловБенчмарков(Новый Массив(), Истина); - ГруппыФайлов.Добавить(ГруппаОбычныхАлгоритмов); - КонецЕсли; + ГруппаОбычныхАлгоритмов.Файлы.Добавить(_ПодготовительФайлаБенчмарка.Подготовить(ПолноеИмяФайла)); - ГруппаОбычныхАлгоритмов.Файлы.Добавить(_ПодготовительФайлаБенчмарка.Подготовить(ПолноеИмяФайла)); - КонецЕсли; + КонецЦикла; - КонецЕсли; КонецЦикла; @@ -289,21 +280,4 @@ КонецПроцедуры -Функция ПолноеИмяФайлаСценария(ИмяФайла) - - ВариантыПутей = Новый Массив(); - ВариантыПутей.Добавить(ИмяФайла); - ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайла)); - ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайла + ".os")); - - Для Каждого ПолноеИмяФайла Из ВариантыПутей Цикл - Если ФС.ФайлСуществует(ПолноеИмяФайла) Тогда - Возврат ФС.НормализоватьПуть(ПолноеИмяФайла); - КонецЕсли; - КонецЦикла; - - ВызватьИсключение СтрШаблон("Файл <%1> не существует", ИмяФайла); - -КонецФункции - #КонецОбласти diff --git "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index a246c43..3e550ce 100644 --- "a/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/running/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -42,7 +42,10 @@ _СценарийЗапуска = Новый СценарийЗапускаБенчмарка(_ДескрипторыБенчмарков, _КонфигурацияЗапуска); КаталогРасположенияБенчмарка = Новый Файл(ПутьКФайлуБенчмарка()).Путь; - _МенеджерПараметровКонфигурации = Новый МенеджерПараметровКонфигурацииOneScript(КаталогРасположенияБенчмарка); + ПутьКФайлуКонфигурацииOneScript = ОбъединитьПути(КаталогРасположенияБенчмарка, "oscript.cfg"); + _МенеджерПараметровКонфигурации = Новый МенеджерПараметровКонфигурацииOneScript( + ПутьКФайлуКонфигурацииOneScript + ).УчитыватьВсеПараметрыДополнительныхФайлов(); _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.МенеджерПроцессовБенчмарков"); @@ -115,7 +118,16 @@ _Лог.Отладка("Строка запуска <%1>", СтрокаКоманды); Попытка - Процесс = СоздатьПроцесс(СтрокаКоманды, РабочийКаталог, Истина); + ПеременныеСредыПроцесса = Новый Соответствие(); + ПеременныеСредыПроцесса.Вставить("OSCRIPT_CONFIG", ""); + Процесс = СоздатьПроцесс( + СтрокаКоманды, + РабочийКаталог, + Истина, + Ложь, + , + ПеременныеСредыПроцесса + ); Процесс.Запустить(); Исключение УдалитьАртефакты(); @@ -133,13 +145,21 @@ Функция СформироватьСтрокуКоманды(ПутьИсполняемогоФайла, ПутьСтартовогоСценария) СтрокаКоманды = Новый Массив(); - СтрокаКоманды.Добавить(ОбернутьВКавычкиДляWindows(ПутьИсполняемогоФайла)); + СтрокаКоманды.Добавить( + ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки( + ПутьИсполняемогоФайла + ) + ); Если _ПортОтладки > 0 Тогда СтрокаКоманды.Добавить("-debug=" + Формат(_ПортОтладки, "ЧГ=")); КонецЕсли; - СтрокаКоманды.Добавить(ОбернутьВКавычки(ПутьСтартовогоСценария)); + СтрокаКоманды.Добавить( + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + ПутьСтартовогоСценария + ) + ); СтрокаКоманды = СтрСоединить(СтрокаКоманды, " "); Возврат СтрокаКоманды; @@ -332,27 +352,4 @@ _МенеджерВременныхФайлов.Удалить(); КонецПроцедуры -Функция ОбернутьВКавычки(Строка) - Кавычка = ?(ЭтоWindows(), """", "'"); - Возврат СтрШаблон("%2%1%2", Строка, Кавычка); -КонецФункции - -Функция ОбернутьВКавычкиДляWindows(Строка) - Если ЭтоWindows() Тогда - Возврат ОбернутьВКавычки(Строка); - Иначе - Возврат Строка; - КонецЕсли; -КонецФункции - -Функция ЭтоWindows() - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ТекущаяПлатформа = СистемнаяИнформация.ТипПлатформы; - - Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 - Или ТекущаяПлатформа = ТипПлатформы.Windows_x86; - -КонецФункции - #КонецОбласти 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 366a8bb..613db47 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" @@ -1,3 +1,4 @@ +#Использовать fs #Использовать tempfiles #Использовать logos @@ -31,8 +32,9 @@ // Подготавливает файл для запуска через стандартный пайплайн бенчмарков. // // Если файл уже содержит хотя бы один бенчмарк, возвращается исходный путь. -// Если бенчмарков нет, создается временный файл, в котором код модуля -// оборачивается в процедуру с аннотацией &Бенчмарк. +// Если бенчмарков нет, создается отдельный временный каталог. В него записывается +// файл с кодом модуля, обернутым в процедуру с аннотацией &Бенчмарк. Если рядом +// с исходным файлом есть oscript.cfg, его настройки записываются в тот же каталог. // // Параметры: // ПутьКФайлу - Строка - Путь к исходному файлу сценария @@ -47,7 +49,7 @@ КонецЕсли; ОписаниеАлгоритма = ОписаниеАлгоритмаИзФайла(ПутьКФайлу, СодержимоеФайла); - ПутьКВременномуФайлу = СоздатьВременныйФайлБенчмарка(ОписаниеАлгоритма); + ПутьКВременномуФайлу = СоздатьВременныйФайлБенчмарка(ОписаниеАлгоритма, ПутьКФайлу); _Лог.Отладка("Создан временный файл <%1> для запуска алгоритма из <%2>", ПутьКВременномуФайлу, ПутьКФайлу); @@ -68,7 +70,7 @@ КонецФункции -// Удаляет все временные файлы, созданные в процессе подготовки. +// Удаляет все временные файлы и каталоги, созданные в процессе подготовки. // // Метод следует вызывать после завершения запуска или при ошибке, чтобы // освободить накопленные временные ресурсы. @@ -138,15 +140,44 @@ КонецФункции -Функция СоздатьВременныйФайлБенчмарка(ОписаниеАлгоритма) +Функция СоздатьВременныйФайлБенчмарка(ОписаниеАлгоритма, ПутьКИсходномуФайлу) - ПутьКВременномуФайлу = _МенеджерВременныхФайлов.НовоеИмяФайла("os"); - ЗаписатьФайл(ПутьКВременномуФайлу, ТекстВременногоБенчмарка(ОписаниеАлгоритма)); + Каталог = _МенеджерВременныхФайлов.СоздатьКаталог(); - Возврат ПутьКВременномуФайлу; + ПутьКФайлуБенчмарка = СоздатьФайлБенчмарка(ОписаниеАлгоритма, Каталог); + СоздатьФайлКонфигурацииOneScript(ПутьКИсходномуФайлу, Каталог); + + Возврат ПутьКФайлуБенчмарка; + +КонецФункции + +Функция СоздатьФайлБенчмарка(ОписаниеАлгоритма, Каталог) + + ПутьКФайлу = ОбъединитьПути( + Каталог, + ОписаниеАлгоритма.ИмяФайла + ".os" + ); + ЗаписатьФайл(ПутьКФайлу, ТекстВременногоБенчмарка(ОписаниеАлгоритма)); + + Возврат ПутьКФайлу; КонецФункции +Процедура СоздатьФайлКонфигурацииOneScript(ПутьКИсходномуФайлу, Каталог) + + КаталогИсходногоФайла = Новый Файл(ПутьКИсходномуФайлу).Путь; + ПутьКФайлуКонфигурацииOneScript = ОбъединитьПути(КаталогИсходногоФайла, "oscript.cfg"); + + Если Не ФС.ФайлСуществует(ПутьКФайлуКонфигурацииOneScript) Тогда + Возврат; + КонецЕсли; + + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ПутьКФайлуКонфигурацииOneScript); + МенеджерПараметров.УчитыватьВсеПараметрыДополнительныхФайлов(); + МенеджерПараметров.ЗаписатьВКаталог(Каталог); + +КонецПроцедуры + Функция ТекстВременногоБенчмарка(ОписаниеАлгоритма) ЧастиФайла = Новый Массив(); diff --git "a/src/BenchmarkOneScript/core/serialization/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/core/serialization/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" index 394afef..48d4e7d 100644 --- "a/src/BenchmarkOneScript/core/serialization/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" +++ "b/src/BenchmarkOneScript/core/serialization/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -3,6 +3,7 @@ #Использовать annotations #Использовать validate +#Использовать logos #Область ОписаниеПеременных diff --git "a/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 112eb9e..5a14c13 100644 --- "a/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,6 +1,7 @@ #Использовать "../../.." #Использовать fs #Использовать 1commands +#Использовать logos Перем _Лог; // Лог diff --git "a/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262.os" "b/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262.os" new file mode 100644 index 0000000..92b0341 --- /dev/null +++ "b/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262.os" @@ -0,0 +1,58 @@ +#Использовать "../../.." + +#Область ПрограммныйИнтерфейс + +// Выполняет команду в тестовом процессе и объединяет его стандартный вывод и поток ошибок. +// Ожидание завершения ограничено 60 секундами. +// +// Параметры: +// СтрокаКоманды - Строка - Команда запуска процесса +// РабочийКаталог - Строка - Рабочий каталог процесса +// +// Возвращаемое значение: +// Структура: +// * КодВозврата - Число - Код возврата процесса +// * Вывод - Строка - Объединенные стандартный вывод и поток ошибок +Функция ВыполнитьКоманду(СтрокаКоманды, РабочийКаталог) Экспорт + + Процесс = СоздатьПроцесс(СтрокаКоманды, РабочийКаталог, Истина); + Процесс.Запустить(); + + Вывод = ""; + ВремяНачала = ТекущаяУниверсальнаяДата(); + Пока Не Процесс.Завершен Цикл + Приостановить(100); + Вывод = Вывод + ПрочитатьВывод(Процесс); + + Если ТекущаяУниверсальнаяДата() - ВремяНачала >= 60 Тогда + Процесс.Завершить(); + ВызватьИсключение "Превышено время ожидания завершения тестового процесса"; + КонецЕсли; + КонецЦикла; + + Вывод = Вывод + ПрочитатьВывод(Процесс); + + Возврат Новый Структура("КодВозврата, Вывод", Процесс.КодВозврата, Вывод); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПрочитатьВывод(Процесс) + + Вывод = ""; + Если Процесс.ПотокВывода.ЕстьДанные Тогда + Вывод = Вывод + Процесс.ПотокВывода.Прочитать(); + КонецЕсли; + + Если Процесс.ПотокОшибок.ЕстьДанные Тогда + Вывод = Вывод + Процесс.ПотокОшибок.Прочитать(); + КонецЕсли; + + Возврат Вывод; + +КонецФункции + +#КонецОбласти diff --git a/tests/oscript.cfg b/tests/oscript.cfg new file mode 100644 index 0000000..768af52 --- /dev/null +++ b/tests/oscript.cfg @@ -0,0 +1,3 @@ +lib.system = ../oscript_modules +systemlanguage = ru +lang.explicitImports = off \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\227\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\217\320\241\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\265\320\271OneScript.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\227\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\217\320\241\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\265\320\271OneScript.os" new file mode 100644 index 0000000..547665a --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\227\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\217\320\241\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\265\320\271OneScript.os" @@ -0,0 +1,274 @@ +// BSLLS:LineLength-off + +#Использовать asserts +#Использовать fs +#Использовать tempfiles +#Использовать "helpers" +#Использовать "../src/BenchmarkOneScript/cmd" + +Перем _ИсходныйТекущийКаталог; // Строка +Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов +Перем _ИсходнаяТрассировкаЗагрузкиБиблиотек; // Строка +Перем _ИсходныйМаркерПримененияКонфигурацииOneScript; // Строка + +#Область ОбработчикиСобытий + +&Инициализация +Процедура ПередВсеми() Экспорт + + _ИсходныйТекущийКаталог = ТекущийКаталог(); + _МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); + _ИсходнаяТрассировкаЗагрузкиБиблиотек = ПолучитьПеременнуюСреды("OSLIB_LOADER_TRACE"); + _ИсходныйМаркерПримененияКонфигурацииOneScript = ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED"); + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + +КонецПроцедуры + +&После +Процедура ПослеЗапускаТеста() Экспорт + + КаталогАртефактов = ".\BenchmarkArtifacts"; + + ФС.УдалитьФайлы(КаталогАртефактов); + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + +КонецПроцедуры + +&Завершение +Процедура ПослеВсех() Экспорт + + _МенеджерВременныхФайлов.Удалить(); + УстановитьПеременнуюСреды("OSLIB_LOADER_TRACE", _ИсходнаяТрассировкаЗагрузкиБиблиотек); + УстановитьПеременнуюСреды( + "BENCHOS_OSCRIPT_CONFIG_APPLIED", + _ИсходныйМаркерПримененияКонфигурацииOneScript + ); + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + +КонецПроцедуры + +#КонецОбласти + +#Область Тесты + +&Тест +Процедура ТестДолжен_НеПерезапускатьПриложениеПриУстановленномМаркере() Экспорт + + // Подготовка + КаталогКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКФайлуКонфигурации = ОбъединитьПути(КаталогКонфигурации, "oscript.cfg"); + ЗаписатьТекст(ПутьКФайлуКонфигурации, "lib.system=."); + ФайлыКонфигурацииOneScript = Новый Массив(); + ФайлыКонфигурацииOneScript.Добавить(ПутьКФайлуКонфигурации); + КаталогКоманд = ОбъединитьПути( + ТекущийКаталог(), + "src", + "BenchmarkOneScript", + "cmd" + ); + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", "1"); + Запускатель = Новый ЗапускательПриложенияСКонфигурациейOneScript(); + + // Действие + Результат = Запускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + + // Проверка + Ожидаем.Что(Результат).Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеПерезапускатьПриложениеБезКонфигурацийOneScript() Экспорт + + // Подготовка + КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); + ФайлыКонфигурацииOneScript = Новый Массив(); + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + Запускатель = Новый ЗапускательПриложенияСКонфигурациейOneScript(); + УстановитьТекущийКаталог(КаталогЗапуска); + + // Действие + Результат = Запускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + + // Проверка + Ожидаем.Что(Результат).Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПерезапуститьПриложениеПриПереданнойКонфигурацииOneScript() Экспорт + + // Подготовка + ФайлыКонфигурацииOneScript = Новый Массив(); + ФайлыКонфигурацииOneScript.Добавить( + ОбъединитьПути(ТекущийКаталог(), "tests", "oscript.cfg") + ); + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + Запускатель = Новый ЗапускательПриложенияСКонфигурациейOneScript(); + + // Действие + Результат = Запускатель.ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript); + + // Проверка + Ожидаем.Что(Результат).Не_().Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ОдинРазПерезапуститьRunСКонфигурациямиOneScript() Экспорт + + // Подготовка + КаталогЗапуска = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогПроекта = ФС.НормализоватьПуть(ТекущийКаталог()); + КаталогКоманд = ОбъединитьПути(КаталогПроекта, "src", "BenchmarkOneScript", "cmd"); + ПутьКСтартовомуСценарию = ФС.НормализоватьПуть(ОбъединитьПути(КаталогКоманд, "main.os")); + КаталогПервогоБенчмарка = ОбъединитьПути(КаталогЗапуска, "first benchmarks"); + КаталогЗависимостейПервогоБенчмарка = ОбъединитьПути(КаталогЗапуска, "first dependencies"); + ИмяКаталогаВторогоБенчмарка = "second benchmarks"; + КаталогВторогоБенчмарка = ОбъединитьПути(КаталогЗапуска, ИмяКаталогаВторогоБенчмарка); + КаталогЗависимостейВторогоБенчмарка = ОбъединитьПути(КаталогЗапуска, "second dependencies"); + УстановитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED", ""); + + ЗаписатьТекст( + ОбъединитьПути(КаталогЗапуска, "oscript.cfg"), + СтрШаблон( + "lib.system=%1", + ФС.НормализоватьПуть(ОбъединитьПути(КаталогПроекта, "oscript_modules")) + ) + ); + СоздатьБенчмаркСЛокальнойЗависимостью( + КаталогПервогоБенчмарка, + "shareddependency", + "ОбщаяЗависимость", + "ПервыйБенчмарк", + 1, + КаталогПервогоБенчмарка, + КаталогЗависимостейПервогоБенчмарка + ); + СоздатьБенчмаркСЛокальнойЗависимостью( + КаталогВторогоБенчмарка, + "shareddependency", + "ОбщаяЗависимость", + "ВторойБенчмарк", + 2, + КаталогВторогоБенчмарка, + КаталогЗависимостейВторогоБенчмарка + ); + АргументВторогоБенчмарка = + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + ИмяКаталогаВторогоБенчмарка + ПолучитьРазделительПути() + ); + + СтрокаКоманды = СтрШаблон( + "%1 %2 run --iterationCount 1 --warmupCount 0 --invocationCount 1 --iterationTime 1 %3 %4", + ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки("oscript"), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + ПутьКСтартовомуСценарию + ), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + "first benchmarks" + ), + АргументВторогоБенчмарка + ); + УстановитьПеременнуюСреды("OSLIB_LOADER_TRACE", "1"); + + // Действие + Результат = ТестированиеПроцессов.ВыполнитьКоманду(СтрокаКоманды, КаталогЗапуска); + + // Проверка + Ожидаем.Что(Результат.КодВозврата, Результат.Вывод).Равно(0); + Ожидаем.Что(Результат.Вывод).Содержит("ПервыйБенчмарк"); + Ожидаем.Что(Результат.Вывод).Содержит("ВторойБенчмарк"); + Ожидаем.Что(Результат.Вывод).Не_().Содержит("Не удалось подключить файл бенчмарка"); + Ожидаем.Что( + КоличествоЗагрузокБиблиотеки(Результат.Вывод, "cmd"), + Результат.Вывод + ).Равно(2); + Ожидаем.Что(ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED")).Не_().Заполнено(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура СоздатьБенчмаркСЛокальнойЗависимостью( + КаталогБенчмарка, + ИмяПакета, + ИмяМодуля, + ИмяМетода, + ОжидаемоеЗначение, + КаталогКонфигурацииOneScript = Неопределено, + КаталогЛокальныхБиблиотек = Неопределено +) + + Если КаталогКонфигурацииOneScript = Неопределено Тогда + КаталогКонфигурацииOneScript = КаталогБенчмарка; + КонецЕсли; + + Если КаталогЛокальныхБиблиотек = Неопределено Тогда + КаталогЛокальныхБиблиотек = ОбъединитьПути(КаталогКонфигурацииOneScript, "oscript_modules"); + КонецЕсли; + + КаталогМодулейПакета = ОбъединитьПути(КаталогЛокальныхБиблиотек, ИмяПакета, "src", "Модули"); + ФС.ОбеспечитьКаталог(КаталогБенчмарка); + ФС.ОбеспечитьКаталог(КаталогМодулейПакета); + КопироватьФайл( + ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "package-loader.os"), + ОбъединитьПути(КаталогЛокальныхБиблиотек, "package-loader.os") + ); + + ЗаписатьТекст( + ОбъединитьПути(КаталогКонфигурацииOneScript, "oscript.cfg"), + "lib.system=" + ФС.НормализоватьПуть(КаталогЛокальныхБиблиотек) + ); + ЗаписатьТекст( + ОбъединитьПути(КаталогМодулейПакета, ИмяМодуля + ".os"), + СтрШаблон( + "Функция ПолучитьЗначение() Экспорт + | Возврат %1; + |КонецФункции", + ОжидаемоеЗначение + ) + ); + ЗаписатьТекст( + ОбъединитьПути(КаталогБенчмарка, ИмяМетода + ".os"), + СтрШаблон( + "#Использовать %1 + | + |&Бенчмарк + |Процедура %2() Экспорт + | Если %3.ПолучитьЗначение() <> %4 Тогда + | ВызватьИсключение ""Локальная зависимость вернула неожиданное значение""; + | КонецЕсли; + |КонецПроцедуры", + ИмяПакета, + ИмяМетода, + ИмяМодуля, + ОжидаемоеЗначение + ) + ); + +КонецПроцедуры + +Функция КоличествоЗагрузокБиблиотеки(Вывод, ИмяБиблиотеки) + + Шаблон = СтрШаблон( + "(?im)ПриЗагрузкеБиблиотеки[ \t]+[^\r\n]*[/\\]%1\r?$", + ИмяБиблиотеки + ); + РегулярноеВыражение = Новый РегулярноеВыражение(Шаблон); + + Возврат РегулярноеВыражение.НайтиСовпадения(Вывод).Количество(); + +КонецФункции + +Процедура ЗаписатьТекст(ПутьКФайлу, Текст) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +#КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\276\320\262\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\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 69b0425..df6fed4 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\276\320\262\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\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\217\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -62,6 +62,23 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_ПодготовитьЯвныйФайлБезРасширенияOS() Экспорт + + // Подготовка + ФайлыДляЗапуска = МассивФайлов("./tests/fixtures/АлгоритмБезАннотации"); + + // Действие + Сообщения = ПолучитьСообщенияПодготовителяФайлаБенчмарка(ФайлыДляЗапуска); + + // Проверка + Ожидаем.Что(Сообщения).ИмеетДлину(1); + Ожидаем.Что(Сообщения[0]).Содержит( + "для запуска алгоритма из <" + ПолныйПутьКФайлу("./tests/fixtures/АлгоритмБезАннотации.os") + ">" + ); + +КонецПроцедуры + &Тест Процедура ТестДолжен_НеПодготавливатьФайлыИзКаталогаСКлассическимиБенчмарками() Экспорт 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" new file mode 100644 index 0000000..e79aa13 --- /dev/null +++ "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" @@ -0,0 +1,275 @@ +#Использовать asserts +#Использовать fs +#Использовать tempfiles +#Использовать "helpers" +#Использовать "../src/BenchmarkOneScript/cmd" + +Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов +Перем _ИсходныйТекущийКаталог; // Строка +Перем _Локатор; // ЛокаторФайловКонфигурацииOneScript + +#Область ОбработчикиСобытий + +&Инициализация +Процедура ПередВсеми() Экспорт + + _МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); + _ИсходныйТекущийКаталог = ТекущийКаталог(); + _Локатор = Новый ЛокаторФайловКонфигурацииOneScript(); + +КонецПроцедуры + +&После +Процедура ПослеЗапускаТеста() Экспорт + + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + +КонецПроцедуры + +&Завершение +Процедура ПослеВсех() Экспорт + + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + _МенеджерВременныхФайлов.Удалить(); + +КонецПроцедуры + +#КонецОбласти + +#Область Тесты + +&Тест +Процедура ТестДолжен_СохранитьПриоритетФайловИУдалитьПовторы() Экспорт + + // Подготовка + ПервыйКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ВторойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + СоздатьБенчмаркСКонфигурацией(ПервыйКаталог, "ПервыйБенчмарк.os"); + СоздатьБенчмаркСКонфигурацией(ВторойКаталог, "ВторойБенчмарк.os"); + + МассивФайлов = Новый Массив(); + МассивФайлов.Добавить(ПервыйКаталог); + МассивФайлов.Добавить(ВторойКаталог); + МассивФайлов.Добавить(ПервыйКаталог); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(2); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(ПервыйКаталог)); + Ожидаем.Что(ФайлыКонфигурации[1]).Равно(ПутьККонфигурации(ВторойКаталог)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НайтиКонфигурациюКаталогаБезПоискаСценариев() Экспорт + + // Подготовка + Каталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьТекст(ПутьККонфигурации(Каталог), ""); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации( + МассивИзОдногоЗначения(Каталог) + ); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(1); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(Каталог)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_УчитыватьРегистрКаталоговСогласноПравиламПлатформы() Экспорт + + // Подготовка + КорневойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогВНижнемРегистре = ОбъединитьПути(КорневойКаталог, "case-config"); + КаталогВВерхнемРегистре = ОбъединитьПути(КорневойКаталог, "CASE-CONFIG"); + СоздатьКаталог(КаталогВНижнемРегистре); + СоздатьБенчмаркСКонфигурацией(КаталогВНижнемРегистре, "Бенчмарк.os"); + + Если Не ЭтоWindows() Тогда + СоздатьКаталог(КаталогВВерхнемРегистре); + СоздатьБенчмаркСКонфигурацией(КаталогВВерхнемРегистре, "Бенчмарк.os"); + КонецЕсли; + + МассивФайлов = Новый Массив(); + МассивФайлов.Добавить(КаталогВНижнемРегистре); + МассивФайлов.Добавить(КаталогВВерхнемРегистре); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + + // Проверка + Если ЭтоWindows() Тогда + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(1); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(КаталогВНижнемРегистре)); + Иначе + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(2); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(КаталогВНижнемРегистре)); + Ожидаем.Что(ФайлыКонфигурации[1]).Равно(ПутьККонфигурации(КаталогВВерхнемРегистре)); + КонецЕсли; + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НайтиКонфигурациюВложенногоБенчмаркаТолькоПриРекурсивномПоиске() Экспорт + + // Подготовка + КорневойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ВложенныйКаталог = ОбъединитьПути(КорневойКаталог, "Вложенный"); + СоздатьКаталог(ВложенныйКаталог); + СоздатьБенчмаркСКонфигурацией(ВложенныйКаталог, "ВложенныйБенчмарк.os"); + МассивФайлов = МассивИзОдногоЗначения(КорневойКаталог); + + // Действие + ФайлыБезРекурсии = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + ФайлыСРекурсией = _Локатор.НайтиФайлыКонфигурации(МассивФайлов, Истина); + + // Проверка + Ожидаем.Что(ФайлыБезРекурсии).ИмеетДлину(0); + Ожидаем.Что(ФайлыСРекурсией).ИмеетДлину(1); + Ожидаем.Что(ФайлыСРекурсией[0]).Равно(ПутьККонфигурации(ВложенныйКаталог)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьКонфигурациюКорневогоКаталогаПриРекурсивномПоиске() Экспорт + + // Подготовка + КорневойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ВложенныйКаталог = ОбъединитьПути(КорневойКаталог, "Вложенный"); + СоздатьКаталог(ВложенныйКаталог); + ЗаписатьТекст(ПутьККонфигурации(КорневойКаталог), ""); + СоздатьБенчмаркСКонфигурацией(ВложенныйКаталог, "ВложенныйБенчмарк.os"); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации( + МассивИзОдногоЗначения(КорневойКаталог), + Истина + ); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(2); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(КорневойКаталог)); + Ожидаем.Что(ФайлыКонфигурации[1]).Равно(ПутьККонфигурации(ВложенныйКаталог)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_УпорядочитьВложенныеФайлыКонфигурацииПоПолномуПути() Экспорт + + // Подготовка + КорневойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПоследнийКаталог = ОбъединитьПути(КорневойКаталог, "z-last"); + СреднийКаталог = ОбъединитьПути(КорневойКаталог, "m-middle"); + ПервыйКаталог = ОбъединитьПути(КорневойКаталог, "a-first"); + СоздатьКаталог(ПоследнийКаталог); + СоздатьБенчмаркСКонфигурацией(ПоследнийКаталог, "Бенчмарк.os"); + СоздатьКаталог(СреднийКаталог); + СоздатьБенчмаркСКонфигурацией(СреднийКаталог, "Бенчмарк.os"); + СоздатьКаталог(ПервыйКаталог); + СоздатьБенчмаркСКонфигурацией(ПервыйКаталог, "Бенчмарк.os"); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации( + МассивИзОдногоЗначения(КорневойКаталог), + Истина + ); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(3); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ПутьККонфигурации(ПервыйКаталог)); + Ожидаем.Что(ФайлыКонфигурации[1]).Равно(ПутьККонфигурации(СреднийКаталог)); + Ожидаем.Что(ФайлыКонфигурации[2]).Равно(ПутьККонфигурации(ПоследнийКаталог)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазрешитьЯвныйФайлБезРасширенияOS() Экспорт + + // Подготовка + КаталогБенчмарка = _МенеджерВременныхФайлов.СоздатьКаталог(); + СоздатьБенчмаркСКонфигурацией(КаталогБенчмарка, "ЯвныйБенчмарк.os"); + МассивФайлов = МассивИзОдногоЗначения("ЯвныйБенчмарк"); + УстановитьТекущийКаталог(КаталогБенчмарка); + ОжидаемыйПутьККонфигурации = ФС.НормализоватьПуть("oscript.cfg"); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(1); + Ожидаем.Что(ФайлыКонфигурации[0]).Равно(ОжидаемыйПутьККонфигурации); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ИгнорироватьПутиБезКонфигурацииИНесуществующиеПути() Экспорт + + // Подготовка + КаталогБенчмарков = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогЯвногоФайла = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКЯвномуФайлу = ОбъединитьПути(КаталогЯвногоФайла, "ЯвныйБенчмарк.os"); + ЗаписатьТекст(ОбъединитьПути(КаталогБенчмарков, "БенчмаркИзКаталога.os"), ""); + ЗаписатьТекст(ПутьКЯвномуФайлу, ""); + + МассивФайлов = Новый Массив(); + МассивФайлов.Добавить(КаталогБенчмарков); + МассивФайлов.Добавить(ПутьКЯвномуФайлу); + МассивФайлов.Добавить(ОбъединитьПути(КаталогБенчмарков, "НесуществующийБенчмарк")); + + // Действие + ФайлыКонфигурации = _Локатор.НайтиФайлыКонфигурации(МассивФайлов); + + // Проверка + Ожидаем.Что(ФайлыКонфигурации).ИмеетДлину(0); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура СоздатьБенчмаркСКонфигурацией(Каталог, ИмяФайла) + + ЗаписатьТекст(ОбъединитьПути(Каталог, ИмяФайла), ""); + ЗаписатьТекст(ОбъединитьПути(Каталог, "oscript.cfg"), ""); + +КонецПроцедуры + +Процедура ЗаписатьТекст(ПутьКФайлу, Текст) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +Функция МассивИзОдногоЗначения(Значение) + + Результат = Новый Массив(); + Результат.Добавить(Значение); + + Возврат Результат; + +КонецФункции + +Функция ПутьККонфигурации(Каталог) + + Возврат ФС.НормализоватьПуть(ОбъединитьПути(Каталог, "oscript.cfg")); + +КонецФункции + +Функция ЭтоWindows() + + ТекущаяПлатформа = Новый СистемнаяИнформация().ТипПлатформы; + + Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64 + Или ТекущаяПлатформа = ТипПлатформы.Windows_x86; + +КонецФункции + +#КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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" new file mode 100644 index 0000000..9fbba0b --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\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" @@ -0,0 +1,334 @@ +// BSLLS:LineLength-off + +#Использовать asserts +#Использовать tempfiles +#Использовать "helpers" +#Использовать "../src/BenchmarkOneScript/cmd" + +Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов +Перем _ИсходныйТекущийКаталог; // Строка +Перем _ПутьКМенеджеруПараметров; // Строка + +#Область ОбработчикиСобытий + +&Инициализация +Процедура ПередВсеми() Экспорт + + _МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); + _ИсходныйТекущийКаталог = ТекущийКаталог(); + +КонецПроцедуры + +&После +Процедура ПослеЗапускаТеста() Экспорт + + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + +КонецПроцедуры + +&Завершение +Процедура ПослеВсех() Экспорт + + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + _МенеджерВременныхФайлов.Удалить(); + +КонецПроцедуры + +#КонецОбласти + +#Область Тесты + +&Тест +Процедура ТестДолжен_ПриниматьСтрокуИФиксированныйМассивФайловКонфигурацииOneScript() Экспорт + + // Подготовка + КаталогКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьКонфигурацию( + КаталогКонфигурации, + "benchmark-system", + "benchmark-additional" + ); + + ПутьКДополнительнойКонфигурации = ПутьКФайлуКонфигурации(КаталогКонфигурации); + ФайлыКонфигурацииOneScript = Новый Массив(); + ФайлыКонфигурацииOneScript.Добавить(ПутьКДополнительнойКонфигурации); + ФиксированныеФайлыКонфигурацииOneScript = Новый ФиксированныйМассив(ФайлыКонфигурацииOneScript); + + // Действие + ПараметрыИзСтроки = Новый МенеджерПараметровКонфигурацииOneScript( + ПутьКДополнительнойКонфигурации + ).Прочитать(); + ПараметрыИзФиксированногоМассива = Новый МенеджерПараметровКонфигурацииOneScript( + ФиксированныеФайлыКонфигурацииOneScript + ).Прочитать(); + + // Проверка + ОжидаемыйСистемныйКаталог = ПолныйПуть(КаталогКонфигурации, "benchmark-system"); + Ожидаем.Что(ПараметрыИзСтроки["lib.system"]).Равно(ОжидаемыйСистемныйКаталог); + Ожидаем.Что(ПараметрыИзФиксированногоМассива["lib.system"]).Равно(ОжидаемыйСистемныйКаталог); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СохранитьПоддержкуДополнительногоКаталога() Экспорт + + // Подготовка + КаталогКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьКонфигурацию( + КаталогКонфигурации, + "benchmark-system", + "benchmark-additional" + ); + + // Действие + Параметры = Новый МенеджерПараметровКонфигурацииOneScript( + КаталогКонфигурации + ).Прочитать(); + + // Проверка + Ожидаем.Что(Параметры["lib.system"]).Равно( + ПолныйПуть(КаталогКонфигурации, "benchmark-system") + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПриниматьНеопределенныеИПустыеДополнительныеФайлы() Экспорт + + // Подготовка + КаталогКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьКонфигурацию( + КаталогКонфигурации, + "current-system", + "current-additional" + ); + УстановитьТекущийКаталог(КаталогКонфигурации); + + // Действие + ПараметрыИзНеопределенного = Новый МенеджерПараметровКонфигурацииOneScript(Неопределено).Прочитать(); + ПараметрыИзПустойСтроки = Новый МенеджерПараметровКонфигурацииOneScript("").Прочитать(); + + // Проверка + Ожидаем.Что(ПараметрыИзПустойСтроки.Количество()).Равно( + ПараметрыИзНеопределенного.Количество() + ); + Для Каждого Параметр Из ПараметрыИзНеопределенного Цикл + Ожидаем.Что(ПараметрыИзПустойСтроки[Параметр.Ключ]).Равно(Параметр.Значение); + КонецЦикла; + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЧитатьИзДополнительныхФайловТолькоПутиБиблиотек() Экспорт + + // Подготовка + КаталогОсновнойКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогДополнительнойКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьТекст( + ПутьКФайлуКонфигурации(КаталогОсновнойКонфигурации), + "lib.system=./current-system + |systemlanguage=ru + |current.option=current" + ); + ЗаписатьТекст( + ПутьКФайлуКонфигурации(КаталогДополнительнойКонфигурации), + "lib.system=./additional-system + |lib.additional=./additional-library + |systemlanguage=en + |additional.option=additional" + ); + УстановитьТекущийКаталог(КаталогОсновнойКонфигурации); + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript( + ПутьКФайлуКонфигурации(КаталогДополнительнойКонфигурации) + ); + + // Действие + Параметры = МенеджерПараметров.Прочитать(); + + // Проверка + Ожидаем.Что(Параметры["lib.system"]).Равно( + ПолныйПуть(КаталогДополнительнойКонфигурации, "additional-system") + ); + Ожидаем.Что(Параметры["systemlanguage"]).Равно("ru"); + Ожидаем.Что(Параметры["current.option"]).Равно("current"); + Ожидаем.Что(Параметры["additional.option"]).Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЧитатьВсеПараметрыИзДополнительногоФайлаOneScript() Экспорт + + // Подготовка + КаталогОсновнойКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогДополнительнойКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + ЗаписатьТекст( + ПутьКФайлуКонфигурации(КаталогОсновнойКонфигурации), + "systemlanguage=ru + |custom.option=current" + ); + ЗаписатьТекст( + ПутьКФайлуКонфигурации(КаталогДополнительнойКонфигурации), + "systemlanguage=en + |custom.option=benchmark" + ); + УстановитьТекущийКаталог(КаталогОсновнойКонфигурации); + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript( + ПутьКФайлуКонфигурации(КаталогДополнительнойКонфигурации) + ).УчитыватьВсеПараметрыДополнительныхФайлов(); + + // Действие + Параметры = МенеджерПараметров.Прочитать(); + + // Проверка + Ожидаем.Что(Параметры["systemlanguage"]).Равно("en"); + Ожидаем.Что(Параметры["custom.option"]).Равно("benchmark"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ДобавитьКаталогиБиблиотекИзВсехКонфигурацийПоПриоритету() Экспорт + + // Подготовка + КаталогТекущейКонфигурации = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогКонфигурацииСНизкимПриоритетом = _МенеджерВременныхФайлов.СоздатьКаталог(); + КаталогКонфигурацииСВысокимПриоритетом = _МенеджерВременныхФайлов.СоздатьКаталог(); + + ЗаписатьКонфигурацию( + КаталогТекущейКонфигурации, + "current-system", + "current-additional" + ); + ЗаписатьКонфигурацию( + КаталогКонфигурацииСНизкимПриоритетом, + "low-system", + "low-additional" + ); + ЗаписатьКонфигурацию( + КаталогКонфигурацииСВысокимПриоритетом, + "high-system", + "high-additional" + ); + + ДополнительныеФайлыКонфигурацииOneScript = Новый Массив(); + ДополнительныеФайлыКонфигурацииOneScript.Добавить( + ПутьКФайлуКонфигурации(КаталогКонфигурацииСВысокимПриоритетом) + ); + ДополнительныеФайлыКонфигурацииOneScript.Добавить( + ПутьКФайлуКонфигурации(КаталогКонфигурацииСНизкимПриоритетом) + ); + + УстановитьТекущийКаталог(КаталогТекущейКонфигурации); + + МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript( + ДополнительныеФайлыКонфигурацииOneScript + ); + + // Действие + Параметры = МенеджерПараметров.Прочитать(); + КаталогиБиблиотек = СтрРазделить(Параметры["lib.additional"], ";", Ложь); + + // Проверка + Ожидаем.Что(Параметры["lib.system"]).Равно( + ПолныйПуть(КаталогКонфигурацииСВысокимПриоритетом, "high-system") + ); + Ожидаем.Что(КаталогиБиблиотек.Количество()).БольшеИлиРавно(6); + Ожидаем.Что(КаталогиБиблиотек[0]).Равно( + ПолныйПуть(КаталогКонфигурацииСВысокимПриоритетом, "high-additional") + ); + Ожидаем.Что(КаталогиБиблиотек[1]).Равно( + ПолныйПуть(КаталогКонфигурацииСВысокимПриоритетом, "high-system") + ); + Ожидаем.Что(КаталогиБиблиотек[2]).Равно( + ПолныйПуть(КаталогКонфигурацииСНизкимПриоритетом, "low-additional") + ); + Ожидаем.Что(КаталогиБиблиотек[3]).Равно( + ПолныйПуть(КаталогКонфигурацииСНизкимПриоритетом, "low-system") + ); + ИндексДополнительногоКаталогаТекущейКонфигурации = КаталогиБиблиотек.Найти( + ФС.НормализоватьПуть("current-additional") + ); + ИндексСистемногоКаталогаТекущейКонфигурации = КаталогиБиблиотек.Найти( + ФС.НормализоватьПуть("current-system") + ); + Ожидаем.Что(ИндексДополнительногоКаталогаТекущейКонфигурации).Не_().Равно(Неопределено); + Ожидаем.Что(ИндексСистемногоКаталогаТекущейКонфигурации).Не_().Равно(Неопределено); + Ожидаем.Что(ИндексДополнительногоКаталогаТекущейКонфигурации).Больше(3); + Ожидаем.Что(ИндексСистемногоКаталогаТекущейКонфигурации).Равно( + ИндексДополнительногоКаталогаТекущейКонфигурации + 1 + ); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ВыполнитьСтартовыйСценарий(ПутьКСтартовомуСценарию, РабочийКаталог) + + СтрокаКоманды = СтрШаблон( + "%1 %2", + ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки( + ПутьКИсполняемомуФайлуOneScript() + ), + ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки( + ПутьКСтартовомуСценарию + ) + ); + + Возврат ТестированиеПроцессов.ВыполнитьКоманду(СтрокаКоманды, РабочийКаталог); + +КонецФункции + +Функция ПутьКИсполняемомуФайлуOneScript() + + ВариантыИмени = Новый Массив(); + ВариантыИмени.Добавить("oscript.exe"); + ВариантыИмени.Добавить("oscript"); + + Для Каждого ИмяФайла Из ВариантыИмени Цикл + ИсполняемыйФайл = Новый Файл(ОбъединитьПути(КаталогПрограммы(), ИмяФайла)); + Если ИсполняемыйФайл.Существует() И ИсполняемыйФайл.ЭтоФайл() Тогда + Возврат ИсполняемыйФайл.ПолноеИмя; + КонецЕсли; + КонецЦикла; + + ВызватьИсключение "Не найден исполняемый файл текущей версии OneScript"; + +КонецФункции + +Процедура ЗаписатьКонфигурацию(Каталог, СистемныйКаталог, ДополнительныйКаталог) + + ТекстКонфигурации = СтрШаблон( + "lib.system=%1%3lib.additional=%2", + СистемныйКаталог, + ДополнительныйКаталог, + Символы.ПС + ); + ЗаписатьТекст( + ОбъединитьПути(Каталог, "oscript.cfg"), + ТекстКонфигурации + ); + +КонецПроцедуры + +Функция ПутьКФайлуКонфигурации(Каталог) + + Возврат ОбъединитьПути(Каталог, "oscript.cfg"); + +КонецФункции + +Процедура ЗаписатьТекст(ПутьКФайлу, Текст) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +Функция ПолныйПуть(Каталог, ОтносительныйПуть) + + Возврат Новый Файл(ОбъединитьПути(Каталог, ОтносительныйПуть)).ПолноеИмя; + +КонецФункции + +#КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index fe9180a..68cf811 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -3,6 +3,7 @@ #Использовать asserts #Использовать tempfiles +#Использовать 1commands #Использовать "helpers" #Использовать "fixtures/benchmarks" @@ -196,6 +197,7 @@ КонецФункции + Функция ПолныйПутьКФайлу(ПутьКФайлу) Возврат ФС.НормализоватьПуть(ОбъединитьПути(ТекущийКаталог(), ПутьКФайлу)); КонецФункции 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 3847d95..67dec3b 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" @@ -67,6 +67,54 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_УдалитьВременныйКаталогПриОчистке() Экспорт + + // Подготовка + МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); + Подготовитель = Новый ПодготовительФайлаБенчмарка(МенеджерВременныхФайлов); + ПодготовленныйФайл = Подготовитель.Подготовить("./tests/fixtures/АлгоритмБезАннотации.os"); + ВременныйКаталог = Новый Файл(ПодготовленныйФайл).Путь; + + // Действие + Подготовитель.Очистить(); + + // Проверка + Ожидаем.Что(ФС.КаталогСуществует(ВременныйКаталог)).ЭтоЛожь(); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СоздатьКонфигурациюРядомСВременнымФайломИзИсходногоКаталога() Экспорт + + // Подготовка + КаталогИсходногоФайла = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКИсходномуФайлу = ОбъединитьПути(КаталогИсходногоФайла, "АлгоритмСКонфигурацией.os"); + КаталогЛокальныхБиблиотек = ОбъединитьПути(КаталогИсходногоФайла, "oscript_modules"); + ФС.ОбеспечитьКаталог(КаталогЛокальныхБиблиотек); + ЗаписатьТекст( + ОбъединитьПути(КаталогИсходногоФайла, "oscript.cfg"), + "lib.system=./oscript_modules + |custom.option=benchmark" + ); + ЗаписатьТекст(ПутьКИсходномуФайлу, "А = 1;"); + + // Действие + ПодготовленныйФайл = _ПодготовительФайлаБенчмарка.Подготовить(ПутьКИсходномуФайлу); + + // Проверка + ПутьКПодготовленнойКонфигурации = ОбъединитьПути( + Новый Файл(ПодготовленныйФайл).Путь, + "oscript.cfg" + ); + Ожидаем.Что(ФС.ФайлСуществует(ПутьКПодготовленнойКонфигурации)).Равно(Истина); + + ТекстКонфигурации = ПрочитатьТекст(ПутьКПодготовленнойКонфигурации); + Ожидаем.Что(ТекстКонфигурации).Содержит(ФС.НормализоватьПуть(КаталогЛокальныхБиблиотек)); + Ожидаем.Что(ТекстКонфигурации).Содержит("custom.option=benchmark"); + +КонецПроцедуры + &Тест &Параметры("./tests/fixtures/benchmarks/Классы/ПустойБенчмарк.os", Истина) &Параметры("./tests/fixtures/АлгоритмБезАннотации.os", Ложь) @@ -94,4 +142,12 @@ КонецФункции +Процедура ЗаписатьТекст(ПутьКФайлу, Текст) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + #КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\240\320\260\320\267\321\200\320\265\321\210\320\260\321\202\320\265\320\273\321\217\320\222\321\205\320\276\320\264\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262\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\240\320\260\320\267\321\200\320\265\321\210\320\260\321\202\320\265\320\273\321\217\320\222\321\205\320\276\320\264\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" new file mode 100644 index 0000000..bb1afca --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\240\320\260\320\267\321\200\320\265\321\210\320\260\321\202\320\265\320\273\321\217\320\222\321\205\320\276\320\264\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -0,0 +1,134 @@ +#Использовать asserts +#Использовать fs +#Использовать tempfiles +#Использовать "helpers" + +Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов +Перем _ИсходныйТекущийКаталог; // Строка + +#Область ОбработчикиСобытий + +&Инициализация +Процедура ПередВсеми() Экспорт + + _МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); + _ИсходныйТекущийКаталог = ТекущийКаталог(); + +КонецПроцедуры + +&Завершение +Процедура ПослеВсех() Экспорт + + УстановитьТекущийКаталог(_ИсходныйТекущийКаталог); + _МенеджерВременныхФайлов.Удалить(); + +КонецПроцедуры + +#КонецОбласти + +#Область Тесты + +&Тест +Процедура ТестДолжен_РазрешитьЯвныйФайлБезРасширенияИОтметитьНесуществующийПуть() Экспорт + + // Подготовка + Каталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКФайлу = ОбъединитьПути(Каталог, "ЯвныйБенчмарк.os"); + ЗаписатьТекст(ПутьКФайлу, ""); + + ВходныеПути = Новый Массив(); + ВходныеПути.Добавить("ЯвныйБенчмарк"); + ВходныеПути.Добавить("НесуществующийБенчмарк"); + + УстановитьТекущийКаталог(Каталог); + ОжидаемыйПутьКФайлу = ФС.НормализоватьПуть("ЯвныйБенчмарк.os"); + + // Действие + Результат = Новый РазрешательВходныхФайловБенчмарков().Разрешить(ВходныеПути); + + // Проверка + Ожидаем.Что(Результат).ИмеетДлину(2); + Ожидаем.Что(Результат[0].Разрешен).ЭтоИстина(); + Ожидаем.Что(Результат[0].ВходнойКаталог).Равно(Неопределено); + Ожидаем.Что(Результат[0].Файлы).ИмеетДлину(1); + Ожидаем.Что(Результат[0].Файлы[0]).Равно(ОжидаемыйПутьКФайлу); + Ожидаем.Что(Результат[1].Разрешен).ЭтоЛожь(); + Ожидаем.Что(Результат[1].Файлы).ИмеетДлину(0); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьКорневойКаталогИОтсортированныеРекурсивныеФайлы() Экспорт + + // Подготовка + КорневойКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПервыйКаталог = ОбъединитьПути(КорневойКаталог, "a-first"); + ПоследнийКаталог = ОбъединитьПути(КорневойКаталог, "z-last"); + СоздатьКаталог(ПоследнийКаталог); + СоздатьКаталог(ПервыйКаталог); + + ПоследнийФайл = ОбъединитьПути(ПоследнийКаталог, "Бенчмарк.os"); + ПервыйФайл = ОбъединитьПути(ПервыйКаталог, "Бенчмарк.os"); + ЗаписатьТекст(ПоследнийФайл, ""); + ЗаписатьТекст(ПервыйФайл, ""); + + // Действие + Результат = Новый РазрешательВходныхФайловБенчмарков().Разрешить( + МассивИзОдногоЗначения(КорневойКаталог), + Истина + ); + + // Проверка + Ожидаем.Что(Результат).ИмеетДлину(1); + Ожидаем.Что(Результат[0].Разрешен).ЭтоИстина(); + Ожидаем.Что(Результат[0].ВходнойКаталог).Равно(ФС.НормализоватьПуть(КорневойКаталог)); + Ожидаем.Что(Результат[0].Файлы).ИмеетДлину(2); + Ожидаем.Что(Результат[0].Файлы[0]).Равно(ФС.НормализоватьПуть(ПервыйФайл)); + Ожидаем.Что(Результат[0].Файлы[1]).Равно(ФС.НормализоватьПуть(ПоследнийФайл)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ОставитьФайлТолькоУПервогоВхода() Экспорт + + // Подготовка + Каталог = _МенеджерВременныхФайлов.СоздатьКаталог(); + ПутьКФайлу = ОбъединитьПути(Каталог, "Бенчмарк.os"); + ЗаписатьТекст(ПутьКФайлу, ""); + + ВходныеПути = Новый Массив(); + ВходныеПути.Добавить(ПутьКФайлу); + ВходныеПути.Добавить(Каталог); + + // Действие + Результат = Новый РазрешательВходныхФайловБенчмарков().Разрешить(ВходныеПути); + + // Проверка + Ожидаем.Что(Результат).ИмеетДлину(2); + Ожидаем.Что(Результат[0].Файлы).ИмеетДлину(1); + Ожидаем.Что(Результат[1].Файлы).ИмеетДлину(0); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция МассивИзОдногоЗначения(Значение) + + Результат = Новый Массив(); + Результат.Добавить(Значение); + + Возврат Результат; + +КонецФункции + +Процедура ЗаписатьТекст(ПутьКФайлу, Текст) + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(Текст); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +#КонецОбласти diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\260\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\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\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\260\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 2888834..e7416d5 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\260\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\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\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\260\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -179,4 +179,4 @@ КонецПроцедуры -#КонецОбласти +#КонецОбласти \ No newline at end of file