1
0
mirror of https://github.com/alei1180/curlone.git synced 2025-11-24 22:53:34 +02:00

feat(cli): Добавление исходников библиотеки cli

This commit is contained in:
Dmitry Ivanov
2024-12-23 23:24:34 +03:00
parent b0959201fe
commit 996722c433
51 changed files with 9239 additions and 3 deletions

View File

@@ -0,0 +1,16 @@
Перем МассивДат Экспорт;
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Процедура ОписаниеКоманды(КомандаПриложения) Экспорт
ТекКоманда = КомандаПриложения.Опция("a datearray",,"Массив дат");
ТекКоманда.ТМассивДат("yyyy-MM-dd", ";");
КонецПроцедуры
Процедура ВыполнитьКоманду(КомандаПриложения) Экспорт
МассивДат = КомандаПриложения.ЗначениеОпции("a")
КонецПроцедуры

View File

@@ -0,0 +1,32 @@
#Использовать "../../src/core"
Процедура ВыполнитьПриложение()
Приложение = Новый КонсольноеПриложение( "my-tests",
"Мое описание");
Приложение.Версия("v version", "0.1.0");
// Приложение.ДобавитьКоманду(
// "m make", "",
// Новый );
// Приложение.УстановитьОсновноеДействие(ЭтотОбъект);
Приложение.Запустить(АргументыКоманднойСтроки);
КонецПроцедуры // ВыполнениеКоманды()
// Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт
// КомандаПриложения.ВывестиСправку();
// КонецПроцедуры
Попытка
ВыполнитьПриложение();
ЗавершитьРаботу(0);
Исключение
Сообщить(ОписаниеОшибки());
ЗавершитьРаботу(1);
КонецПопытки;

View File

@@ -0,0 +1,133 @@
#использовать "../src/core"
#Использовать asserts
#Использовать logos
Перем юТест;
Перем Лог;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингАргументов");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингАргументовПослеСбросаОпций");
Возврат ИменаТестов;
КонецФункции
Процедура ТестДолжен_ПроверитьПарсингАргументов() Экспорт
ARG = Аргумент("ARG", Ложь).Флаг();
SRC = Аргумент("SRC", "").ТСтрока();
INT = Аргумент("INT", "").ТЧисло();
DATE = Аргумент("DATE", "").ТДата();
ИндексАргументов = Новый Соответствие;
ИндексАргументов.Вставить("ARG", ARG);
ИндексАргументов.Вставить("SRC", SRC);
ИндексАргументов.Вставить("INT", INT);
ИндексАргументов.Вставить("DATE", DATE);
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f x", "-f", Неопределено));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("a", "", "a"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "", Неопределено));
Для каждого Тест Из ТестовыеСлучаи Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Для каждого КлючЗначение Из ИндексАргументов Цикл
Парсер_Аргумента = Новый АргументыПарсера(КлючЗначение.Значение);
Утверждения.ПроверитьРавенство(КлючЗначение.Ключ, Парсер_Аргумента.ВСтроку(), "Парсер аргументов должен быть равен "+ КлючЗначение.Ключ);
Контекст = Новый КонтекстПарсеров();
Результат = Парсер_Аргумента.Поиск(Тест.Аргументы, Контекст);
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Если Тест.ЗначениеОпции = Неопределено Тогда
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Аргумент не должен быть найден");
Иначе
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Аргумент должен быть найден");
Утверждения.ПроверитьРавенство(1, Контекст.Аргументы[Парсер_Аргумента.Аргумент].Количество(), "Количество результатов должно быть 1");
Утверждения.ПроверитьРавенство(Контекст.Аргументы[Парсер_Аргумента.Аргумент][0], Тест.ЗначениеОпции, "Ожидаемые результаты должны быть равны");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ТестовыйСлучай(Знач Аргументы, Знач АргументыВыхода, Знач ЗначениеОпции)
Тест = Новый Структура;
Тест.Вставить("Аргументы", СтрРазделить(Аргументы," "));
Тест.Вставить("АргументыВыхода", СтрРазделить(АргументыВыхода," "));
Тест.Вставить("ЗначениеОпции", ЗначениеОпции);
Возврат Тест;
КонецФункции
Процедура ТестДолжен_ПроверитьПарсингАргументовПослеСбросаОпций() Экспорт
ARG = Аргумент("ARG", Ложь).Флаг();
SRC = Аргумент("SRC", "").ТСтрока();
INT = Аргумент("INT", "").ТЧисло();
DATE = Аргумент("DATE", "").ТДата();
ИндексАргументов = Новый Соответствие;
ИндексАргументов.Вставить("ARG", ARG);
ИндексАргументов.Вставить("SRC", SRC);
ИндексАргументов.Вставить("INT", INT);
ИндексАргументов.Вставить("DATE", DATE);
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -x", "-x", "-f"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a", "", "-a"));
Для каждого Тест Из ТестовыеСлучаи Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Для каждого КлючЗначение Из ИндексАргументов Цикл
Парсер_Аргумента = Новый АргументыПарсера(КлючЗначение.Значение);
Утверждения.ПроверитьРавенство(КлючЗначение.Ключ, Парсер_Аргумента.ВСтроку(), "Парсер аргументов должен быть равен "+ КлючЗначение.Ключ);
Контекст = Новый КонтекстПарсеров();
Контекст.СбросОпций = Истина;
Результат = Парсер_Аргумента.Поиск(Тест.Аргументы, Контекст);
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Аргумент должен быть найден");
Утверждения.ПроверитьРавенство(1, Контекст.Аргументы[Парсер_Аргумента.Аргумент].Количество(), "Количество результатов должно быть 1");
Утверждения.ПроверитьРавенство(Контекст.Аргументы[Парсер_Аргумента.Аргумент][0], Тест.ЗначениеОпции, "Ожидаемые результаты должны быть равны");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция Аргумент(Наименование, ЗначениеПоУмолчанию)
Возврат Новый ПараметрКоманды("Аргумент", Наименование, ЗначениеПоУмолчанию, "Тестовый параметр f")
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_class_arg");
//Лог.УстановитьУровень(УровниЛога.Отладка);

View File

@@ -0,0 +1,212 @@
#использовать "../src/core"
#Использовать asserts
#Использовать logos
Перем юТест;
Перем Лог;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингВсеОпции");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовВсеОпции");
Возврат ИменаТестов;
КонецФункции
Функция ТестовыйСлучай(Знач Аргументы, Знач АргументыВыхода, Знач ЗначениеОпции)
Тест = Новый Структура;
Тест.Вставить("Аргументы", СтрРазделить(Аргументы," "));
Тест.Вставить("АргументыВыхода", СтрРазделить(АргументыВыхода," "));
Тест.Вставить("ЗначениеОпции", СтрРазделить(ЗначениеОпции," "));
Возврат Тест;
КонецФункции
Процедура ТестДолжен_ПроверитьПарсингВсеОпции() Экспорт
НаименованияОпции = Новый Массив;
НаименованияОпции.Добавить("-f");
НаименованияОпции.Добавить("-F");
НаименованияОпции.Добавить("--force");
НаименованияОпции.Добавить("-o");
НаименованияОпции.Добавить("--other");
МассивОпций = Новый Массив;
МассивОпций.Добавить(Опция("o other", "").ТСтрока());
МассивОпций.Добавить(Опция("o other", "").ТДата());
МассивОпций.Добавить(Опция("o other", "").ТЧисло());
ОпцияForce = Опция("f F force", Ложь).Флаг();
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f x", "x", "Истина null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=false y", "y", "Ложь null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force x", "x", "Истина null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=true y", "y", "истина null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o x", "", "null x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o=x y", "y", "null x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-ox y", "y", "null x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--other x", "", "null x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--other=x y", "y", "null x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -o x y", "y", "истина x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o x -f y", "y", "истина x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-fo x y", "y", "истина x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-foxxx y", "y", "истина xxx"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-Foxxx y", "y", "истина xxx"));
Для каждого Тест Из ТестовыеСлучаи Цикл
Для каждого ОпцияТеста Из МассивОпций Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Лог.Отладка("-> тип опции: %1", ОпцияForce.ТипОпции);
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-f", ОпцияForce);
ИндексОпций.Вставить("-F", ОпцияForce);
ИндексОпций.Вставить("--force", ОпцияForce);
ИндексОпций.Вставить("-o", ОпцияТеста);
ИндексОпций.Вставить("--other", ОпцияТеста);
Опции = Новый Соответствие;
Опции.Вставить(ОпцияТеста, ОпцияТеста);
Опции.Вставить(ОпцияForce, ОпцияForce);
АргументыТеста = Тест.Аргументы;
О_Парсера = Новый ВсеОпцииПарсера(Опции, ИндексОпций);
Утверждения.ПроверитьРавенство("-of", О_Парсера.ВСтроку(), "Парсер опции должен быть равен -of");
Контекст = Новый КонтекстПарсеров();
Результат = О_Парсера.Поиск(АргументыТеста, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опции должны быть найдены");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
Если Не Контекст.Опции[ОпцияForce] = Неопределено Тогда
Утверждения.ПроверитьРавенство(Булево(Контекст.Опции[ОпцияForce][0]),Булево(Тест.ЗначениеОпции[0]), "Ожидаемые результаты опции --force должны быть равны");
КонецЕсли;
Если Не Контекст.Опции[ОпцияТеста] = Неопределено Тогда
Утверждения.ПроверитьРавенство(Контекст.Опции[ОпцияТеста][0], Тест.ЗначениеОпции[1], "Ожидаемые результаты опции теста должны быть равны");
КонецЕсли;
КонтекстСброса = Новый КонтекстПарсеров();
КонтекстСброса.СбросОпций = Истина;
Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса);
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Любые опции не должны быть найдены");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьПарсингМассивовВсеОпции() Экспорт
НаименованияОпции = Новый Массив;
НаименованияОпции.Добавить("-f");
НаименованияОпции.Добавить("--force");
НаименованияОпции.Добавить("-o");
НаименованияОпции.Добавить("--other");
МассивОпций = Новый Массив;
МассивОпций.Добавить(Опция("o other", "").ТМассивСтрок());
МассивОпций.Добавить(Опция("o other", "").ТМассивДат());
МассивОпций.Добавить(Опция("o other", "").ТМассивЧисел());
ОпцияForce = Опция("f force", Ложь).Флаг();
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f x", "x", "Истина null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=false y", "y", "Ложь null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force x", "x", "Истина null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=true y", "y", "истина null"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o x -o x2", "", "null x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o=x -o=x2 y", "y", "null x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o=x -o=x2 -y z", "-y z", "null x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-ox -ox2 y", "y", "null x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--other x --other x2", "", "null x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--other=x --other=x2 -y", "-y", "null x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -o x -o x2 y", "y", "истина x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o x -f -o x2 y", "y", "истина x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-o x -o x2 -f y", "y", "истина x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-fo x -o=x2 y", "y", "истина x x2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-foxxx -oxxx2 -y z", "-y z", "истина xxx xxx2"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-foxxx -oxxx2 z", "z", "истина xxx xxx2"));
Для каждого Тест Из ТестовыеСлучаи Цикл
Для каждого ОпцияТеста Из МассивОпций Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Лог.Отладка("-> тип опции: %1", ОпцияForce.ТипОпции);
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-f", ОпцияForce);
ИндексОпций.Вставить("--force", ОпцияForce);
ИндексОпций.Вставить("-o", ОпцияТеста);
ИндексОпций.Вставить("--other", ОпцияТеста);
Опции = Новый Соответствие;
Опции.Вставить(ОпцияТеста, ОпцияТеста);
Опции.Вставить(ОпцияForce, ОпцияForce);
АргументыТеста = Тест.Аргументы;
О_Парсера = Новый ВсеОпцииПарсера(Опции, ИндексОпций);
Утверждения.ПроверитьРавенство("-of", О_Парсера.ВСтроку(), "Парсер опции должен быть равен -of");
Контекст = Новый КонтекстПарсеров();
Результат = О_Парсера.Поиск(АргументыТеста, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опции должны быть найдены");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Результат = О_Парсера.Поиск(АргументыТеста, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опции должны быть найдены");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
Если Не Контекст.Опции[ОпцияForce] = Неопределено Тогда
Утверждения.ПроверитьРавенство(Булево(Контекст.Опции[ОпцияForce][0]),Булево(Тест.ЗначениеОпции[0]), "Ожидаемые результаты опции --force должны быть равны");
КонецЕсли;
Если Не Контекст.Опции[ОпцияТеста] = Неопределено Тогда
Утверждения.ПроверитьРавенство(Контекст.Опции[ОпцияТеста][0], Тест.ЗначениеОпции[1], "Ожидаемые результаты опции теста должны быть равны");
Утверждения.ПроверитьРавенство(Контекст.Опции[ОпцияТеста][1], Тест.ЗначениеОпции[2], "Ожидаемые результаты опции теста должны быть равны");
КонецЕсли;
КонтекстСброса = Новый КонтекстПарсеров();
КонтекстСброса.СбросОпций = Истина;
Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса);
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Любые опции не должны быть найдены");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция Опция(Наименование, ЗначениеПоУмолчанию)
Возврат Новый ПараметрКоманды("опция", Наименование, ЗначениеПоУмолчанию, "Тестовый параметр f")
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_class_options");
//Лог.УстановитьУровень(УровниЛога.Отладка);

View File

@@ -0,0 +1,559 @@
#использовать "../src/core"
#Использовать asserts
#Использовать logos
#Использовать delegate
Перем юТест;
Перем Лог;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
// Скорость выполнения команды
ИменаТестов.Добавить("ТестДолжен_ПроверитьСкоростьРаботуКомандыПриложения");
// Работа с опциями и аргументами
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПолучениеЗначенияАргументаПоИмени");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПолучениеЗначенияОпцииПоИмени");
ИменаТестов.Добавить("ТестДолжен_ПроверитьУстановкуЗначенийОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьУстановкуМножественныхЗначенийОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьУстановкуЗначенийАргументов");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьУстановкуМножественныхАргументовОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьГруппировкуОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьНеобязательностьОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьНеобязательностьАргументов");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьВзаимоисключающиеОпции");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПовторяемыеВзаимоисключающиеОпции");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьРаботуСОднимТиреВАргументах");
ИменаТестов.Добавить("ТестДолжен_ПроверитьСбросОпцийПередАргументами");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьСбросМножественныхОпций");
ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования");
ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования_МассивАргументов");
ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования_МассивАргументовНесколькоАргументов");
ИменаТестов.Добавить("ТестДолжен_СтандартнуюСтрокуИспользования_ОбязательнаяОпция");
// ИменаТестов.Добавить("ТестДолжен_СложныеСлучаиФормированияСтрокиИспользования");
ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводСправки");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводВерсии");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьВыполнениеОбработчикаПередВыполнениемКоманды");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьВыполнениеОбработчикаПослеВыполненияКоманды");
ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыБезВызоваПроцедуры");
ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКоманды");
ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыПервогоУровня");
Возврат ИменаТестов;
КонецФункции
Процедура ВыполнитьКоманду(Знач ВыполняемаяКоманда) Экспорт
Лог.Отладка("Полезная работа команды: %1", ВыполняемаяКоманда.ПолучитьИмяКоманды());
КонецПроцедуры
Процедура ТестДолжен_ПроверитьСкоростьРаботуКомандыПриложения() Экспорт
Спек = "[--login] [--realm] [--note] [--no-copy] [--gen [--length] [--min-length] [--max-length] [--no-upper] [--no-lower] [--no-digit] [--no-symbol] [--no-similar] [--min-upper] [--max-upper] [--min-lower] [--max-lower] [--min-digit] [--max-digit] [--min-symbol] [--max-symbol] [--exclude]]";
ИмяПроцедурыОбъекта = "КомандаСкоростьРаботуКомандыПриложения";
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", Спек, Истина));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--gen", Спек, Истина));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--gen --length 42", Спек, Истина));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--length 42 --gen", Спек, Истина));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--min-length 10 --length 42 --gen", Спек, Истина));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--min-length 10 --no-symbol --no-lower --length 42 --gen", Спек, Истина));
Для каждого Тест Из ТестовыеСлучаи Цикл
РезультатВыполнения = ВыполненаКомандаПриложения(Тест.Спек, ИмяПроцедурыОбъекта, Тест.Аргументы);
Утверждения.ПроверитьРавенство(РезультатВыполнения, Тест.Результат, "Команда должна выполниться успешно! Входящие аргументы" + СтрСоединить(Тест.Аргументы));
КонецЦикла;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыБезВызоваПроцедуры () Экспорт
Команда = ПодготовитьТестовуюКоманду();
ОпцияМассив = Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
ВложеннаяКоманда = Команда.ДобавитьПодкоманду("sub s", "", ЭтотОбъект);
ОпцияМассив = ВложеннаяКоманда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
Аргументы.Добавить("sub");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеОпцииКомандыРодителя("e").Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеОпции("e").Количество(), 0 , "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеАргумента("ARG"), "ЗначениеАргумента" , "Результат <АргументСтрока> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКоманды() Экспорт
Команда = ПодготовитьТестовуюКоманду();
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
ВложеннаяКоманда = Команда.ДобавитьПодкоманду("sub s", "", ЭтотОбъект);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
Аргументы.Добавить("sub");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеОпцииКомандыРодителя("e").Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеАргументаКомандыРодителя("ARG"), "ЗначениеАргумента" , "Результат <АргументСтрока> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыПервогоУровня() Экспорт
Команда = ПодготовитьТестовуюКоманду();
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
ВложеннаяКоманда = Команда.ДобавитьПодкоманду("sub s", "", ЭтотОбъект);
ВложеннаяКоманда2 = ВложеннаяКоманда.ДобавитьПодкоманду("subsub ss", "", ЭтотОбъект);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
Аргументы.Добавить("sub");
Аргументы.Добавить("subsub");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда2.ЗначениеОпцииКомандыРодителя("e").Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(ВложеннаяКоманда2.ЗначениеАргументаКомандыРодителя("ARG"), "ЗначениеАргумента" , "Результат <АргументСтрока> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьУстановкуЗначенийОпций() Экспорт
Спек = "";
ИмяПроцедурыОбъекта = "КомандаПростыеОпции";
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--bool", Спек, "Истина;;0"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--string Строка", Спек, "Ложь;Строка;0"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--int 42", Спек, "Ложь;;42"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--string Строка --bool", Спек, "Истина;Строка;0"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--int 42 --bool", Спек, "Истина;;42"));
Для каждого Тест Из ТестовыеСлучаи Цикл
Команда = ВыполнитьКомандаПриложения(Тест.Спек, ИмяПроцедурыОбъекта, Тест.Аргументы);
ЗначениеБулева = Команда.ЗначениеОпции("bool");
ЗначениеСтрока = Команда.ЗначениеОпции("string");
ЗначениеЧисло = Команда.ЗначениеОпции("int");
МассивРезультата = СтрРазделить(Тест.Результат, ";", Истина);
Утверждения.ПроверитьРавенство(ЗначениеБулева, Булево(МассивРезультата[0]), "Результаты должны совпадать" + СтрСоединить(Тест.Аргументы));
Утверждения.ПроверитьРавенство(ЗначениеСтрока, Строка(МассивРезультата[1]), "Результаты должны совпадать" + СтрСоединить(Тест.Аргументы));
Утверждения.ПроверитьРавенство(ЗначениеЧисло, Число(МассивРезультата[2]), "Результаты должны совпадать" + СтрСоединить(Тест.Аргументы));
КонецЦикла;
КонецПроцедуры
Процедура ТестДолжен_СтандартнуюСтрокуИспользования() Экспорт
Спек = "";
ИмяПроцедурыОбъекта = "КомандаПростыеОпции";
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока.Значение, "ЗначениеАргумента" , "Результат <АргументСтрока> должны совпадать");
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
//Аргументы.Добавить("ЗначениеАргумента");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока.Значение, "" , "Результат <АргументСтрока> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_СтандартнуюСтрокуИспользования_МассивАргументов() Экспорт
Спек = "";
ИмяПроцедурыОбъекта = "КомандаПростыеОпции";
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").ТМассивСтрок().Обязательный(Ложь);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
Аргументы.Добавить("ЗначениеАргумента");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3, "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока.Значение.Количество(), 2, "Результат <АргументСтрока> должны совпадать");
// Необязательный массив
// Аргументы не переданы
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").ТМассивСтрок().Обязательный(Ложь);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3, "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока.Значение.Количество(), 0, "Результат <АргументСтрока> должны совпадать");
// Просто массив
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").ТМассивСтрок();
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
Аргументы.Добавить("ЗначениеАргумента");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3, "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока.Значение.Количество(), 2, "Результат <АргументСтрока> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_СтандартнуюСтрокуИспользования_МассивАргументовНесколькоАргументов() Экспорт
Спек = "";
ИмяПроцедурыОбъекта = "КомандаПростыеОпции";
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").ТМассивСтрок().Обязательный(Ложь);
АргументСтрока2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").Обязательный();
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("ЗначениеАргумента");
Аргументы.Добавить("ЗначениеАргумента2");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3, "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока.Значение.Количество(), 1, "Результат <АргументСтрока> должны совпадать");
Утверждения.ПроверитьРавенство(АргументСтрока2.Значение, "ЗначениеАргумента2", "Результат <АргументСтрока2> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_СтандартнуюСтрокуИспользования_ОбязательнаяОпция() Экспорт
Команда = ПодготовитьТестовуюКоманду();
ОбычныйОпция = Команда.Опция("z", , "Необязательная опция").ТСтрока();
ОпцияМассив = Команда.Опция("e env", Новый Массив, "Тестовый необязательный массив опций").ТМассивСтрок();
ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок();
СтрокаИспользования = СокрЛП(Команда.ПолучитьСтрокуИспользования());
Утверждения.ПроверитьРавенство(СтрокаИспользования, "[ОПЦИИ] -- ARG2...", "Результат <СтрокаИспользования> должны совпадать");
Команда = ПодготовитьТестовуюКоманду();
ОбычныйОпция = Команда.Опция("z", , "Необязательная опция").ТСтрока();
ОпцияМассив = Команда.Опция("e env", Новый Массив, "Тестовый обязательный массив опций").ТМассивСтрок().Обязательный(Истина);
ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок();
СтрокаИспользования = СокрЛП(Команда.ПолучитьСтрокуИспользования());
Утверждения.ПроверитьРавенство(СтрокаИспользования, "[-z] -e... -- ARG2...", "Результат <СтрокаИспользования> должны совпадать");
Команда = ПодготовитьТестовуюКоманду();
ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок();
СтрокаИспользования = СокрЛП(Команда.ПолучитьСтрокуИспользования());
Утверждения.ПроверитьРавенство(СтрокаИспользования, "-- ARG2...", "Результат <СтрокаИспользования> должны совпадать");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьВыводСправки() Экспорт
Спек = "";
Команда = ПодготовитьТестовуюКоманду(Спек);
ОпцияМассив = Команда.Опция("env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
АргументСтрока2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").Обязательный();
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").ТМассивСтрок().Обязательный(Ложь);
ОпцияПеречисление = Команда.Опция("enum e em", "yellow", "Опция перечисление").ТПеречисление()
.Перечисление("yellow", "yellow", "Это желтый цвет")
.Перечисление("red", "red" , "Это красный цвет")
.Перечисление("blue", "blue", "Это синий цвет")
;
Команда.ВывестиСправку();
КонецПроцедуры
Процедура ТестДолжен_ПроверитьСбросОпцийПередАргументами() Экспорт
Команда = ПодготовитьТестовуюКоманду();
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
ARG2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").ТМассивСтрок().Обязательный(Ложь);
Аргументы = Новый Массив;
Аргументы.Добавить("-e=Знач1");
Аргументы.Добавить("-e=Знач2");
Аргументы.Добавить("-e=Знач3");
Аргументы.Добавить("--");
Аргументы.Добавить("-v");
Аргументы.Добавить("ARG2");
Аргументы.Добавить("run");
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
Утверждения.ПроверитьРавенство(ОпцияМассив.Значение.Количество(), 3, "Результат <ОпцияМассив> должны совпадать");
Утверждения.ПроверитьРавенство(ARG2.Значение.Количество(), 3, "Результат <ARG1> должны совпадать");
КонецПроцедуры
Функция ПодготовитьТестовуюКоманду(Спек = "")
Команда = Новый КомандаПриложения("testapp", "Тестовое приложения", ЭтотОбъект);
Если ЗначениеЗаполнено(Спек) Тогда
Команда.Спек = Спек;
КонецЕсли;
Возврат Команда;
КонецФункции
Функция АргументыИзСтроки(СтрокаАргументов)
Возврат СтрРазделить(СтрокаАргументов, " ");
КонецФункции
Функция ТестовыйСлучай(Знач Аргументы, Знач Спек, Знач Результат)
Тест = Новый Структура;
Тест.Вставить("Аргументы", СтрРазделить(Аргументы," "));
Тест.Вставить("Спек", Спек);
Тест.Вставить("Результат", Результат);
Возврат Тест;
КонецФункции
Функция ВыполнитьКомандуПриложения(Команда, Аргументы)
Команда.НачалоЗапуска();
Попытка
Команда.Запуск(Аргументы);
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Функция ВыполненаКомандаПриложения(Спек, ИмяПроцедурыОбъекта, Аргументы)
Команда = Новый КомандаПриложения("test", "Тестовая команда", ЭтотОбъект);
ПараметрыВыполнения = Новый Массив;
ПараметрыВыполнения.Добавить(Команда);
ОписаниеКоманды = Делегаты.Создать(ЭтотОбъект, ИмяПроцедурыОбъекта);
ОписаниеКоманды.Исполнить(ПараметрыВыполнения);
Команда.Спек = Спек;
Команда.НачалоЗапуска();
Попытка
Команда.Запуск(Аргументы);
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Функция ВыполнитьКомандаПриложения(Спек, ИмяПроцедурыОбъекта, Аргументы)
Команда = Новый КомандаПриложения("test", "Тестовая команда", ЭтотОбъект);
ПараметрыВыполнения = Новый Массив;
ПараметрыВыполнения.Добавить(Команда);
ОписаниеКоманды = Делегаты.Создать(ЭтотОбъект, ИмяПроцедурыОбъекта);
ОписаниеКоманды.Исполнить(ПараметрыВыполнения);
Команда.Спек = Спек;
Команда.НачалоЗапуска();
Попытка
Команда.Запуск(Аргументы);
Исключение
Сообщить(ОписаниеОшибки());
Возврат Команда;
КонецПопытки;
Возврат Команда;
КонецФункции
Процедура КомандаСкоростьРаботуКомандыПриложения(Знач ВыполняемаяКоманда) Экспорт
login = ВыполняемаяКоманда.Опция("login", "", "Login for credential, e.g. username or email.").ТСтрока();
realm = ВыполняемаяКоманда.Опция("realm", "", "Realm for credential, e.g. website or WiFi AP name.").ТСтрока();
note = ВыполняемаяКоманда.Опция("note", "", "Note for credential.").ТСтрока();
noCopy = ВыполняемаяКоманда.Опция("no-copy", false, "Do not copy generated password to the clipboard.").Флаг();
gen = ВыполняемаяКоманда.Опция("gen", false, "Generate a password.").Флаг();
length = ВыполняемаяКоманда.Опция("length", 0, "Password length.").Тчисло();
minLength = ВыполняемаяКоманда.Опция("min-length", 30, "Minimum length password.").Тчисло();
maxL = ВыполняемаяКоманда.Опция("max-length", 40, "Maximum length password.").Тчисло();
noUpper = ВыполняемаяКоманда.Опция("no-upper", false, "Exclude uppercase characters in password.").Флаг();
noLow = ВыполняемаяКоманда.Опция("no-lower", false, "Exclude lowercase characters in password.").Флаг();
noDigit = ВыполняемаяКоманда.Опция("no-digit", false, "Exclude digit characters in password.").Флаг();
noSymbol = ВыполняемаяКоманда.Опция("no-symbol", false, "Exclude symbol characters in password.").Флаг();
noSimilar = ВыполняемаяКоманда.Опция("no-similar", false, "Exclude similar characters in password.").Флаг();
minUpper = ВыполняемаяКоманда.Опция("min-upper", 0, "Minimum number of uppercase characters in password.").Тчисло();
maxUpper = ВыполняемаяКоманда.Опция("max-upper", -1, "Maximum number of uppercase characters in password.").Тчисло();
minLow = ВыполняемаяКоманда.Опция("min-lower", 0, "Minimum number of lowercase characters in password.").Тчисло();
maxLow = ВыполняемаяКоманда.Опция("max-lower", -1, "Maximum number of lowercase characters in password.").Тчисло();
minDigit = ВыполняемаяКоманда.Опция("min-digit", 0, "Minimum number of digit characters in password.").Тчисло();
maxDigit = ВыполняемаяКоманда.Опция("max-digit", -1, "Maximum number of digit characters in password.").Тчисло();
minSym = ВыполняемаяКоманда.Опция("min-symbol", 0, "Minimum number of symbol characters in password.").Тчисло();
maxSym = ВыполняемаяКоманда.Опция("max-symbol", -1, "Maximum number of symbol characters in password.").Тчисло();
ex = ВыполняемаяКоманда.Опция("exclude", "", "Exclude specific characters from password.").ТСтрока();
КонецПроцедуры
Процедура КомандаПростыеОпции(Знач ВыполняемаяКоманда) Экспорт
ВыполняемаяКоманда.Опция("bool", Ложь, "Login for credential, e.g. username or email.");
ВыполняемаяКоманда.Опция("string", "", "Realm for credential, e.g. website or WiFi AP name.");
ВыполняемаяКоманда.Опция("int", 0, "Note for credential.");
КонецПроцедуры
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_command");
//Лог.УстановитьУровень(УровниЛога.Отладка);

View File

@@ -0,0 +1,120 @@
#использовать "../src/core"
#Использовать asserts
Перем V, B, S, ARG, SRC;
Перем юТест;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ТолькоАргументы");
//ИменаТестов.Добавить("ТестДолжен_ТолькоОпции");
//ИменаТестов.Добавить("ТестДолжен_ПроверитьПриложения");
ИменаТестов.Добавить("ТестДолжен_ПараметрыПеречисленияОпции");
ИменаТестов.Добавить("ТестДолжен_ПараметрыПеречисленияОпцииВыводHelp");
ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводВерсииПриложения");
Возврат ИменаТестов;
КонецФункции
Процедура ТестДолжен_ТолькоАргументы() Экспорт
Приложение = Новый КонсольноеПриложение("cp", "");
DST = Приложение.Аргумент("DST", "", "Тест");
SRC = Приложение.Аргумент("SRC", "", "Тест").ТМассивСтрок();;
Приложение.УстановитьСпек("SRC... DST");
Приложение.УстановитьОсновноеДействие(ЭтотОбъект);
МассивSRC = Новый Массив;
МассивSRC.Добавить("src1");
МассивSRC.Добавить("src2");
ВходящиеАргументы = Новый Массив;
ВходящиеАргументы.Добавить("src1");
ВходящиеАргументы.Добавить("src2");
ВходящиеАргументы.Добавить("dst");
Приложение.Запустить(ВходящиеАргументы);
Утверждения.ПроверитьРавенство(DST.Значение, "dst", "Аргумент DST не равен ожидаемому");
Утверждения.ПроверитьРавенство(SRC.Значение.Количество(), МассивSRC.Количество(), "Аргумент SRC не равен ожидаемому");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьВыводВерсииПриложения() Экспорт
Приложение = Новый КонсольноеПриложение("cp", "");
Приложение.Версия("v version", "1.0");
ВходящиеАргументы = Новый Массив;
ВходящиеАргументы.Добавить("-v");
// TODO: При выполнении этого теста происходить завершение тестирования
// Переписать после написания нормального флоу
//Приложение.Запустить(ВходящиеАргументы);
КонецПроцедуры
Процедура ТестДолжен_ПараметрыПеречисленияОпции() Экспорт
Приложение = Новый КонсольноеПриложение("cp", "");
enum = Приложение.Опция("enum e", "yellow", "Опция перечисление").ТПеречисление()
.Перечисление("yellow", "yellow", "Это желтый цвет")
.Перечисление("red", "red" , "Это красный цвет")
.Перечисление("blue", "blue", "Это синий цвет")
;
Приложение.УстановитьОсновноеДействие(ЭтотОбъект);
ВходящиеАргументы = Новый Массив;
ВходящиеАргументы.Добавить("-e");
ВходящиеАргументы.Добавить("yellow");
Приложение.Запустить(ВходящиеАргументы);
Утверждения.ПроверитьРавенство(enum.Значение, "yellow", "Аргумент enum не равен ожидаемому");
КонецПроцедуры
Процедура ТестДолжен_ПараметрыПеречисленияОпцииВыводHelp() Экспорт
Приложение = Новый КонсольноеПриложение("cp", "");
enum = Приложение.Опция("enum e", "yellow", "Опция перечисление").ТПеречисление()
.Перечисление("yellow", "yellow", "Это желтый цвет")
.Перечисление("red", "rediiii" , "Это красный цвет")
.Перечисление("blue", "blue", "Это синий цвет")
;
Приложение.УстановитьОсновноеДействие(ЭтотОбъект);
ВходящиеАргументы = Новый Массив;
// ВходящиеАргументы.Добавить("--help");
ВходящиеАргументы.Добавить("--enum");
ВходящиеАргументы.Добавить("red");
Приложение.Запустить(ВходящиеАргументы);
Утверждения.ПроверитьРавенство(enum.Значение, "rediiii", "Аргумент enum не равен ожидаемому");
КонецПроцедуры
Процедура ВыполнитьКоманду(Знач Команда) Экспорт
КонецПроцедуры
Функция ИмяФункции()
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_command");
//Лог.УстановитьУровень(УровниЛога.Отладка);

View File

@@ -0,0 +1,283 @@
#использовать "../src/core"
#Использовать asserts
#Использовать logos
Перем юТест;
Перем Лог;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ПроверитьЛексерНаРазборТокенов");
Возврат ИменаТестов;
КонецФункции
Процедура ТестДолжен_ПроверитьЛексерНаРазборТокенов() Экспорт
ПроверочныеДанные = ТестовыеСлучаи();
Для каждого КлючЗначение Из ПроверочныеДанные Цикл
Лог.Отладка("Проверяю spec: %1", КлючЗначение.Ключ);
Лексер = Новый Лексер(КлючЗначение.Ключ).Прочитать();
Утверждения.ПроверитьЛожь(Лексер.ЕстьОшибка(), СтрШаблон("Лексер должен отработать успешно. Спек: %1 -- Ошибка: %2", КлючЗначение.Ключ, Лексер.ПолучитьИнформациюОбОшибке()));
СпекМассив = Лексер.ПолучитьТокены();
Утверждения.ПроверитьРавенство(СпекМассив.Количество(), КлючЗначение.Значение.Количество(), "Набор токенов должен быть одинаковым: "+ КлючЗначение.Ключ);
Утверждения.ПроверитьИстину(СверитьМассивыТокенов(СпекМассив, КлючЗначение.Значение),"Токены не равны " + КлючЗначение.Ключ);
КонецЦикла;
КонецПроцедуры
Функция СверитьТокены(ПроверяемыйТокен, ИдеальныйТокен)
Для каждого КлючЗначение Из ИдеальныйТокен Цикл
Если Не КлючЗначение.Значение = ПроверяемыйТокен[КлючЗначение.Ключ] Тогда
Лог.Отладка("Не равны ключи %1 = %2", КлючЗначение.Значение, ПроверяемыйТокен[КлючЗначение.Ключ]);
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция СверитьМассивыТокенов(ПроверяемыйМассив, ИдеальныйМассив)
Для ИндексТокена = 0 По ИдеальныйМассив.ВГраница() Цикл
ИдеальныйТокен = ИдеальныйМассив[ИндексТокена];
ПроверяемыйТокен = ПроверяемыйМассив[ИндексТокена];
ТокеныРавны = СверитьТокены(ПроверяемыйТокен, ИдеальныйТокен);
Если НЕ ТокеныРавны Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция ПравильныйОтвет(Ответ1, Ответ2 = Неопределено, Ответ3 = Неопределено, Ответ4 = Неопределено, Ответ5 = Неопределено, Ответ6 = Неопределено, Ответ7 = Неопределено)
Массив = Новый Массив;
Массив.Добавить(Ответ1);
Если ЗначениеЗаполнено(Ответ2) Тогда
Массив.Добавить(Ответ2);
КонецЕсли;
Если ЗначениеЗаполнено(Ответ3) Тогда
Массив.Добавить(Ответ3);
КонецЕсли;
Если ЗначениеЗаполнено(Ответ4) Тогда
Массив.Добавить(Ответ4);
КонецЕсли;
Если ЗначениеЗаполнено(Ответ5) Тогда
Массив.Добавить(Ответ5);
КонецЕсли;
Если ЗначениеЗаполнено(Ответ6) Тогда
Массив.Добавить(Ответ6);
КонецЕсли;
Если ЗначениеЗаполнено(Ответ7) Тогда
Массив.Добавить(Ответ7);
КонецЕсли;
Возврат Массив;
КонецФункции
Функция ТестовыеСлучаи()
ПроверочныеДанные = Новый Соответствие;
ПроверочныеДанные.Вставить("XOPTIONS", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "XOPTIONS", 0)));
ПроверочныеДанные.Вставить("OPTIONSX", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "OPTIONSX", 0)));
ПроверочныеДанные.Вставить("ARG_EXTRA", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG_EXTRA", 0)));
ПроверочныеДанные.Вставить("OPTIONS", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTOptions, "OPTIONS", 0)));
ПроверочныеДанные.Вставить("ОПЦИИ", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTOptions, "ОПЦИИ", 0)));
ПроверочныеДанные.Вставить("[OPTIONS] ", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenSq, "[", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptions, "OPTIONS", 1),
Токены.НовыйТокен(Токены.ТипыТокенов().TTCloseSq, "]", 8)
));
ПроверочныеДанные.Вставить("ARG1 ARG2", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG1", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 5)));
ПроверочныеДанные.Вставить("ARG1 ARG2", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG1", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 6)));
ПроверочныеДанные.Вставить("(", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenPar, "(", 0)));
ПроверочныеДанные.Вставить(")", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTClosePar, ")", 0)));
ПроверочныеДанные.Вставить("...", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTRep, "...", 0)));
ПроверочныеДанные.Вставить("ARG...", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTRep, "...", 3)));
ПроверочныеДанные.Вставить("-a...", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-a", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTRep, "...", 2)));
ПроверочныеДанные.Вставить("[-a...]", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenSq, "[", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-a", 1),
Токены.НовыйТокен(Токены.ТипыТокенов().TTRep, "...", 3),
Токены.НовыйТокен(Токены.ТипыТокенов().TTCloseSq, "]", 6)
)
);
ПроверочныеДанные.Вставить("|", ПравильныйОтвет(Токены.НовыйТокен(Токены.ТипыТокенов().TTChoice, "|", 0)));
ПроверочныеДанные.Вставить("ARG1 |ARG2", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG1", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTChoice, "|", 5),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 6)
)
);
ПроверочныеДанные.Вставить("ARG1| ARG2", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG1", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTChoice, "|", 4),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 6)
)
);
ПроверочныеДанные.Вставить("ARG1|ARG2", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG1", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTChoice, "|", 4),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 5)
)
);
ПроверочныеДанные.Вставить("(ARG)", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenPar, "(", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 1),
Токены.НовыйТокен(Токены.ТипыТокенов().TTClosePar, ")", 4)
)
);
ПроверочныеДанные.Вставить("(-v|-s -b)", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenPar, "(", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-v", 1),
Токены.НовыйТокен(Токены.ТипыТокенов().TTChoice, "|", 3),
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-s", 4),
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-b", 7),
Токены.НовыйТокен(Токены.ТипыТокенов().TTClosePar, ")", 9)
)
);
ПроверочныеДанные.Вставить("( ARG )", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenPar, "(", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 2),
Токены.НовыйТокен(Токены.ТипыТокенов().TTClosePar, ")", 6)
)
);
ПроверочныеДанные.Вставить("[ARG]", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenSq, "[", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 1),
Токены.НовыйТокен(Токены.ТипыТокенов().TTCloseSq, "]", 4)
)
);
ПроверочныеДанные.Вставить("[ ARG ]", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenSq, "[", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 2),
Токены.НовыйТокен(Токены.ТипыТокенов().TTCloseSq, "]", 6)
)
);
ПроверочныеДанные.Вставить("ARG [ARG2 ]", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenSq, "[", 4),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 5),
Токены.НовыйТокен(Токены.ТипыТокенов().TTCloseSq, "]", 10)
)
);
ПроверочныеДанные.Вставить("ARG [ ARG2]", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTOpenSq, "[", 4),
Токены.НовыйТокен(Токены.ТипыТокенов().TTArg, "ARG2", 6),
Токены.НовыйТокен(Токены.ТипыТокенов().TTCloseSq, "]", 10)
)
);
ПроверочныеДанные.Вставить("-p", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-p", 0),
)
);
ПроверочныеДанные.Вставить(" -x", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-x", 1),
)
);
ПроверочныеДанные.Вставить("--force", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTLongOpt, "--force", 0),
)
);
ПроверочныеДанные.Вставить("--sig-proxy", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTLongOpt, "--sig-proxy", 0),
)
);
ПроверочныеДанные.Вставить("-aBc", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptSeq, "-aBc", 0),
)
);
ПроверочныеДанные.Вставить("--", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTDoubleDash, "--", 0),
)
);
ПроверочныеДанные.Вставить("=<bla>", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptValue, "=<bla>", 0),
)
);
ПроверочныеДанные.Вставить("=<bla>", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptValue, "=<bla>", 0),
)
);
ПроверочныеДанные.Вставить("=<bla-bla>", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptValue, "=<bla-bla>", 0),
)
);
ПроверочныеДанные.Вставить("=<bla--bla>", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptValue, "=<bla--bla>", 0),
)
);
ПроверочныеДанные.Вставить("-p=<file-path>", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTShortOpt, "-p", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptValue, "=<file-path>", 2),
)
);
ПроверочныеДанные.Вставить("--path=<file- path>", ПравильныйОтвет(
Токены.НовыйТокен(Токены.ТипыТокенов().TTLongOpt, "--path", 0),
Токены.НовыйТокен(Токены.ТипыТокенов().TTOptValue, "=<file- path>", 6),
)
);
Возврат ПроверочныеДанные
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_lexer");
//Лог.УстановитьУровень(УровниЛога.Отладка);

View File

@@ -0,0 +1,28 @@
#использовать "../src/core"
#Использовать asserts
&Тест
Процедура ПроверитьТМассивДат() Экспорт
// Дано
Команда = ЗагрузитьСценарий("tests/fixtures/КомандаСМассивами.os");
Приложение = Новый КонсольноеПриложение("cp", "");
Приложение.Версия("v version", "1.0");
ПараметрыКоманды = Новый Массив();
ПараметрыКоманды.Добавить("testingarray");
ПараметрыКоманды.Добавить("-a");
ПараметрыКоманды.Добавить("2023-04-13;2023-04-14");
Приложение.ДобавитьКоманду("testingarray", "Тестируем массив", Команда);
// Когда
Приложение.Запустить(ПараметрыКоманды);
// Тогда
Ожидаем.Что(Команда.МассивДат[0], "дата1").Равно(Дата("20230413000000"));
Ожидаем.Что(Команда.МассивДат[1], "дата2").Равно(Дата("20230414000000"));
КонецПроцедуры

View File

@@ -0,0 +1,289 @@
#использовать "../src/core"
#Использовать asserts
#Использовать logos
Перем юТест;
Перем Лог;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингБулевоОпций");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовБулевоОпций");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");
Возврат ИменаТестов;
КонецФункции
Процедура ТестДолжен_ПроверитьПарсингБулевоОпций() Экспорт
force = Опция("f force", Ложь).Флаг();
g = Опция("g", Ложь).Флаг();
x = Опция("x", Ложь).Флаг();
y = Опция("y", Ложь).Флаг();
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-f", force);
ИндексОпций.Вставить("--force", force);
ИндексОпций.Вставить("-g", g);
ИндексОпций.Вставить("-x", x);
ИндексОпций.Вставить("-y", y);
О_Парсера = Новый ОпцияПарсера(force, ИндексОпций);
Утверждения.ПроверитьРавенство("-f", О_Парсера.ВСтроку(), "Парсер опции должен быть равен -f");
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f x", "x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=true x", "x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=false x", "x", "Ложь"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force x", "x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=true x", "x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=false x", "x", "Ложь"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-fgxy x", "-gxy x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-gfxy x", "-gxy x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-gxfy x", "-gxy x", "Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-gxyf x", "-gxy x", "Истина"));
Для каждого Тест Из ТестовыеСлучаи Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Контекст = Новый КонтекстПарсеров();
Результат = О_Парсера.Поиск(Тест.Аргументы, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должен быть найдена");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
Утверждения.ПроверитьРавенство(1, Контекст.Опции[О_Парсера.Опция].Количество(), "Количество результатов должно быть 1");
Утверждения.ПроверитьРавенство(Булево(Контекст.Опции[О_Парсера.Опция][0]), Булево(Тест.ЗначениеОпции[0]), "Ожидаемые результаты должны быть равны");
КонтекстСброса = Новый КонтекстПарсеров();
КонтекстСброса.СбросОпций = Истина;
Результат = О_Парсера.Поиск(Тест.Аргументы, КонтекстСброса);
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должена быть найдена");
КонецЦикла;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьПарсингМассивовБулевоОпций() Экспорт
force = Опция("f force", Ложь).ТМассивБулево();
g = Опция("g", Ложь).Флаг();
x = Опция("x", Ложь).Флаг();
y = Опция("y", Ложь).Флаг();
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-f", force);
ИндексОпций.Вставить("--force", force);
ИндексОпций.Вставить("-g", g);
ИндексОпций.Вставить("-x", x);
ИндексОпций.Вставить("-y", y);
О_Парсера = Новый ОпцияПарсера(force, ИндексОпций);
Утверждения.ПроверитьРавенство("-f", О_Парсера.ВСтроку(), "Парсер опции должен быть равен -f");
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -f x", "x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=true -f=true x", "x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=false -f=false x", "x", "Ложь Ложь"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=true -f=false x", "x", "Истина Ложь"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force --force x", "x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=true --force=true x", "x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=false --force=false x", "x", "Ложь Ложь"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=true --force=false x", "x", "Истина Ложь"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -fgxy x", "-gxy x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -gfxy x", "-gxy x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -gxfy x", "-gxy x", "Истина Истина"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f -gxyf x", "-gxy x", "Истина Истина"));
ТипМассивБулево = Новый ТипМассивБулево();
Для каждого Тест Из ТестовыеСлучаи Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Контекст = Новый КонтекстПарсеров();
Результат = О_Парсера.Поиск(Тест.Аргументы, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должен быть найдена");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Результат = О_Парсера.Поиск(Результат.Аргументы, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должен быть найдена");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
МассивЗначений = Новый Массив;
Для Каждого Значение Из Контекст.Опции[О_Парсера.Опция] Цикл
ТипМассивБулево.УстановитьЗначение(Значение, МассивЗначений);
КонецЦикла;
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
Утверждения.ПроверитьРавенство(ТипМассивБулево.ВСтроку(МассивЗначений), СтрСоединить(Тест.ЗначениеОпции, ", "), "Ожидаемые результаты должны быть равны");
КонтекстСброса = Новый КонтекстПарсеров();
КонтекстСброса.СбросОпций = Истина;
Результат = О_Парсера.Поиск(Тест.Аргументы, КонтекстСброса);
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должена быть найдена");
КонецЦикла;
КонецПроцедуры
Функция ТестовыйСлучай(Знач Аргументы, Знач АргументыВыхода, Знач ЗначениеОпции)
Тест = Новый Структура;
Тест.Вставить("Аргументы", СтрРазделить(Аргументы," "));
Тест.Вставить("АргументыВыхода", СтрРазделить(АргументыВыхода," "));
Тест.Вставить("ЗначениеОпции", СтрРазделить(ЗначениеОпции," "));
Возврат Тест;
КонецФункции
Процедура ТестДолжен_ПроверитьПарсингОпций() Экспорт
НаименованияОпции = Новый Массив;
НаименованияОпции.Добавить("-f");
НаименованияОпции.Добавить("--force");
МассивОпций = Новый Массив;
МассивОпций.Добавить(Опция("f force", "").ТСтрока());
МассивОпций.Добавить(Опция("f force", "").ТЧисло());
// TODO Написать отдельную проверку для дат
МассивОпций.Добавить(Опция("f force", "").ТДата());
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f x", "", "x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=x y", "y", "x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-fx y", "y", "x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-afx y", "-a y", "x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-af x y", "-a y", "x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force x", "", "x"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=x y", "y", "x"));
a = Новый ПараметрКоманды("опция", "a", Ложь, "Тестовый параметр a");
Для каждого Тест Из ТестовыеСлучаи Цикл
Для каждого ОпцияForce Из МассивОпций Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Лог.Отладка("-> тип опции: %1", ОпцияForce.ТипОпции);
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-f", ОпцияForce);
ИндексОпций.Вставить("--force", ОпцияForce);
ИндексОпций.Вставить("-a", a);
АргументыТеста = Тест.Аргументы;
О_Парсера = Новый ОпцияПарсера(ОпцияForce, ИндексОпций);
Утверждения.ПроверитьРавенство("-f", О_Парсера.ВСтроку(), "Парсер опции должен быть равен -f");
Контекст = Новый КонтекстПарсеров();
Результат = О_Парсера.Поиск(АргументыТеста, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должна быть найдена");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
Утверждения.ПроверитьРавенство(1, Контекст.Опции[О_Парсера.Опция].Количество(), "Количество результатов должно быть 1");
Утверждения.ПроверитьРавенство(Контекст.Опции[О_Парсера.Опция][0], Тест.ЗначениеОпции[0], "Ожидаемые результаты должны быть равны");
КонтекстСброса = Новый КонтекстПарсеров();
КонтекстСброса.СбросОпций = Истина;
Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса);
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должна быть найдена");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьПарсингМассивовОпций() Экспорт
НаименованияОпции = Новый Массив;
НаименованияОпции.Добавить("-f");
НаименованияОпции.Добавить("--force");
МассивОпций = Новый Массив;
МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивСтрок());
МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивЧисел());
// TODO Написать отдельную проверку для дат
МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивДат());
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f x -f z", "", "x z"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f=x -f=z y", "y", "x z"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-fx -fz y", "y", "x z"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-afx -yfz", "-a -y", "x z"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-af x -yf z", "-a -y", "x z"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force x --force z", "", "x z"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force=x --force=z y", "y", "x z"));
a = Новый ПараметрКоманды("опция", "a", Ложь, "Тестовый параметр a");
y = Новый ПараметрКоманды("опция", "y", Ложь, "Тестовый параметр a");
Для каждого Тест Из ТестовыеСлучаи Цикл
Для каждого ОпцияForce Из МассивОпций Цикл
НачальноеКоличество = Тест.Аргументы.Количество();
Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " "));
Лог.Отладка("-> тип опции: %1", ОпцияForce.ТипОпции);
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-f", ОпцияForce);
ИндексОпций.Вставить("--force", ОпцияForce);
ИндексОпций.Вставить("-a", a);
ИндексОпций.Вставить("-y", y);
АргументыТеста = Тест.Аргументы;
О_Парсера = Новый ОпцияПарсера(ОпцияForce, ИндексОпций);
Утверждения.ПроверитьРавенство("-f", О_Парсера.ВСтроку(), "Парсер опции должен быть равен -f");
Контекст = Новый КонтекстПарсеров();
Результат = О_Парсера.Поиск(АргументыТеста, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должна быть найдена");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Результат = О_Парсера.Поиск(Результат.Аргументы, Контекст);
Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должна быть найдена");
Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться");
Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны");
Утверждения.ПроверитьРавенство(СтрСоединить(Контекст.Опции[О_Парсера.Опция], " "), СтрСоединить(Тест.ЗначениеОпции, " "), "Ожидаемые результаты должны быть равны");
КонтекстСброса = Новый КонтекстПарсеров();
КонтекстСброса.СбросОпций = Истина;
Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса);
Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должна быть найдена");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция Опция(Наименование, ЗначениеПоУмолчанию)
Возврат Новый ПараметрКоманды("опция", Наименование, ЗначениеПоУмолчанию, "Тестовый параметр f");
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_class_opt");
//Лог.УстановитьУровень(УровниЛога.Отладка);

View File

@@ -0,0 +1,132 @@
#использовать "../src/core"
#Использовать asserts
#Использовать logos
Перем юТест;
Перем Лог;
Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
юТест = Тестирование;
ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсинг");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");
Возврат ИменаТестов;
КонецФункции
Процедура ТестДолжен_ПроверитьПарсинг() Экспорт
опция_a = Опция("a all", "");
опция_b = Опция("b ball", "");
ИндексОпций = Новый Соответствие;
ИндексОпций.Вставить("-a", опция_a);
ИндексОпций.Вставить("--all", опция_a);
ИндексОпций.Вставить("-b", опция_b);
ИндексОпций.Вставить("--ball", опция_b);
Опции = Новый Соответствие;
Опции.Вставить(опция_a, опция_a);
Опции.Вставить(опция_b, опция_b);
аргумент_ARG = Аргумент("ARG", "");
Аргументы = Новый Соответствие;
Аргументы.Вставить(аргумент_ARG, аргумент_ARG);
ИндексАргументов = Новый Соответствие;
ИндексАргументов.Вставить("ARG", аргумент_ARG);
ТестовыеСлучаи = Новый Массив;
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", ""));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a", "S1 -a (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("--all", "S1 -a (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a -b", "S1 -a S2
|S2 -b (S3)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a -b", "S1 -a S2
|S2 -b (S3)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a | -b", "S1 -a (S2)
|S1 -b (S3)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a...", "S1 -a (S2)
|(S2) -a (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("[-a...]", "(S1) -a (S2)
|(S2) -a (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("[-a]...", "(S1) -a (S2)
|(S2) -a (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a -b | ARG", "S1 -a S2
|S2 -b (S3)
|S2 ARG (S4)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a (-b | ARG)", "S1 -a S2
|S2 -b (S3)
|S2 ARG (S4)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("(-a -b) | ARG...", "S1 -a S2
|S1 ARG (S4)
|S2 -b (S3)
|(S4) ARG (S4)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-ab", "S1 -ab (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-a -- ARG", "S1 -a S2
|S2 -- S3
|S3 ARG (S4)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("[OPTIONS]", "(S1) -ab (S2)"));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("[ОПЦИИ]", "(S1) -ab (S2)"));
Для каждого Тест Из ТестовыеСлучаи Цикл
fsm = Новый ВыборСовпадений();
Лог.Отладка("Проверяю тестовый случай: %1", Тест.Спек);
Лог.Отладка("Строка состояния: %1", Тест.Соединения);
Лексер = Новый Лексер(Тест.Спек).Прочитать();
Утверждения.ПроверитьЛожь(Лексер.ЕстьОшибка(), "Лексер должен отработать успешно. Ошибка: " + Лексер.ПолучитьИнформациюОбОшибке());
ТокеныПарсера = Лексер.ПолучитьТокены();
ПараметрыПарсера = Новый Структура;
ПараметрыПарсера.Вставить("Спек", Тест.Спек);
ПараметрыПарсера.Вставить("Опции", Опции);
ПараметрыПарсера.Вставить("Аргументы", Аргументы);
ПараметрыПарсера.Вставить("ОпцииИндекс", ИндексОпций);
ПараметрыПарсера.Вставить("АргументыИндекс", ИндексАргументов);
парсер = Новый Парсер(ТокеныПарсера, ПараметрыПарсера);
НачальноеСостояние = парсер.Прочитать();
СтрокаПути = fsm.СгенеритьСтрокуПути(НачальноеСостояние);
МассивОжиданийСтрок = СтрРазделить(Тест.Соединения, Символы.ПС);
Для каждого ОжидаемаяСтрока Из МассивОжиданийСтрок Цикл
Утверждения.ПроверитьВхождение(СтрокаПути, ОжидаемаяСтрока, "Ожидали, что все строки будут найдены. Тестовый спек: " + Тест.Спек);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция Опция(Наименование, ЗначениеПоУмолчанию)
Возврат Новый ПараметрКоманды("опция", Наименование, ЗначениеПоУмолчанию, "Тестовый параметр f");
КонецФункции
Функция Аргумент(Наименование, ЗначениеПоУмолчанию)
Возврат Новый ПараметрКоманды("Аргумент", Наименование, ЗначениеПоУмолчанию, "Тестовый параметр f");
КонецФункции
Функция ТестовыйСлучай(Знач Спек, Знач Соединения)
Тест = Новый Структура;
Тест.Вставить("Спек",Спек);
Тест.Вставить("Соединения",Соединения);
Возврат Тест;
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.spec_parse");
//Лог.УстановитьУровень(УровниЛога.Отладка);