Private/Test-VersionInRange.ps1

function Test-VersionInRange {
    <#
    .SYNOPSIS
    Test whether an installed version satisfies a requested version or range.
 
    .DESCRIPTION
    The single entry point gallery DependencyScripts use to decide whether an
    already-installed version satisfies the request. The request may be an exact
    version (delegated to Test-VersionEquality) or a NuGet range (parsed by
    ConvertFrom-VersionRange and compared bound-by-bound with Compare-Version).
 
    Range semantics live here so every DependencyType evaluates a range the same
    way, regardless of what its installer accepts natively.
 
    .PARAMETER Version
    The concrete installed version to test.
 
    .PARAMETER Required
    The requested version or NuGet range string.
 
    .EXAMPLE
    Test-VersionInRange -Version '2.5.0' -Required '[2.2.3,3.0)'
 
    Returns $true (2.5.0 falls within the range).
 
    .EXAMPLE
    Test-VersionInRange -Version '3.0.0' -Required '[2.2.3,3.0)'
 
    Returns $false (the upper bound is exclusive).
 
    .EXAMPLE
    Test-VersionInRange -Version '3.2.1' -Required '3.2.1'
 
    Returns $true (exact match).
    #>

    [CmdletBinding()]
    [OutputType([bool])]
    param(
        [string]$Version,
        [string]$Required
    )

    if ([string]::IsNullOrEmpty($Version) -or [string]::IsNullOrEmpty($Required)) {
        return $false
    }

    $range = ConvertFrom-VersionRange -Version $Required -ErrorAction SilentlyContinue
    if (-not $range) {
        return $false
    }

    if ($range.IsExact) {
        return Test-VersionEquality -ReferenceVersion $Version -DifferenceVersion $range.Exact
    }

    if ($null -ne $range.Min) {
        $lower = Compare-Version -ReferenceVersion $Version -DifferenceVersion $range.Min
        $satisfiesMin = if ($range.MinInclusive) { $lower -ge 0 } else { $lower -gt 0 }
        if (-not $satisfiesMin) {
            return $false
        }
    }

    if ($null -ne $range.Max) {
        $upper = Compare-Version -ReferenceVersion $Version -DifferenceVersion $range.Max
        $satisfiesMax = if ($range.MaxInclusive) { $upper -le 0 } else { $upper -lt 0 }
        if (-not $satisfiesMax) {
            return $false
        }
    }

    return $true
}