Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавление типа ТМассивБулево #72

Merged
merged 1 commit into from
Nov 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ $ opm install -f <ПутьКФайлу>
* МассивЧисел
* МассивСтрок
* МассивДат
* МассивБулево
* Перечисление

Для простых типов поддерживается определение типа по значение по умолчанию. Пример,
Expand Down
11 changes: 11 additions & 0 deletions docs/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
- [ТМассивДат](#тмассивдат)
- [ТМассивЧисел](#тмассивчисел)
- [ТМассивСтрок](#тмассивстрок)
- [ТМассивБулево](#тмассивбулево)
- [ТПеречисление](#тперечисление)
- [Перечисление](#перечисление)
- [Описание](#описание-1)
Expand Down Expand Up @@ -767,6 +768,16 @@
// ПараметрКоманды - значение из переменной ЭтотОбъект
```

##### ТМассивБулево

```bsl
// Функция устанавливает тип параметра "Массив" элементы "Булево"
// возвращает текущий параметр команды
//
// Возвращаемое значение:
// ПараметрКоманды - значение из переменной ЭтотОбъект
```

##### ТПеречисление

```bsl
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@

Лог.Отладка("КлассОпции.ТипОпции: %1 ", КлассОпции.ТипОпции);

Если КлассОпции.ТипОпции = Тип("Булево") Тогда
Если КлассОпции.ТипОпции = Тип("Булево")
Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда

Если Не КлассОпции.Имя = Опция.Имя Тогда
ИИ = ИИ + 1;
Expand Down Expand Up @@ -329,7 +330,9 @@

Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы);

ИначеЕсли КлассОпции.ТипОпции = Тип("Булево") Тогда
ИначеЕсли КлассОпции.ТипОпции = Тип("Булево")
Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда

Если Не КлассОпции.имя = Опция.Имя Тогда
Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы);
КонецЕсли;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@

Перем ОписаниеОшибкиКласса;

// Возвращает строковое представление значения типа
//
// Параметры:
// Значение - массив - значение типа
//
// Возвращаемое значение:
// строка - значение в строковом представлении
//
Функция ВСтроку(Значение) Экспорт

Возврат ПреобразоватьМассивВСтроку(Значение);

КонецФункции

// Преобразует и устанавливает входящее значение к значению типа
//
// Параметры:
// ВходящееЗначение - Булево - Значение флага
// Значение - массив - переменная для установки значения
//
// Возвращаемое значение:
// массив - конвертированные значение
//
Функция УстановитьЗначение(Знач ВходящееЗначение, Значение) Экспорт

Если ТипЗнч(ВходящееЗначение) = Тип("Булево") Тогда
Значение.Добавить(ВходящееЗначение);
Иначе
Попытка
Значение.Добавить(Булево(ВходящееЗначение));
Исключение
ОписаниеОшибкиКласса = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;

Возврат Значение;

КонецФункции

// Возвращает описание ошибки и устанавливает признак ошибки
//
// Параметры:
// ЕстьОшибка - булево - произвольная переменная
//
// Возвращаемое значение:
// Строка - описание текущей ошибки преобразования типов
//
Функция Ошибка(ЕстьОшибка = Ложь) Экспорт

Если НЕ ПустаяСтрока(ОписаниеОшибкиКласса) Тогда
ЕстьОшибка = Истина;
КонецЕсли;

Возврат ОписаниеОшибкиКласса;

КонецФункции

Функция ПреобразоватьМассивВСтроку(МассивЗначений)

Если НЕ ТипЗнч(МассивЗначений) = Тип("Массив") Тогда
Возврат "";
КонецЕсли;

МассивСтрок = Новый Массив;
Для Каждого Значение Из МассивЗначений Цикл
МассивСтрок.Добавить(Формат(Значение, "БЛ=Ложь; БИ=Истина"));
КонецЦикла;

Возврат СтрСоединить(МассивСтрок, ", ");

КонецФункции

ОписаниеОшибкиКласса = "";
21 changes: 20 additions & 1 deletion src/core/Классы/ПараметрКоманды.os
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@
// Содержит тип параметра
Перем ТипОпции Экспорт; // Тип

Перем ТипЭлементаОпции; // Тип, для элементов, если ТипОпции = Тип("Массив")
// Содержит тип элементов значения параметра, если ТипОпции = Тип("Массив")
Перем ТипЭлементаОпции Экспорт; // Тип

Перем НеОбязательныйПараметр; // Булево
Перем ТипПараметра; // Опция и аргумент
Перем ТипЗначенияПараметра; // Произвольный класс реализуемые несколько обязательных методов
Expand Down Expand Up @@ -417,6 +419,22 @@

КонецФункции

// Функция устанавливает тип параметра "Массив" элементы "Булево"
// возвращает текущий параметр команды
//
// Возвращаемое значение:
// ПараметрКоманды - значение из переменной ЭтотОбъект
Функция ТМассивБулево() Экспорт

ТипОпции = Тип("Массив");
ТипЭлементаОпции = Тип("Булево");
ТипЗначенияПараметра = Новый ТипМассивБулево();
Значение = Новый Массив;
СкрытьЗначение = Истина;
Возврат ЭтотОбъект;

КонецФункции

// Функция устанавливает описание параметра для справки
// возвращает текущий параметр команды
//
Expand Down Expand Up @@ -597,6 +615,7 @@
ВстроенныеТипы.Вставить("ТипМассивЧисел", Тип("ТипМассивЧисел"));
ВстроенныеТипы.Вставить("ТипМассивСтрок", Тип("ТипМассивСтрок"));
ВстроенныеТипы.Вставить("ТипМассивДат", Тип("ТипМассивДат"));
ВстроенныеТипы.Вставить("ТипМассивБулево", Тип("ТипМассивБулево"));
ВстроенныеТипы.Вставить("ТипПеречисление", Тип("ТипПеречисление"));

Возврат ВстроенныеТипы;
Expand Down
68 changes: 67 additions & 1 deletion tests/ОпцияПарсера_test.os
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
ИменаТестов = Новый Массив;

ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингБулевоОпций");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовБулевоОпций");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");

Expand Down Expand Up @@ -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) не должена быть найдена");

КонецЦикла;

КонецПроцедуры

Функция ТестовыйСлучай(Знач Аргументы, Знач АргументыВыхода, Знач ЗначениеОпции)

Тест = Новый Структура;
Expand Down Expand Up @@ -158,7 +224,7 @@
МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивЧисел());
// TODO Написать отдельную проверку для дат
МассивОпций.Добавить(Опция("f force", Новый Массив).ТМассивДат());


ТестовыеСлучаи = Новый Массив;

Expand Down