Private/Test-EFValueEqual.ps1

function Test-EFValueEqual {
    [CmdletBinding()]
    param(
        [AllowNull()]
        [object]$Actual,

        [AllowNull()]
        [object]$Desired
    )

    if ($null -eq $Actual -or $null -eq $Desired) {
        return $null -eq $Actual -and $null -eq $Desired
    }

    if ($Desired -is [bool]) {
        try {
            return [Convert]::ToBoolean($Actual) -eq $Desired
        }
        catch {
            return $false
        }
    }

    if ($Desired -is [byte] -or $Desired -is [int16] -or $Desired -is [int32] -or
        $Desired -is [int64] -or $Desired -is [decimal] -or $Desired -is [double]) {
        try {
            return [decimal]$Actual -eq [decimal]$Desired
        }
        catch {
            return $false
        }
    }

    if ($Desired -is [array]) {
        if ($Actual -isnot [array]) {
            return $false
        }
        return @(Compare-Object -ReferenceObject $Desired -DifferenceObject $Actual -SyncWindow 0).Count -eq 0
    }

    return [string]::Equals(
        [Convert]::ToString($Actual, [Globalization.CultureInfo]::InvariantCulture),
        [Convert]::ToString($Desired, [Globalization.CultureInfo]::InvariantCulture),
        [StringComparison]::OrdinalIgnoreCase
    )
}