diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" index 890a16f..e8f7b2f 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -11,8 +11,6 @@ // Функция Поиск(Аргументы, КонтекстПоиска) Экспорт - КонтекстПоиска.СбросОпций = Истина; - Результат = Новый Структура("РезультатПоиска, Аргументы", Истина, Аргументы); Возврат Результат; diff --git "a/src/core/\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\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\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\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 3272a11..c5baa82 100644 --- "a/src/core/\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\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/core/\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\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -117,6 +117,17 @@ Возврат Описание; КонецФункции +// Функция возвращает строку использования (спек) команды +// +// Возвращаемое значение: +// Cтрока - строка использования (спек) текущей команды +// +Функция ПолучитьСтрокуИспользования() Экспорт + + Возврат ?(Не ПустаяСтрока(Спек), Спек, СформироватьСтандартнуюСтрокуИспользования()); + +КонецФункции + // Функция возвращает значение опции по переданному имени/синониму опции // // Параметры: @@ -493,13 +504,7 @@ Лог.Отладка("Входящий спек: %1", Спек); - СтрокаИспользования = Спек; - - Если ПустаяСтрока(СтрокаИспользования) Тогда - - СтрокаИспользования = СформироватьСтандартнуюСтрокуИспользования(); - - КонецЕсли; + СтрокаИспользования = ПолучитьСтрокуИспользования(); Лог.Отладка("Разбираю строку использования с помощью лексера"); @@ -1101,7 +1106,24 @@ СтандартнаяСтрокаИспользования = ""; Лог.Отладка("Количество опций строки: %1", Опции.Количество()); - Если Опции.Количество() > 0 Тогда + ЕстьОбязательнаяОпция = Ложь; + Для каждого Опция Из Опции Цикл + + ИмяОпции = Опция.Ключ.НаименованияПараметров[0]; + КлассОпции = Опция.Ключ; + + Если КлассОпции.ПолучитьОбязательностьВвода() Тогда + ЕстьОбязательнаяОпция = Истина; + КонецЕсли; + + ДополнитьИмяАргументаМассива(ИмяОпции, КлассОпции); + ДополнитьИмяАргументаНеобязательного(ИмяОпции, КлассОпции); + + СтандартнаяСтрокаИспользования = СтандартнаяСтрокаИспользования + ИмяОпции + " "; + + КонецЦикла; + + Если Не ЕстьОбязательнаяОпция И Опции.Количество() > 0 Тогда СтандартнаяСтрокаИспользования = "[ОПЦИИ] "; КонецЕсли; @@ -1118,7 +1140,7 @@ ДополнитьИмяАргументаМассива(ИмяАргумента, КлассАргумента); ДополнитьИмяАргументаНеобязательного(ИмяАргумента, КлассАргумента); - Лог.Отладка("Добавляю аргумет <%1> в спек <%2>", ИмяАргумента, СтандартнаяСтрокаИспользования); + Лог.Отладка("Добавляю аргумент <%1> в спек <%2>", ИмяАргумента, СтандартнаяСтрокаИспользования); СтандартнаяСтрокаИспользования = СтандартнаяСтрокаИспользования + ИмяАргумента + " "; КонецЦикла; diff --git "a/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" "b/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" index 8b6c10c..6002abb 100644 --- "a/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" +++ "b/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" @@ -39,7 +39,7 @@ ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования"); ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования_МассивАргументов"); ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования_МассивАргументовНесколькоАргументов"); - + ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования_ОбязательнаяОпция"); // ИменаТестов.Добавить("ТестДолжен_СложныеСлучаиФормированияСтрокиИспользования"); ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводСправки"); @@ -354,6 +354,37 @@ КонецПроцедуры +Процедура ТестДолжен_СтандартнуюСтрокуИспользования_ОбязательнаяОпция() Экспорт + + Команда = ПодготовитьТестовуюКоманду(); + + ОбычныйОпция = Команда.Опция("z", , "Необязательная опция").ТСтрока(); + ОпцияМассив = Команда.Опция("e env", Новый Массив, "Тестовый необязательный массив опций").ТМассивСтрок(); + ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок(); + + СтрокаИспользования = СокрЛП(Команда.ПолучитьСтрокуИспользования()); + Утверждения.ПроверитьРавенство(СтрокаИспользования, "[ОПЦИИ] -- ARG2...", "Результат <СтрокаИспользования> должны совпадать"); + + + Команда = ПодготовитьТестовуюКоманду(); + + ОбычныйОпция = Команда.Опция("z", , "Необязательная опция").ТСтрока(); + ОпцияМассив = Команда.Опция("e env", Новый Массив, "Тестовый обязательный массив опций").ТМассивСтрок().Обязательный(Истина); + ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок(); + + СтрокаИспользования = СокрЛП(Команда.ПолучитьСтрокуИспользования()); + Утверждения.ПроверитьРавенство(СтрокаИспользования, "[-z] -e... -- ARG2...", "Результат <СтрокаИспользования> должны совпадать"); + + + Команда = ПодготовитьТестовуюКоманду(); + + ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок(); + + СтрокаИспользования = СокрЛП(Команда.ПолучитьСтрокуИспользования()); + Утверждения.ПроверитьРавенство(СтрокаИспользования, "-- ARG2...", "Результат <СтрокаИспользования> должны совпадать"); + +КонецПроцедуры + Процедура ТестДолжен_ПроверитьВыводСправки() Экспорт Спек = ""; @@ -383,6 +414,7 @@ Аргументы.Добавить("-e=Знач1"); Аргументы.Добавить("-e=Знач2"); Аргументы.Добавить("-e=Знач3"); + Аргументы.Добавить("--"); Аргументы.Добавить("-v"); Аргументы.Добавить("ARG2"); Аргументы.Добавить("run");