From 2d3a4e1c8a6c9f847270d8cd73025c0988815439 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 22 Feb 2025 01:46:05 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B0=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= =?UTF-8?q?=20=D1=81=20=D0=BF=D1=83=D1=81=D1=82=D1=8B=D0=BC=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20#176?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...74\320\260\320\275\320\264\321\213CURL.os" | 10 ++ ...20\274\320\260\320\275\320\264\321\213.os" | 80 ++++++++------ ...0\260\320\275\320\264\321\213CURL_test.os" | 16 +++ ...4\320\260\320\275\320\264\321\213_test.os" | 103 ++++++++++++++++-- 4 files changed, 163 insertions(+), 46 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" index 2d468eb..8ad0734 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" @@ -1534,8 +1534,18 @@ Если ОписаниеЗапроса.АдресаРесурсов.Количество() = 0 Тогда ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка("Не указан URL")); + Возврат; КонецЕсли; + ПорядковыйНомер = 0; + Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл + ПорядковыйНомер = ПорядковыйНомер + 1; + Если Не ЗначениеЗаполнено(ОписаниеРесурса.URL) Тогда + ТекстОшибки = СтрШаблон("Не указан URL #%1", ПорядковыйНомер); + ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка(ТекстОшибки)); + КонецЕсли; + КонецЦикла; + КонецПроцедуры Процедура ПроверитьПоддержкуПротокола(ОписаниеЗапроса, ПоддерживаемыеПротоколы) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\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\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index e2bf6fd..8264639 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\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\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -81,27 +81,29 @@ Если НачатьНовуюКоманду Тогда Если Не Токен = Неопределено И Токен.ТипТокена() = "ОператорСвязыванияКоманд" Тогда Возврат; - КонецЕсли; + КонецЕсли; + ДобавитьАргумент(); ДобавитьНовуюКоманду(); КонецЕсли; - Если Не Токен = Неопределено И Не ОткрытаКавычка() И ЭтоРазделительАргументов(Токен) Тогда + НеобходимоПропуститьПробельныеСимволы = Не Токен = Неопределено + И Не ОткрытаКавычка() + И ЭтоРазделительАргументов(Токен); + + Если НеобходимоПропуститьПробельныеСимволы Тогда + ДобавитьАргумент(); Токен = ПропуститьПробелыИПереносСтроки(); КонецЕсли; Если Не Токен = Неопределено И (Не НачатьНовуюКоманду Или Не Токен.ТипТокена() = "ОператорСвязыванияКоманд") И Не Токен.ТипТокена() = "ПереносСтроки" Тогда - ДополнитьНакопительнуюСтроку(Токен.Значение()); + ДополнитьНакопительнуюСтроку(Токен.Значение()); ПромотатьЗначениеПараметра(); - КонецЕсли; - - Аргумент = ПолучитьНакопительнуюСтроку(); - - Если СтрДлина(Аргумент) > 0 Тогда - ДобавитьАргумент(Аргумент); КонецЕсли; + ДобавитьАргумент(); + КонецПроцедуры Функция ПромотатьЗначениеПараметра() @@ -127,6 +129,9 @@ Пока Токенайзер.ЕстьЕщеТокены() Цикл Токен = ПолучитьСледующийТокен(); + Если Токен = Неопределено Тогда + Возврат Токен; + КонецЕсли; Если КавычкаБылаОткрыта <> ОткрытаКавычка() Или КавычкаБылаОткрыта @@ -166,10 +171,16 @@ Пока Токенайзер.ЕстьЕщеТокены() Цикл Токен = ПолучитьСледующийТокен(); + Если Токен = Неопределено Тогда + Возврат Токен; + КонецЕсли; + Если Не Токен.ТипТокена() = "ПробельныйСимвол" Тогда Возврат Токен; КонецЕсли; + ДобавитьАргумент(); + КонецЦикла; КонецФункции @@ -217,29 +228,21 @@ Если Токен.ТипТокена() = "КавычкаБезПоддержкиИнтерполяции" И Не ОткрытаКавычкаСПоддержкойИнтерполяции Тогда Если Не ЭкранироватьСимвол Тогда - ОткрытаКавычкаБезПоддержкиИнтерполяции = Не ОткрытаКавычкаБезПоддержкиИнтерполяции; - ОткрытаКавычкаДоПолученияТокена = ОткрытаКавычкаБезПоддержкиИнтерполяции; - - Токен = ПолучитьСледующийТокен(); - Если ОткрытаКавычкаДоПолученияТокена И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда - ДобавитьАргумент(""); + Если ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда + ДополнитьНакопительнуюСтроку(""); КонецЕсли; - - Возврат Токен; + ОткрытаКавычкаБезПоддержкиИнтерполяции = Не ОткрытаКавычкаБезПоддержкиИнтерполяции; + Возврат ПолучитьСледующийТокен(); КонецЕсли; КонецЕсли; Если Токен.ТипТокена() = "КавычкаСПоддержкойИнтерполяции" И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда Если Не ЭкранироватьСимвол Тогда - ОткрытаКавычкаСПоддержкойИнтерполяции = Не ОткрытаКавычкаСПоддержкойИнтерполяции; - ОткрытаКавычкаДоПолученияТокена = ОткрытаКавычкаСПоддержкойИнтерполяции; - - Токен = ПолучитьСледующийТокен(); - Если ОткрытаКавычкаДоПолученияТокена И Не ОткрытаКавычкаСПоддержкойИнтерполяции Тогда - ДобавитьАргумент(""); + Если ОткрытаКавычкаСПоддержкойИнтерполяции Тогда + ДополнитьНакопительнуюСтроку(""); КонецЕсли; - - Возврат Токен; + ОткрытаКавычкаСПоддержкойИнтерполяции = Не ОткрытаКавычкаСПоддержкойИнтерполяции; + Возврат ПолучитьСледующийТокен(); КонецЕсли; КонецЕсли; @@ -261,14 +264,30 @@ КонецПроцедуры Процедура ДополнитьНакопительнуюСтроку(Значение) + + Если НакопленнаяСтрока = Неопределено Тогда + НакопленнаяСтрока = ""; + КонецЕсли; + НакопленнаяСтрока = НакопленнаяСтрока + Значение; + КонецПроцедуры -Процедура ДобавитьАргумент(Значение) +Процедура ДобавитьАргумент() + + Значение = НакопленнаяСтрока; + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + Если АргументыКоманд.Количество() = 0 Тогда ДобавитьНовуюКоманду(); КонецЕсли; + АргументыКоманд[АргументыКоманд.ВГраница()].Добавить(Значение); + + ОчиститьНакопительнуюСтроку(); + КонецПроцедуры Процедура ДобавитьНовуюКоманду() @@ -285,16 +304,9 @@ КонецПроцедуры Процедура ОчиститьНакопительнуюСтроку() - НакопленнаяСтрока = ""; + НакопленнаяСтрока = Неопределено; КонецПроцедуры -Функция ПолучитьНакопительнуюСтроку() - Результат = НакопленнаяСтрока; - ОчиститьНакопительнуюСтроку(); - - Возврат Результат; -КонецФункции - Функция ОткрытаКавычка() Возврат ОткрытаКавычкаБезПоддержкиИнтерполяции Или ОткрытаКавычкаСПоддержкойИнтерполяции; КонецФункции diff --git "a/tests/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL_test.os" "b/tests/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL_test.os" index b794fef..99a3579 100644 --- "a/tests/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL_test.os" +++ "b/tests/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL_test.os" @@ -95,6 +95,22 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_ПроверитьОшибкуНеУказанОдинИзURL() Экспорт + + КонсольнаяКоманда = "curl example1.com '' example2.com"; + + Ошибки = Неопределено; + + Результат = КонвертерКомандыCURL.Конвертировать(КонсольнаяКоманда,, Ошибки); + + Ожидаем.Что(Результат).Не_().Заполнено(); + Ожидаем.Что(Ошибки).Заполнено(); + Ожидаем.Что(Ошибки[0].Текст).Равно("Не указан URL #2"); + Ожидаем.Что(Ошибки[0].Критичная).ЭтоИстина(); + +КонецПроцедуры + &Тест Процедура ТестДолжен_ПроверитьОшибкуНеУдалосьПолучитьНомерПортаИзURL() Экспорт diff --git "a/tests/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213_test.os" "b/tests/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213_test.os" index a61d4d9..c6c75be 100644 --- "a/tests/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213_test.os" +++ "b/tests/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213_test.os" @@ -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]); + КонецЦикла; КонецЦикла; КонецПроцедуры