Skip to content

Commit

Permalink
fix: Исправление парсинга аргументов команды с пустым значением alei1…
Browse files Browse the repository at this point in the history
  • Loading branch information
Stivo182 committed Feb 21, 2025
1 parent d01433d commit 2d3a4e1
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 46 deletions.
10 changes: 10 additions & 0 deletions src/core/Классы/КонвертерКомандыCURL.os
Original file line number Diff line number Diff line change
Expand Up @@ -1534,8 +1534,18 @@

Если ОписаниеЗапроса.АдресаРесурсов.Количество() = 0 Тогда
ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка("Не указан URL"));
Возврат;
КонецЕсли;

ПорядковыйНомер = 0;
Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл
ПорядковыйНомер = ПорядковыйНомер + 1;
Если Не ЗначениеЗаполнено(ОписаниеРесурса.URL) Тогда
ТекстОшибки = СтрШаблон("Не указан URL #%1", ПорядковыйНомер);
ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка(ТекстОшибки));
КонецЕсли;
КонецЦикла;

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

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

Если Не Токен = Неопределено И Не ОткрытаКавычка() И ЭтоРазделительАргументов(Токен) Тогда
НеобходимоПропуститьПробельныеСимволы = Не Токен = Неопределено
И Не ОткрытаКавычка()
И ЭтоРазделительАргументов(Токен);

Если НеобходимоПропуститьПробельныеСимволы Тогда
ДобавитьАргумент();
Токен = ПропуститьПробелыИПереносСтроки();
КонецЕсли;

Если Не Токен = Неопределено
И (Не НачатьНовуюКоманду Или Не Токен.ТипТокена() = "ОператорСвязыванияКоманд")
И Не Токен.ТипТокена() = "ПереносСтроки" Тогда
ДополнитьНакопительнуюСтроку(Токен.Значение());
ДополнитьНакопительнуюСтроку(Токен.Значение());
ПромотатьЗначениеПараметра();
КонецЕсли;

Аргумент = ПолучитьНакопительнуюСтроку();

Если СтрДлина(Аргумент) > 0 Тогда
ДобавитьАргумент(Аргумент);
КонецЕсли;

ДобавитьАргумент();

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

Функция ПромотатьЗначениеПараметра()
Expand All @@ -127,6 +129,9 @@
Пока Токенайзер.ЕстьЕщеТокены() Цикл

Токен = ПолучитьСледующийТокен();
Если Токен = Неопределено Тогда
Возврат Токен;
КонецЕсли;

Если КавычкаБылаОткрыта <> ОткрытаКавычка()
Или КавычкаБылаОткрыта
Expand Down Expand Up @@ -166,10 +171,16 @@
Пока Токенайзер.ЕстьЕщеТокены() Цикл

Токен = ПолучитьСледующийТокен();
Если Токен = Неопределено Тогда
Возврат Токен;
КонецЕсли;

Если Не Токен.ТипТокена() = "ПробельныйСимвол" Тогда
Возврат Токен;
КонецЕсли;

ДобавитьАргумент();

КонецЦикла;

КонецФункции
Expand Down Expand Up @@ -217,29 +228,21 @@

Если Токен.ТипТокена() = "КавычкаБезПоддержкиИнтерполяции" И Не ОткрытаКавычкаСПоддержкойИнтерполяции Тогда
Если Не ЭкранироватьСимвол Тогда
ОткрытаКавычкаБезПоддержкиИнтерполяции = Не ОткрытаКавычкаБезПоддержкиИнтерполяции;
ОткрытаКавычкаДоПолученияТокена = ОткрытаКавычкаБезПоддержкиИнтерполяции;

Токен = ПолучитьСледующийТокен();
Если ОткрытаКавычкаДоПолученияТокена И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
ДобавитьАргумент("");
Если ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
ДополнитьНакопительнуюСтроку("");
КонецЕсли;

Возврат Токен;
ОткрытаКавычкаБезПоддержкиИнтерполяции = Не ОткрытаКавычкаБезПоддержкиИнтерполяции;
Возврат ПолучитьСледующийТокен();
КонецЕсли;
КонецЕсли;

Если Токен.ТипТокена() = "КавычкаСПоддержкойИнтерполяции" И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
Если Не ЭкранироватьСимвол Тогда
ОткрытаКавычкаСПоддержкойИнтерполяции = Не ОткрытаКавычкаСПоддержкойИнтерполяции;
ОткрытаКавычкаДоПолученияТокена = ОткрытаКавычкаСПоддержкойИнтерполяции;

Токен = ПолучитьСледующийТокен();
Если ОткрытаКавычкаДоПолученияТокена И Не ОткрытаКавычкаСПоддержкойИнтерполяции Тогда
ДобавитьАргумент("");
Если ОткрытаКавычкаСПоддержкойИнтерполяции Тогда
ДополнитьНакопительнуюСтроку("");
КонецЕсли;

Возврат Токен;
ОткрытаКавычкаСПоддержкойИнтерполяции = Не ОткрытаКавычкаСПоддержкойИнтерполяции;
Возврат ПолучитьСледующийТокен();
КонецЕсли;
КонецЕсли;

Expand All @@ -261,14 +264,30 @@
КонецПроцедуры

Процедура ДополнитьНакопительнуюСтроку(Значение)

Если НакопленнаяСтрока = Неопределено Тогда
НакопленнаяСтрока = "";
КонецЕсли;

НакопленнаяСтрока = НакопленнаяСтрока + Значение;

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

Процедура ДобавитьАргумент(Значение)
Процедура ДобавитьАргумент()

Значение = НакопленнаяСтрока;
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;

Если АргументыКоманд.Количество() = 0 Тогда
ДобавитьНовуюКоманду();
КонецЕсли;

АргументыКоманд[АргументыКоманд.ВГраница()].Добавить(Значение);

ОчиститьНакопительнуюСтроку();

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

Процедура ДобавитьНовуюКоманду()
Expand All @@ -285,16 +304,9 @@
КонецПроцедуры

Процедура ОчиститьНакопительнуюСтроку()
НакопленнаяСтрока = "";
НакопленнаяСтрока = Неопределено;
КонецПроцедуры

Функция ПолучитьНакопительнуюСтроку()
Результат = НакопленнаяСтрока;
ОчиститьНакопительнуюСтроку();

Возврат Результат;
КонецФункции

Функция ОткрытаКавычка()
Возврат ОткрытаКавычкаБезПоддержкиИнтерполяции Или ОткрытаКавычкаСПоддержкойИнтерполяции;
КонецФункции
Expand Down
16 changes: 16 additions & 0 deletions tests/КонвертерКомандыCURL_test.os
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,22 @@

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

&Тест
Процедура ТестДолжен_ПроверитьОшибкуНеУказанОдинИзURL() Экспорт

КонсольнаяКоманда = "curl example1.com '' example2.com";

Ошибки = Неопределено;

Результат = КонвертерКомандыCURL.Конвертировать(КонсольнаяКоманда,, Ошибки);

Ожидаем.Что(Результат).Не_().Заполнено();
Ожидаем.Что(Ошибки).Заполнено();
Ожидаем.Что(Ошибки[0].Текст).Равно("Не указан URL #2");
Ожидаем.Что(Ошибки[0].Критичная).ЭтоИстина();

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

&Тест
Процедура ТестДолжен_ПроверитьОшибкуНеУдалосьПолучитьНомерПортаИзURL() Экспорт

Expand Down
103 changes: 91 additions & 12 deletions tests/ПарсерКонсольнойКоманды_test.os
Original file line number Diff line number Diff line change
Expand Up @@ -219,23 +219,102 @@
&Тест
Процедура ТестДолжен_ПроверитьПоддержкуПустогоЗначения() Экспорт

КоманднаяСтрока = "myapp -a '' -b ' '";

КоманднаяСтрока = "myapp1 -a '' -b ' '
|myapp2 url ''
|myapp3 url """"
|myapp4 url''
|myapp5 url""""
|myapp6 url '' -f
|myapp7 url """" -f
|myapp8 url''''
|myapp9 url""""""""
|myapp10 url '' '' ''
|myapp11 url """" """"";

Эталон = Новый Массив;
Эталон.Добавить("myapp");
Эталон.Добавить("-a");
Эталон.Добавить("");
Эталон.Добавить("-b");
Эталон.Добавить(" ");


Команда = Новый Массив;
Команда.Добавить("myapp1");
Команда.Добавить("-a");
Команда.Добавить("");
Команда.Добавить("-b");
Команда.Добавить(" ");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp2");
Команда.Добавить("url");
Команда.Добавить("");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp3");
Команда.Добавить("url");
Команда.Добавить("");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp4");
Команда.Добавить("url");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp5");
Команда.Добавить("url");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp6");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("-f");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp7");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("-f");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp8");
Команда.Добавить("url");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp9");
Команда.Добавить("url");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp10");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("");
Команда.Добавить("");
Эталон.Добавить(Команда);

Команда = Новый Массив;
Команда.Добавить("myapp11");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("");
Эталон.Добавить(Команда);

Парсер = Новый ПарсерКонсольнойКоманды();
Результат = Парсер.Распарсить(КоманднаяСтрока);

Ожидаем.Что(Результат).ИмеетДлину(1);
Ожидаем.Что(Результат[0]).ИмеетДлину(Эталон.Количество());
Ожидаем.Что(Результат).ИмеетДлину(Эталон.Количество());

Для Инд = 0 По Результат[0].ВГраница() Цикл
Ожидаем.Что(Результат[0][Инд]).Равно(Эталон[Инд]);
Для Инд1 = 0 По Результат.ВГраница() Цикл
Заголовок = СтрШаблон("Команда: %1", Инд1 + 1);
Ожидаем.Что(Результат[Инд1], Заголовок).ИмеетДлину(Эталон[Инд1].Количество());

Для Инд2 = 0 По Результат[Инд1].ВГраница() Цикл
Заголовок = СтрШаблон("Команда: %1, аргумент: %2", Инд1 + 1, Инд2 + 1);
Ожидаем.Что(Результат[Инд1][Инд2], Заголовок).Равно(Эталон[Инд1][Инд2]);
КонецЦикла;
КонецЦикла;

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

0 comments on commit 2d3a4e1

Please sign in to comment.