From df660676d090075c13ccbf176df2c33ee58b108c Mon Sep 17 00:00:00 2001 From: babaev-an Date: Tue, 24 Jun 2025 22:30:57 +0300 Subject: [PATCH] =?UTF-8?q?20250624=20*=20=D0=92=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=20VersionInfo=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20CompareWi?= =?UTF-8?q?thRange=20(=D1=82=D1=80=D0=B5=D0=B1=D1=83=D0=B5=D1=82=20=D1=83?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/classes/VersionInfo.php | 72 +++++++++++++++++++++ sources/enums/VersionCompareRangeOption.php | 29 +++++++++ tests/classes/VersionInfoTest.php | 18 ++++++ 3 files changed, 119 insertions(+) create mode 100644 sources/enums/VersionCompareRangeOption.php diff --git a/sources/classes/VersionInfo.php b/sources/classes/VersionInfo.php index e73d546..e0e259a 100644 --- a/sources/classes/VersionInfo.php +++ b/sources/classes/VersionInfo.php @@ -2,6 +2,7 @@ namespace goodboyalex\php_components_pack\classes; +use goodboyalex\php_components_pack\enums\VersionCompareRangeOption; use goodboyalex\php_components_pack\enums\VersionInfoStage; use goodboyalex\php_components_pack\extensions\StringExtension; @@ -292,4 +293,75 @@ final class VersionInfo // Получаем строковое представление версии и возвращаем его return $this->ToString(); } + + /** + * Проверяет, находится ли текущая версия в заданном диапазоне. + * + * @param VersionInfo|null $left Левая граница диапазона или null, если граница не задана (будет использована + * минимальная версия). + * @param VersionInfo|null $right Правая граница диапазона или null, если граница не задана (будет использована + * максимальная версия). + * @param ObjectArray|null $options Опции проверки (по умолчанию массив, который разрешает включать границы). + * + * @return int Возвращает 1, если текущая версия старше интервала, 0, если находится в интервале, -1, если текущая + * версия младше интервала. + * + * @since 1.0.27 + */ + public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null, + ?ObjectArray $options = null): int + { + // Подготавливаем опции, если они не переданы + $options ??= new ObjectArray([ + VersionCompareRangeOption::LeftBorderIncluded, + VersionCompareRangeOption::RightBorderIncluded + ]); + + // Минимальная версия (случай, когда левая граница не указана) + $minVersion = new VersionInfo(0, 0, 0, 0, VersionInfoStage::PreAlpha, 0); + + // Максимальная версия (случай, когда правая граница не указана) + $maxVersion = new VersionInfo(PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, VersionInfoStage::Stable); + + // Устанавливаем левую границу + $leftBorder = $left ?? $minVersion; + + // Устанавливаем правую границу + $rightBorder = $right ?? $maxVersion; + + // Проверяем текущую версию относительно границ + $compareLeft = $this->CompareWith($leftBorder); + $compareRight = $this->CompareWith($rightBorder); + + // Проверяем, что границы включены + // - левая + $leftBorderIncluded = $options->IsExist(fn (VersionCompareRangeOption $option) + => $option === VersionCompareRangeOption::LeftBorderIncluded); + // - правая + $rightBorderIncluded = $options->IsExist(fn (VersionCompareRangeOption $option) + => $option === VersionCompareRangeOption::RightBorderIncluded); + + // Проверяем включение границ + $isInInterval = + ( + ($compareLeft >= 0 && $leftBorderIncluded) + || ($compareLeft > 0) + ) + && ( + ($compareRight <= 0 && $rightBorderIncluded) + || ($compareRight < 0) + ); + + // Итоговая обработка результатов + if ($isInInterval) + // - версия в пределах диапазона + return 0; + else // - версия не в пределах диапазона, и если она младше левой границы (или равна ей при не включении границы) + if ($compareLeft <= 0) + // -- то возвращаем -1 + return -1; + else + // -- в противном случае, версия старше правой границы (или равна ей при не включении границы) + return 1; + } } \ No newline at end of file diff --git a/sources/enums/VersionCompareRangeOption.php b/sources/enums/VersionCompareRangeOption.php new file mode 100644 index 0000000..64fd43c --- /dev/null +++ b/sources/enums/VersionCompareRangeOption.php @@ -0,0 +1,29 @@ +assertEquals(1, VersionInfo::Compare($versionInfo1, $versionInfo2)); } + + public function testCompareWithRange () + { + $this->PrepareForTest(); + + $versionInfo1 = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1); + + $versionInfo2 = new VersionInfo(1, 1, 3, 4, VersionInfoStage::Alpha, 2); + + $versionInfo3 = new VersionInfo(1, 1, 1, 1, VersionInfoStage::Alpha, 2); + + $versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable); + + // Для начала простое сравнение + $this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4)); + $this->assertEquals(-1, $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4)); + $this->assertEquals(1, $versionInfo4->CompareWithRange($versionInfo2, $versionInfo1)); + } } \ No newline at end of file