diff --git a/.github/workflows/qa.yaml b/.github/workflows/qa.yaml new file mode 100644 index 0000000..2fc3c70 --- /dev/null +++ b/.github/workflows/qa.yaml @@ -0,0 +1,15 @@ +name: Контроль качества + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + sonar: + uses: autumn-library/workflows/.github/workflows/sonar.yml@v1 + with: + github_repository: oscript-library/semver + coveralls: true + secrets: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 6d5ed9f..0538b2f 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -10,7 +10,14 @@ jobs: strategy: fail-fast: false matrix: - oscript_version: ['dev', 'lts-dev', 'default'] - uses: autumn-library/workflows/.github/workflows/test.yml@main + include: + - oscript_version: 'default' + test_engine: '1testrunner' + - oscript_version: 'stable' + test_engine: '1testrunner' + - oscript_version: 'dev' + test_engine: 'oneunit' + uses: autumn-library/workflows/.github/workflows/test.yml@oneunit with: - oscript_version: ${{ matrix.oscript_version }} \ No newline at end of file + oscript_version: ${{ matrix.oscript_version }} + test_engine: ${{ matrix.test_engine }} diff --git a/packagedef b/packagedef index 5b1ad2c..436d83c 100644 --- a/packagedef +++ b/packagedef @@ -4,7 +4,7 @@ // Описание.Имя("semver") - .Версия("0.6.0") + .Версия("1.0.0") .Автор("Khorev Aleksey") .АдресАвтора("Khorevaa@gmail.com") .Описание("Эта библиотека облегчает работу с семантическими версиями") @@ -14,8 +14,8 @@ .ВключитьФайл("tests") .ЗависитОт("logos") .ЗависитОт("strings") - .ЗависитОт("fluent", "0.6.1") .РазработкаЗависитОт("1testrunner", "1.9.2") + .РазработкаЗависитОт("coverage", "0.7.0") .ОпределяетМодуль("Версии", "src/core/Модули/Версии.os") .ОпределяетКласс("Версия", "src/core/Классы/Версия.os") .ОпределяетКласс("ДиапазонВерсий", "src/core/Классы/ДиапазонВерсий.os") diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..8b6b230 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,6 @@ +sonar.projectKey=semver +sonar.projectName=semver +sonar.sources=./src +sonar.tests=./tests +sonar.sourceEncoding=UTF-8 +sonar.coverageReportPaths=out/genericCoverage.xml diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 5d70c16..3318cac 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -8,7 +8,7 @@ Перем Патч Экспорт; // число Перем ПреРелиз Экспорт; // Массив -Перем НомерБилда Экспорт; // Массив; +Перем МетаданныеСборки Экспорт; // Массив; Перем ОшибкаЧтенияВерсии Экспорт; Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой) @@ -17,6 +17,7 @@ Второстепенная = 0; Патч = 0; ПреРелиз = Новый Массив; + МетаданныеСборки = Новый Массив; Прочитать(ВерсияСтрокой); @@ -47,6 +48,14 @@ Функция ВСтроку() Экспорт СтрокаВерсии = СтрШаблон("%1.%2.%3", Строка(Основная), Строка(Второстепенная), Строка(Патч)); + + Если ПреРелиз.Количество() Тогда + СтрокаВерсии = СтрокаВерсии + "-" + СтрСоединить(ПреРелиз, "."); + КонецЕсли; + + Если МетаданныеСборки.Количество() Тогда + СтрокаВерсии = СтрокаВерсии + "+" + СтрСоединить(МетаданныеСборки, "."); + КонецЕсли; Возврат СтрокаВерсии; @@ -64,7 +73,7 @@ Если НЕ Основная = ВходящаяВерсия.Основная Тогда - Возврат ?(Основная > ВходящаяВерсия.Основная,1,-1); + Возврат ?(Основная > ВходящаяВерсия.Основная, 1,-1); КонецЕсли; @@ -86,12 +95,7 @@ КонецЕсли; Если ПреРелиз.Количество() = 0 - И ВходящаяВерсия.ПреРелиз.Количество() = 0 Тогда - Возврат 0; - КонецЕсли; - - Если ПреРелиз.Количество() = 0 - И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда + И ВходящаяВерсия.ПреРелиз.Количество() > 0 Тогда Возврат 1; КонецЕсли; @@ -100,7 +104,7 @@ Возврат -1; КонецЕсли; - Возврат 0; + Возврат СравнитьПререлизы(ВходящаяВерсия.ПреРелиз); КонецФункции @@ -164,6 +168,38 @@ Возврат Сравнить(ВходящаяВерсия) >= 0; КонецФункции +Функция СравнитьПреРелизы(Знач Сравниваемое) + // Поэлементное сравнение + Для Сч = 0 По Макс(ПреРелиз.ВГраница(), Сравниваемое.ВГраница()) Цикл + // Больший набор предрелизных символов имеет больший приоритет, + // чем меньший набор, если сравниваемые идентификаторы равны => + // если компоненты будут равны, побеждает тот, у кого компонентов больше + + Если Сч > ПреРелиз.ВГраница() Тогда + Возврат -1; + ИначеЕсли Сч > Сравниваемое.ВГраница() Тогда + Возврат 1; + КонецЕсли; + + Текущий = ПреРелиз[Сч]; + Входящий = Сравниваемое[Сч]; + + Если Текущий = Входящий Тогда + Продолжить; + КонецЕсли; + + // Численные идентификаторы имеют низший приоритет + Если ТипЗнч(Текущий) <> ТипЗнч(Входящий) Тогда + Возврат ?(ТипЗнч(Текущий) = Тип("Строка"), 1, -1); + КонецЕсли; + + Возврат ?(Текущий > Входящий, 1, -1); + + КонецЦикла; + + Возврат 0; +КонецФункции + Процедура Прочитать(Знач ВерсияСтрокой) Если СтрДлина(ВерсияСтрокой) = 0 Тогда @@ -173,64 +209,128 @@ ВерсияСтрокой = ПодготовитьКЧтению(ВерсияСтрокой); - МассивСтрокВерсии = СтрРазделить(ВерсияСтрокой, "."); - - Если МассивСтрокВерсии.Количество() < 3 Тогда - ОшибкаЧтенияВерсии = "Не найдены все составляющие версии"; - Возврат; - КонецЕсли; + Парсер = Новый ПарсерВерсии(ВерсияСтрокой); + Парсер.Следующий(); - СтрокаОсновнаяВерсия = МассивСтрокВерсии[0]; + Попытка + ПрочитатьЧислоДоРазделителя(Парсер, Основная, "Основная версия"); + ПрочитатьРазделитель(Парсер, "."); + ПрочитатьЧислоДоРазделителя(Парсер, Второстепенная, "Второстепенная версия"); + ПрочитатьРазделитель(Парсер, "."); + ПрочитатьЧислоДоРазделителя(Парсер, Патч, "Версия патча"); + ПрочитатьХвостовыеМассивы(Парсер); + Исключение + ОшибкаЧтенияВерсии = ИнформацияОбОшибке().Описание; + КонецПопытки; - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаОсновнаяВерсия) Тогда - - ОшибкаЧтенияВерсии = СтрШаблон("Основная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); - Возврат; +КонецПроцедуры + +Процедура ПрочитатьРазделитель(Знач Парсер, Знач Разделитель) + + ТекущийТокен = Парсер.Текущий(); + Если ТекущийТокен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; + КонецЕсли; + Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда + Если Разделитель = ТекущийТокен.Значение Тогда + СледующийТокен = Парсер.Следующий(); + Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда + ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель); + КонецЕсли; + Возврат; + КонецЕсли; КонецЕсли; - Основная = Число(СтрокаОсновнаяВерсия); - - СтрокаВторостепеннаяВерсия = МассивСтрокВерсии[1]; + ВызватьИсключение СтрШаблон("Ожидается разделитель <%1>, но получен <%2>", Разделитель, ТекущийТокен.Значение); +КонецПроцедуры - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаВторостепеннаяВерсия) Тогда - - ОшибкаЧтенияВерсии = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); - Возврат; - +Процедура ПрочитатьЧислоДоРазделителя(Знач Парсер, Результат, Знач УточнениеИсключения) + Токен = Парсер.Текущий(); + Если Токен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; КонецЕсли; - Второстепенная = Число(СтрокаВторостепеннаяВерсия); + Если Токен.Тип = Парсер.ТипЧисло Тогда + Результат = Число(Токен.Значение); + ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда + ВызватьИсключение Токен.Значение; + Иначе + ВызватьИсключение СтрШаблон("%1 <%2> должна содержать только цифры", УточнениеИсключения, Токен.Значение); + КонецЕсли; - СтрокаПатчаВерсии = МассивСтрокВерсии[2]; + Парсер.Следующий(); +КонецПроцедуры - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаПатчаВерсии) Тогда - - ОшибкаЧтенияВерсии = СтрШаблон("Версия патча <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); - Возврат; - +Процедура ПрочитатьХвостовыеМассивы(Знач Парсер) + Токен = Парсер.Текущий(); + Если Токен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; + КонецЕсли; + + Если Токен.Тип <> Парсер.ТипРазделитель или Токен.Значение = "." Тогда + ВызватьИсключение "Ожидается разделитель пререлизной версии <-> или метаданных сборки <+>, получен <" + Токен.Значение + ">"; КонецЕсли; - Патч = Число(СтрокаПатчаВерсии); + ПрочитатьПреРелиз(Парсер); + ПрочитатьМетаданныеСборки(Парсер); КонецПроцедуры -Функция ПодготовитьКЧтению(Знач СтрокаВерсии) - - Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда - СтрокаВерсии = СтрЗаменить(СтрокаВерсии, "v", ""); +Процедура ПрочитатьПреРелиз(Знач Парсер) + Если Парсер.Текущий().Значение = "-" Тогда + Парсер.Следующий(); + СобратьМассивИзКомпонентов(Парсер, ПреРелиз, "+"); + КонецЕсли; +КонецПроцедуры + +Процедура ПрочитатьМетаданныеСборки(Знач Парсер) + Если Парсер.Текущий().Значение = "+" Тогда + Парсер.Следующий(); + СобратьМассивИзКомпонентов(Парсер, МетаданныеСборки, ""); КонецЕсли; +КонецПроцедуры - МассивСтрокВерсии = СтрРазделить(СтрокаВерсии, "."); +Процедура СобратьМассивИзКомпонентов(Знач Парсер, Знач МассивКомпонентов, Знач ПрерватьПо) + + Пока Истина Цикл + МассивКомпонентов.Добавить(ПрочитатьКомпонент(Парсер)); + Если Парсер.Текущий().Значение = ПрерватьПо или Парсер.Текущий().Тип = Парсер.ТипКонецТекста Тогда + Прервать; + КонецЕсли; - КоличествоДобавления = 3 - МассивСтрокВерсии.Количество(); + ПрочитатьРазделитель(Парсер, "."); - Для ИИ = 1 ПО КоличествоДобавления Цикл - МассивСтрокВерсии.Добавить(0); КонецЦикла; - Возврат СтрСоединить(МассивСтрокВерсии, "."); +КонецПроцедуры + +Функция ПрочитатьКомпонент(Знач Парсер) + Токен = Парсер.Текущий(); + Если Токен.Тип = Парсер.ТипЧисло Тогда + Парсер.Следующий(); + Возврат Число(Токен.Значение); + ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда + Текст = ""; + ТекТокен = Парсер.Текущий(); + Пока ТекТокен.Тип = Парсер.ТипТекст или ТекТокен.Значение = "-" Цикл + Текст = Текст + ТекТокен.Значение; + ТекТокен = Парсер.Следующий(); + КонецЦикла; + Возврат Текст; + Иначе + ВызватьИсключение СтрШаблон("Ожидается компонент версии, но получен <%1>", ?(Токен.Значение = "", "EOF", Токен.Значение)); + КонецЕсли; +КонецФункции + +Функция ПодготовитьКЧтению(Знач СтрокаВерсии) + + Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда + СтрокаВерсии = Сред(СтрокаВерсии, 2); + КонецЕсли; + + Возврат СтрокаВерсии; КонецФункции 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\222\320\265\321\200\321\201\320\270\320\270.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\222\320\265\321\200\321\201\320\270\320\270.os" new file mode 100644 index 0000000..c122dda --- /dev/null +++ "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\222\320\265\321\200\321\201\320\270\320\270.os" @@ -0,0 +1,122 @@ +Перем СтрокаДляРазбора; +Перем Индекс; + +Перем ТипКонецТекста Экспорт; +Перем ТипЧисло Экспорт; +Перем ТипТекст Экспорт; +Перем ТипРазделитель Экспорт; +Перем ТипОшибка Экспорт; + +Перем ДиапазонЧислоНачало; +Перем ДиапазонЧислоКонец; + +Перем ДиапазонЗаглавныеБуквыНачало; +Перем ДиапазонЗаглавныеБуквыКонец; +Перем ДиапазонСтрочныеБуквыНачало; +Перем ДиапазонСтрочныеБуквыКонец; +Перем Дефис; +Перем Плюс; +Перем Точка; + +Перем ТекущийТокен; + +Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой) + СтрокаДляРазбора = ВерсияСтрокой; + Если ПустаяСтрока(СтрокаДляРазбора) Тогда + Индекс = -1; + Иначе + Индекс = 1; + КонецЕсли; +КонецПроцедуры + +Функция Токен(Знач Значение, Знач Тип) + Возврат Новый Структура("Тип, Значение", Тип, Значение); +КонецФункции + +Функция Следующий() Экспорт + + ТекущийТокен = ПолучитьСледующий(); + Возврат ТекущийТокен; + +КонецФункции + +Функция Текущий() Экспорт + + Возврат ТекущийТокен; +КонецФункции + +Функция Индекс() Экспорт + + Возврат Индекс; + +КонецФункции + +Функция ПолучитьСледующий() + Если Индекс = -1 Тогда + Возврат Токен("", ТипКонецТекста); + КонецЕсли; + + ТипТокена = ТипЧисло; + НачалоЗначения = Индекс; + ЧислоСимволов = 0; + + Пока Истина Цикл + + Символ = Сред(СтрокаДляРазбора, Индекс, 1); + КодСимвола = КодСимвола(Символ); + Если ПустаяСтрока(Символ) Тогда + Если ЧислоСимволов = 0 Тогда + // Это последний прочитанный токен + Индекс = -1; + Возврат Токен("", ТипКонецТекста); + КонецЕсли; + Прервать; + КонецЕсли; + + // Инлайн, чтобы было побыстрее и не тратило время на вызов метода + Если (КодСимвола >= ДиапазонЗаглавныеБуквыНачало И КодСимвола <= ДиапазонЗаглавныеБуквыКонец) ИЛИ + (КодСимвола >= ДиапазонСтрочныеБуквыНачало И КодСимвола <= ДиапазонСтрочныеБуквыКонец) Тогда + ТипТокена = ТипТекст; + ИначеЕсли КодСимвола >= ДиапазонЧислоНачало И КодСимвола <= ДиапазонЧислоКонец Тогда + // обработка числа + ИначеЕсли КодСимвола = Точка ИЛИ КодСимвола = Дефис ИЛИ КодСимвола = Плюс Тогда + // разделитель + Прервать; + Иначе + // ошибка + Позиция = Индекс; + Индекс = -1; // блокировка парсера + Возврат Токен(СтрШаблон("Недопустимый символ '%1' в позиции %2", Символ, Позиция), ТипОшибка); + КонецЕсли; + + Индекс = Индекс + 1; + ЧислоСимволов = ЧислоСимволов + 1; + КонецЦикла; + + Если ЧислоСимволов = 0 Тогда + // Это разделитель + Значение = Сред(СтрокаДляРазбора, Индекс, 1); + Индекс = Индекс + 1; + Возврат Токен(Значение, ТипРазделитель); + КонецЕсли; + + Значение = Сред(СтрокаДляРазбора, НачалоЗначения, ЧислоСимволов); + + Возврат Токен(Значение, ТипТокена); +КонецФункции + +ТипКонецТекста = 0; +ТипЧисло = 1; +ТипТекст = 2; +ТипРазделитель = 3; +ТипОшибка = 4; + +ДиапазонЧислоНачало = 48; +ДиапазонЧислоКонец = 57; +ДиапазонЗаглавныеБуквыНачало = 65; +ДиапазонЗаглавныеБуквыКонец = 90; +ДиапазонСтрочныеБуквыНачало = 97; +ДиапазонСтрочныеБуквыКонец = 122; +Дефис = КодСимвола("-"); +Плюс = КодСимвола("+"); +Точка = КодСимвола("."); \ No newline at end of file diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" index 49a0746..aca6a2a 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -1,5 +1,4 @@ #Использовать logos -#Использовать fluent Перем Лог; @@ -45,12 +44,14 @@ Лог.Отладка("Выбираю максимум из [%1]", МассивВерсий.Количество()); - Коллекция = ПроцессорыКоллекций.ИзКоллекции(МассивВерсий); - Результат = Коллекция.Максимум( - "(Элемент1, Элемент2) -> Элемент1.Сравнить(Элемент2)" - ); + ТекущийМаксимум = МассивВерсий[0]; + Для Сч = 1 По МассивВерсий.ВГраница() Цикл + Если МассивВерсий[Сч].Больше(ТекущийМаксимум) Тогда + ТекущийМаксимум = МассивВерсий[Сч]; + КонецЕсли; + КонецЦикла; - Возврат Результат; + Возврат ТекущийМаксимум; КонецФункции diff --git a/tasks/coverage.os b/tasks/coverage.os index f5a6558..fe41290 100644 --- a/tasks/coverage.os +++ b/tasks/coverage.os @@ -1,12 +1,12 @@ -#Использовать coverage #Использовать 1commands #Использовать fs +#Использовать coverage СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; -ФС.ОбеспечитьПустойКаталог(ОбъединитьПути("build", "coverage")); -ПутьКСтат = ОбъединитьПути("build", "coverage", "stat.json"); +ФС.ОбеспечитьПустойКаталог("out"); +ПутьКСтат = "out/stat.json"; Команда = Новый Команда; Команда.УстановитьКоманду("oscript"); @@ -14,7 +14,7 @@ Команда.ДобавитьПараметр("-encoding=utf-8"); КонецЕсли; Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); -Команда.ДобавитьПараметр(ОбъединитьПути("tasks", "test.os")); +Команда.ДобавитьПараметр("tasks/test.os"); // Файла запуска тестов Команда.ПоказыватьВыводНемедленно(Истина); КодВозврата = Команда.Исполнить(); @@ -22,11 +22,10 @@ ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); ПроцессорГенерации.ОтносительныеПути() - .РабочийКаталог(ОбъединитьПути("build", "coverage")) - .КаталогИсходников(ТекущийКаталог()) - .ИмяФайлаСтатистики() - .GenericCoverage() - .Cobertura() - .Сформировать(); + .РабочийКаталог("out") + .ИмяФайлаСтатистики() + .GenericCoverage() + .Cobertura() + .Сформировать(); ЗавершитьРаботу(КодВозврата); diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os new file mode 100644 index 0000000..fa28f00 --- /dev/null +++ b/tests/preReleasesTests.os @@ -0,0 +1,85 @@ +// BSLLS:UnusedLocalMethod-off +#Использовать asserts +#Использовать ".." + +&ПараметризованныйТест(Имя = "Тест с параметрами {Параметры}") +&ИсточникЗначение("1.1.1", "1.1.1") +&ИсточникЗначение("1", "1.0.0") +&ИсточникЗначение("2.0", "2.0.0") +Процедура РелизнаяВерсияВСтроку(ВерсияСтрокой, Ожидание) Экспорт + Версия = Новый Версия(ВерсияСтрокой); + Ожидаем.Что(Версия.ВСтроку()).Равно(Ожидание); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("1.1.1-alpha", "1.1.1-alpha") +&ИсточникЗначение("1.1.1-alpha.1.2", "1.1.1-alpha.1.2") +&ИсточникЗначение("1.1.1-beta.1+abcdef.456", "1.1.1-beta.1+abcdef.456") +&ИсточникЗначение("1.1.0-beta-experimental.4.2+git-sha.deadbeef", "1.1.0-beta-experimental.4.2+git-sha.deadbeef") +Процедура ПреРелизнаяВерсияВСтроку(ВерсияСтрокой, Ожидание) Экспорт + Версия = Новый Версия(ВерсияСтрокой); + Ожидаем.Что(Версия.ВСтроку()).Равно(Ожидание); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение(".1.1", "Основная версия <.> должна содержать только цифры") +&ИсточникЗначение("1..1", "Второстепенная версия <.> должна содержать только цифры") +&ИсточникЗначение("1.2.-", "Версия патча <-> должна содержать только цифры") +&ИсточникЗначение("1.2.", "Неожиданный конец строки версии, нет данных после разделителя <.>") +&ИсточникЗначение("aa1.2.3", "Основная версия должна содержать только цифры") +&ИсточникЗначение("1.1aa.1", "Второстепенная версия <1aa> должна содержать только цифры") +&ИсточникЗначение("1.2.1aa", "Версия патча <1aa> должна содержать только цифры") +&ИсточникЗначение("1.2.1.3", "Ожидается разделитель пререлизной версии <-> или метаданных сборки <+>, получен <.>") +&ИсточникЗначение("1.2.1-", "Ожидается компонент версии, но получен ") +&ИсточникЗначение("1.2.1+", "Ожидается компонент версии, но получен ") +&ИсточникЗначение("1.2.1-beta+", "Ожидается компонент версии, но получен ") +&ИсточникЗначение("1.2.1-beta..1", "Ожидается компонент версии, но получен <.>") +Процедура ПроверитьОшибкиРазбора(ВерсияСтрокой, Ожидание) Экспорт + Версия = Новый Версия(ВерсияСтрокой); + Ожидаем.Что(Версия.ОшибкаЧтенияВерсии).Равно(Ожидание); +КонецПроцедуры + +&Тест +Процедура ПроверитьЧтоДефисыВходятВСоставФрагмента() Экспорт + Версия = Новый Версия("1.1.0-beta-experimental.4.2+git-sha.deadbeef"); + + Ожидаем.Что(Версия.ПреРелиз[0]).Равно("beta-experimental"); + Ожидаем.Что(Версия.ПреРелиз[1]).Равно(4); + Ожидаем.Что(Версия.ПреРелиз[2]).Равно(2); + Ожидаем.Что(Версия.МетаданныеСборки[0]).Равно("git-sha"); + Ожидаем.Что(Версия.МетаданныеСборки[1]).Равно("deadbeef"); + +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("1.2.1", "1.2.2") +&ИсточникЗначение("1.2.2", "1.3.0") +&ИсточникЗначение("1.3.0", "2.0.0") +&ИсточникЗначение("2.0.0", "2.0.1") +&ИсточникЗначение("1.0.0-alpha", "1.0.0-alpha.1") +&ИсточникЗначение("1.0.0-alpha.1", "1.0.0-alpha.beta") +&ИсточникЗначение("1.0.0-alpha.beta", "1.0.0-beta") +&ИсточникЗначение("1.0.0-beta", "1.0.0-beta.2") +&ИсточникЗначение("1.0.0-beta.2", "1.0.0-beta.11") +&ИсточникЗначение("1.0.0-beta.11", "1.0.0-rc.1") +&ИсточникЗначение("1.0.0-rc.1", "1.0.0") +&ИсточникЗначение("1.0.0-alpha", "1.0.0") +Процедура ПроверитьСтаршинствоВерсий(Знач Версия1, Знач Версия2) Экспорт + + // А < Б + Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия2)).Меньше(0); + // Б > A + Ожидаем.Что(Версии.СравнитьВерсии(Версия2, Версия1)).Больше(0); + // Б = Б + Ожидаем.Что(Версии.СравнитьВерсии(Версия2, Версия2)).Равно(0); + // А = A + Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия1)).Равно(0); + +КонецПроцедуры + +&Тест +Процедура ПроверитьЧтоМетаданныеСборкиНеУчаствуютВСравнении() Экспорт + Версия1 = Новый Версия("1.0.1+git.12345"); + Версия2 = Новый Версия("1.0.1+sha.00000"); + Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия2)).Равно(0); +КонецПроцедуры diff --git a/tests/versionParserTest.os b/tests/versionParserTest.os new file mode 100644 index 0000000..270336f --- /dev/null +++ b/tests/versionParserTest.os @@ -0,0 +1,86 @@ +&Тест +Процедура ПроверитьПарсерВерсии() Экспорт + + Парсер = Новый ПарсерВерсии("...+-2.1.22.00.dff-3dfg.12.fgg-fdf"); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "+", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + + ПроверитьТокен(Парсер.Следующий(), "2", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "1", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "22", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "00", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "dff", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "3dfg", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "12", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "fgg", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "fdf", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + +КонецПроцедуры + +&Тест +Процедура ПроверитьЗаканчивающеесяНаРазделитель() Экспорт + Парсер = Новый ПарсерВерсии("23-"); + + ПроверитьТокен(Парсер.Следующий(), "23", Парсер.ТипЧисло); + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + +&Тест +Процедура ПроверитьЕдиничноеЧисло() Экспорт + Парсер = Новый ПарсерВерсии("23"); + + ПроверитьТокен(Парсер.Следующий(), "23", Парсер.ТипЧисло); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + +&Тест +Процедура ПроверитьЕдиничныйТекст() Экспорт + Парсер = Новый ПарсерВерсии("a23"); + + ПроверитьТокен(Парсер.Следующий(), "a23", Парсер.ТипТекст); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + + +&Тест +Процедура ПроверитьОшибку() Экспорт + Парсер = Новый ПарсерВерсии("a23-%^"); + + ПроверитьТокен(Парсер.Следующий(), "a23", Парсер.ТипТекст); + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "Недопустимый символ '%' в позиции 5", Парсер.ТипОшибка); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + +Процедура ПроверитьТокен(Знач Токен, Знач Значение, Знач Тип) + Ожидаем.Что(Токен.Значение).Равно(Значение); + Ожидаем.Что(Токен.Тип).Равно(Тип); +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" index fda920f..b96712d 100644 --- "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" +++ "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" @@ -5,23 +5,7 @@ Перем юТест; Перем Лог; -Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт - - юТест = Тестирование; - - ИменаТестов = Новый Массив; - - ИменаТестов.Добавить("ТестДолжен_ПроверитьМаксимальная"); - ИменаТестов.Добавить("ТестДолжен_ПроверитьВДиапазоне"); - // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций"); - // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций"); - - ИменаТестов.Добавить("ТестДолженПроверитьСортировкуВерсий"); - - Возврат ИменаТестов; - -КонецФункции - +&Тест Процедура ТестДолжен_ПроверитьМаксимальная() Экспорт ТестовыеСлучаи = Новый Массив; @@ -54,7 +38,7 @@ ТестовыеСлучаи.Добавить(ТестовыйСлучай("1.0.0 1.0.1 1.1.2 1.1 2.0", ">=1.0.0, 1.x", "1.1.2")); Для каждого Тест Из ТестовыеСлучаи Цикл - Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.ВерсииПроверки, ",")); + Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.ВерсииПроверки, " ")); Лог.Отладка(" >> диапазоны теста: %1", СтрСоединить(Тест.Диапазон, ",")); Диапазон = Версии.Сравнение(); @@ -67,13 +51,13 @@ .ПроверяемыеВерсии(Тест.ВерсииПроверки) .Максимальная(); - Утверждения.ПроверитьРавенство(ИтоговаяВерсия.ВСтроку(), Тест.Результат[0], "Результат должен совпадать с ожиданиями."); + Утверждения.ПроверитьРавенство(Тест.Результат[0], ИтоговаяВерсия.ВСтроку(), "Результат должен совпадать с ожиданиями."); КонецЦикла КонецПроцедуры - +&Тест Процедура ТестДолжен_ПроверитьВДиапазоне() Экспорт ТестовыеСлучаи = Новый Массив; @@ -142,6 +126,7 @@ КонецПроцедуры +&Тест Процедура ТестДолженПроверитьСортировкуВерсий() Экспорт ЭталонСортировкиПоВозрастанию = СтрРазделить("1.0.0 1.3.0 1.4.0 1.5.0 1.9.0 1.20.0", " ");