using Namespace System.Management.Automation.Language
Describe "The SafeGetValue method on AST returns safe values" -Tags "CI" {
    It "A hashtable is returned from a HashtableAst" {
        $HashtableAstType = [HashtableAst]
        $HtAst = {
            @{ one = 1 }
            }.ast.Find({$args[0] -is $HashtableAstType}, $true)
        $HtAst | Should Not BeNullOrEmpty
        $HtAst.SafeGetValue() | Should BeOfType "Hashtable"
    }
    It "An Array is returned from a LiteralArrayAst" {
        $ArrayAstType = [ArrayLiteralAst]
        $ArrayAst = {
            @( 1,2,3,4)
            }.ast.Find({$args[0] -is $ArrayAstType}, $true)
        $ArrayAst | Should Not BeNullOrEmpty
        ,$ArrayAst.SafeGetValue() | Should BeOfType "Object[]"
    }
    It "The proper error is returned when a variable is referenced" {
        $ast = { $a }.Ast.Find({$args[0] -is "VariableExpressionAst"},$true)
        try {
            $ast.SafeGetValue() | out-null
            throw "No Exception!"
        }
        catch {
            $_.FullyQualifiedErrorId | Should be "InvalidOperationException"
            $_.ToString() | Should Match '\$a'
        }
    }
    It "A ScriptBlock AST fails with the proper error" {
        try {
            { 1 }.Ast.SafeGetValue()
            throw "No Exception!"
        }
        catch {
            $_.FullyQualifiedErrorId | Should be "InvalidOperationException"
        }
    }

}
