From 4093a7472ce9e6ba4c0066c3e9ba23d395177161 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 16 Nov 2024 04:24:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D0=B0=20=D0=A2=D0=9C?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D0=91=D1=83=D0=BB=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/readme.md | 11 +++ ...21\200\321\201\320\265\321\200\320\260.os" | 7 +- ...21\203\320\273\320\265\320\262\320\276.os" | 76 +++++++++++++++++++ ...20\274\320\260\320\275\320\264\321\213.os" | 21 ++++- ...0\321\201\320\265\321\200\320\260_test.os" | 68 ++++++++++++++++- 6 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\221\321\203\320\273\320\265\320\262\320\276.os" diff --git a/README.md b/README.md index 5fcd01f..b46d293 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,7 @@ $ opm install -f <ПутьКФайлу> * МассивЧисел * МассивСтрок * МассивДат +* МассивБулево * Перечисление Для простых типов поддерживается определение типа по значение по умолчанию. Пример, diff --git a/docs/readme.md b/docs/readme.md index 0235190..db47911 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -76,6 +76,7 @@ - [ТМассивДат](#тмассивдат) - [ТМассивЧисел](#тмассивчисел) - [ТМассивСтрок](#тмассивстрок) + - [ТМассивБулево](#тмассивбулево) - [ТПеречисление](#тперечисление) - [Перечисление](#перечисление) - [Описание](#описание-1) @@ -767,6 +768,16 @@ // ПараметрКоманды - значение из переменной ЭтотОбъект ``` +##### ТМассивБулево + +```bsl +// Функция устанавливает тип параметра "Массив" элементы "Булево" +// возвращает текущий параметр команды +// +// Возвращаемое значение: +// ПараметрКоманды - значение из переменной ЭтотОбъект +``` + ##### ТПеречисление ```bsl 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\321\217\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\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" index 78246e5..9fac891 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\321\217\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\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -173,7 +173,8 @@ Лог.Отладка("КлассОпции.ТипОпции: %1 ", КлассОпции.ТипОпции); - Если КлассОпции.ТипОпции = Тип("Булево") Тогда + Если КлассОпции.ТипОпции = Тип("Булево") + Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда Если Не КлассОпции.Имя = Опция.Имя Тогда ИИ = ИИ + 1; @@ -329,7 +330,9 @@ Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); - ИначеЕсли КлассОпции.ТипОпции = Тип("Булево") Тогда + ИначеЕсли КлассОпции.ТипОпции = Тип("Булево") + Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда + Если Не КлассОпции.имя = Опция.Имя Тогда Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы); КонецЕсли; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\221\321\203\320\273\320\265\320\262\320\276.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\221\321\203\320\273\320\265\320\262\320\276.os" new file mode 100644 index 0000000..e599408 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\221\321\203\320\273\320\265\320\262\320\276.os" @@ -0,0 +1,76 @@ + +Перем ОписаниеОшибкиКласса; + +// Возвращает строковое представление значения типа +// +// Параметры: +// Значение - массив - значение типа +// +// Возвращаемое значение: +// строка - значение в строковом представлении +// +Функция ВСтроку(Значение) Экспорт + + Возврат ПреобразоватьМассивВСтроку(Значение); + +КонецФункции + +// Преобразует и устанавливает входящее значение к значению типа +// +// Параметры: +// ВходящееЗначение - Булево - Значение флага +// Значение - массив - переменная для установки значения +// +// Возвращаемое значение: +// массив - конвертированные значение +// +Функция УстановитьЗначение(Знач ВходящееЗначение, Значение) Экспорт + + Если ТипЗнч(ВходящееЗначение) = Тип("Булево") Тогда + Значение.Добавить(ВходящееЗначение); + Иначе + Попытка + Значение.Добавить(Булево(ВходящееЗначение)); + Исключение + ОписаниеОшибкиКласса = ОписаниеОшибки(); + КонецПопытки; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +// Возвращает описание ошибки и устанавливает признак ошибки +// +// Параметры: +// ЕстьОшибка - булево - произвольная переменная +// +// Возвращаемое значение: +// Строка - описание текущей ошибки преобразования типов +// +Функция Ошибка(ЕстьОшибка = Ложь) Экспорт + + Если НЕ ПустаяСтрока(ОписаниеОшибкиКласса) Тогда + ЕстьОшибка = Истина; + КонецЕсли; + + Возврат ОписаниеОшибкиКласса; + +КонецФункции + +Функция ПреобразоватьМассивВСтроку(МассивЗначений) + + Если НЕ ТипЗнч(МассивЗначений) = Тип("Массив") Тогда + Возврат ""; + КонецЕсли; + + МассивСтрок = Новый Массив; + Для Каждого Значение Из МассивЗначений Цикл + МассивСтрок.Добавить(Формат(Значение, "БЛ=Ложь; БИ=Истина")); + КонецЦикла; + + Возврат СтрСоединить(МассивСтрок, ", "); + +КонецФункции + +ОписаниеОшибкиКласса = ""; \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index 2fcf843..0764c0c 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -48,7 +48,9 @@ // Содержит тип параметра Перем ТипОпции Экспорт; // Тип -Перем ТипЭлементаОпции; // Тип, для элементов, если ТипОпции = Тип("Массив") +// Содержит тип элементов значения параметра, если ТипОпции = Тип("Массив") +Перем ТипЭлементаОпции Экспорт; // Тип + Перем НеОбязательныйПараметр; // Булево Перем ТипПараметра; // Опция и аргумент Перем ТипЗначенияПараметра; // Произвольный класс реализуемые несколько обязательных методов @@ -417,6 +419,22 @@ КонецФункции +// Функция устанавливает тип параметра "Массив" элементы "Булево" +// возвращает текущий параметр команды +// +// Возвращаемое значение: +// ПараметрКоманды - значение из переменной ЭтотОбъект +Функция ТМассивБулево() Экспорт + + ТипОпции = Тип("Массив"); + ТипЭлементаОпции = Тип("Булево"); + ТипЗначенияПараметра = Новый ТипМассивБулево(); + Значение = Новый Массив; + СкрытьЗначение = Истина; + Возврат ЭтотОбъект; + +КонецФункции + // Функция устанавливает описание параметра для справки // возвращает текущий параметр команды // @@ -597,6 +615,7 @@ ВстроенныеТипы.Вставить("ТипМассивЧисел", Тип("ТипМассивЧисел")); ВстроенныеТипы.Вставить("ТипМассивСтрок", Тип("ТипМассивСтрок")); ВстроенныеТипы.Вставить("ТипМассивДат", Тип("ТипМассивДат")); + ВстроенныеТипы.Вставить("ТипМассивБулево", Тип("ТипМассивБулево")); ВстроенныеТипы.Вставить("ТипПеречисление", Тип("ТипПеречисление")); Возврат ВстроенныеТипы; diff --git "a/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" "b/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" index 6822823..ceb64c3 100644 --- "a/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" +++ "b/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" @@ -12,6 +12,7 @@ ИменаТестов = Новый Массив; ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингБулевоОпций"); + ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовБулевоОпций"); ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций"); ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций"); @@ -72,6 +73,71 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьПарсингМассивовБулевоОпций() Экспорт + + 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) не должена быть найдена"); + + КонецЦикла; + +КонецПроцедуры + Функция ТестовыйСлучай(Знач Аргументы, Знач АргументыВыхода, Знач ЗначениеОпции) Тест = Новый Структура; @@ -158,7 +224,7 @@ МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивЧисел()); // TODO Написать отдельную проверку для дат МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивДат()); - + ТестовыеСлучаи = Новый Массив;