Public/Test-OneLiner.ps1

function Test-OneLiner {
    [CmdletBinding()]
    [OutputType([psobject])]
    param(
        [Parameter(Mandatory, Position = 0)]
        [string]
        $Original,

        [Parameter(Mandatory, Position = 1)]
        [string]
        $OneLiner
    )

    process {
        $originalErrors = $null
        $oneLinerErrors = $null
        $originalAst = [System.Management.Automation.Language.Parser]::ParseInput($Original, [ref]$null, [ref]$originalErrors)
        $oneLinerAst = [System.Management.Automation.Language.Parser]::ParseInput($OneLiner, [ref]$null, [ref]$oneLinerErrors)

        $parseErrors = [System.Collections.Generic.List[string]]::new()
        foreach ($e in @($originalErrors)) {
            if ($e) { $parseErrors.Add(('Original line {0}: {1}' -f $e.Extent.StartLineNumber, $e.Message)) }
        }
        foreach ($e in @($oneLinerErrors)) {
            if ($e) { $parseErrors.Add(('OneLiner line {0}: {1}' -f $e.Extent.StartLineNumber, $e.Message)) }
        }

        if ($parseErrors.Count -gt 0) {
            return [pscustomobject]@{
                Equivalent      = $false
                ParseErrors     = $parseErrors.ToArray()
                FirstDifference = $null
            }
        }

        $originalAst = Resolve-FlatlineUnwrapped -Ast $originalAst
        $oneLinerAst = Resolve-FlatlineUnwrapped -Ast $oneLinerAst

        $originalSignature = Get-FlatlineSignature -Ast $originalAst
        $oneLinerSignature = Get-FlatlineSignature -Ast $oneLinerAst

        $max = [Math]::Max($originalSignature.Count, $oneLinerSignature.Count)
        $firstDifference = $null
        for ($i = 0; $i -lt $max; $i++) {
            $left = if ($i -lt $originalSignature.Count) { $originalSignature[$i] } else { $null }
            $right = if ($i -lt $oneLinerSignature.Count) { $oneLinerSignature[$i] } else { $null }
            $leftKey = if ($left) { $left.Key } else { $null }
            $rightKey = if ($right) { $right.Key } else { $null }
            if ($leftKey -ne $rightKey) {
                $firstDifference = [pscustomobject]@{
                    OriginalNode = if ($left) { '{0} (line {1}): {2}' -f $left.Key, $left.Line, $left.Text } else { '(none)' }
                    OneLinerNode = if ($right) { '{0}: {1}' -f $right.Key, $right.Text } else { '(none)' }
                }
                break
            }
        }

        [pscustomobject]@{
            Equivalent      = $null -eq $firstDifference
            ParseErrors     = @()
            FirstDifference = $firstDifference
        }
    }
}