PesterMatchHashtable.ps1

function PesterMatchHashtable($value, $expectedMatch) {
    # Write-Host "foo: $(ConvertTo-Json $value); $(ConvertTo-Json $expectedMatch)"
    if($value.Count -ne $expectedMatch.Count){
        return $false;
    }
    foreach($expectedKey in $expectedMatch.Keys) {
        if (-not($value.Keys -contains $expectedKey)){
            return $false;
        }
        if (-not ($value[$expectedKey] -eq $expectedMatch[$expectedKey])){
            return $false;
        }
    }
    return $true;
}

function PesterMatchHashtableFailureMessage($value, $expectedMatch) {
    foreach($expectedKey in $expectedMatch.Keys) {
        if (-not($value.Keys -contains $expectedKey)){
            return "Expected key: {$expectedKey}, but missing in actual"
        }
        $expectedValue = $expectedMatch[$expectedKey]
        $actualValue = $value[$expectedKey]
        if (-not ($actualValue -eq $expectedValue)) {
            return "Value differs for key {$expectedKey}. Expected value: {$expectedValue}, actual value: {$actualValue}"
        }
    }

    foreach($actualKey in $value.Keys) {
        if (-not($expectedMatch.Keys -contains $actualKey)){
            return "Actual key: {$actualKey}, but missing in expected"
        }
        $expectedValue = $expectedMatch[$actualKey]
        $actualValue = $value[$actualKey]
        if (-not ($actualValue -eq $expectedValue)) {
            return "Value differs for key {$actualKey}. Expected value: {$expectedValue}, actual value: {$actualValue}"
        }
    }
    # for($i=0; $i -lt $expectedMatch.Keys.Length; $i++){
    # $expectedKey = $expectedMatch.Keys[$_]
    # if($value.Keys -contains $expectedKey){
    # $expectedValue = $expectedMatch[$expectedKey]
    # $actualValue = $value[$expectedKey]
    # if (-not ($actualValue -eq $expectedValue)) {
    # return "Value differs for key {$expectedKey}. Expected value: {$expectedValue}, actual value: {$actualValue}"
    # }
    # } else {
    # return "Expected key: {$expectedMatch}, but missing in actual"
    # }
    # }
    # for($i=0; $i -lt $value.Keys.Length; $i++){
    # $actualKey = $value.Keys[$_]
    # if($expectedMatch.Keys -contains $actualKey){
    # $expectedValue = $expectedMatch[$actualKey]
    # $actualValue = $value[$actualKey]
    # if (-not ($actualValue -eq $expectedValue)) {
    # return "Value differs for key {$actualKey}. Expected value: {$expectedValue}, actual value: {$actualValue}"
    # }
    # } else {
    # return "Actual contains key: {$actualKey}, but not expected"
    # }
    # }
}

function NotPesterMatchHashtableFailureMessage($value, $expectedMatch) {
    return "Expected: ${value} to not match the expression ${expectedMatch}"
}