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