Tests/ConvertTo-Expression.Tests.ps1

#Requires -Modules @{ModuleName="Pester"; ModuleVersion="5.5.0"}

using module ..\..\ObjectGraphTools

[Diagnostics.CodeAnalysis.SuppressMessage('PSUseDeclaredVarsMoreThanAssignments', 'Object', Justification = 'False positive')]
[Diagnostics.CodeAnalysis.SuppressMessage('PSUseDeclaredVarsMoreThanAssignments', 'ObjectGraph', Justification = 'False positive')]
param()

# $PesterPreference = [PesterConfiguration]::Default
# $PesterPreference.Should.ErrorAction = 'Stop'

Describe 'ConvertTo-Expression' {

    BeforeAll {

        Set-StrictMode -Version Latest
    }

    Context 'Existence Check' {

        It 'Help' {
            ConvertTo-Expression -? | Out-String -Stream | Should -Contain SYNOPSIS
        }
    }

    Context 'Constrained values' {
        It 'adsi' {
            $Object = [adsi]'WinNT://WORKGROUP/./Administrator'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'WinNT://WORKGROUP/./Administrator'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[adsi]'WinNT://WORKGROUP/./Administrator'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[adsi]'WinNT://WORKGROUP/./Administrator'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[adsi]'WinNT://WORKGROUP/./Administrator'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[adsi]'WinNT://WORKGROUP/./Administrator'"
        }

        It 'adsisearcher' {
            $Object = [adsisearcher]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[adsisearcher]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[adsisearcher]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[adsisearcher]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[adsisearcher]'0123'"
        }

        It 'Alias' {
            $Object = [Alias]::new('Example')
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@('Example')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[Alias]::new('Example')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[Alias]::new('Example')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[Alias]::new('Example')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[Alias]::new('Example')"
        }

        It 'AllowEmptyCollection' {
            $Object = [AllowEmptyCollection]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[AllowEmptyCollection]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[AllowEmptyCollection]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[AllowEmptyCollection]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[AllowEmptyCollection]::new()"
        }

        It 'AllowEmptyString' {
            $Object = [AllowEmptyString]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[AllowEmptyString]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[AllowEmptyString]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[AllowEmptyString]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[AllowEmptyString]::new()"
        }

        It 'AllowNull' {
            $Object = [AllowNull]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[AllowNull]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[AllowNull]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[AllowNull]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[AllowNull]::new()"
        }

        It 'ArgumentCompleter' {
            $Object = [ArgumentCompleter]{'Example'}
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "{'Example'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ArgumentCompleter]{'Example'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ArgumentCompleter]{'Example'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ArgumentCompleter]{'Example'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ArgumentCompleter]{'Example'}"
        }

        It 'bigint' {
            $Object = [bigint]'1234567890'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'1234567890'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[bigint]'1234567890'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[bigint]'1234567890'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[bigint]'1234567890'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[bigint]'1234567890'"
        }

        It 'bool' {
            $Object = [bool]$True
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be '$True'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be '$True'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be '[bool]$True'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be '[bool]$True'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be '[bool]$True'
        }

        It 'byte' {
            $Object = [byte]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[byte]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[byte]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[byte]123"
        }

        It 'char' {
            $Object = [char]'a'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'a'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "'a'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[char]'a'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[char]'a'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[char]'a'"
        }

        It 'ciminstance' {
            $Object = [ciminstance]'Example'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'Example'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ciminstance]'Example'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ciminstance]'Example'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ciminstance]'Example'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ciminstance]'Example'"
        }

        It 'CimSession' {
            $Object = [CimSession]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[CimSession]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[CimSession]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[CimSession]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[CimSession]'0123'"
        }

        It 'cimtype' {
            $Object = [cimtype]'Boolean'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'Boolean'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[cimtype]'Boolean'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[cimtype]'Boolean'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[cimtype]'Boolean'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[cimtype]'Boolean'"
        }

        # It 'CmdletBinding' {
        # $Object = [CmdletBinding]@{ PositionalBinding = [bool]$True; DefaultParameterSetName = [string]''; SupportsShouldProcess = [bool]$False; SupportsPaging = [bool]$False; SupportsTransactions = [bool]$False; ConfirmImpact = [System.Management.Automation.ConfirmImpact]'None'; HelpUri = [string]''; RemotingCapability = [System.Management.Automation.RemotingCapability]'None' }
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be '@{ PositionalBinding = $True; DefaultParameterSetName = ''; SupportsShouldProcess = $False; SupportsPaging = $False; SupportsTransactions = $False; ConfirmImpact = 'None'; HelpUri = ''; RemotingCapability = 'None' }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be '[CmdletBinding]@{ PositionalBinding = $True; DefaultParameterSetName = ''; SupportsShouldProcess = $False; SupportsPaging = $False; SupportsTransactions = $False; ConfirmImpact = [System.Management.Automation.ConfirmImpact]'None'; HelpUri = ''; RemotingCapability = [System.Management.Automation.RemotingCapability]'None' }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be '[CmdletBinding]@{ PositionalBinding = [bool]$True; DefaultParameterSetName = [string]''; SupportsShouldProcess = [bool]$False; SupportsPaging = [bool]$False; SupportsTransactions = [bool]$False; ConfirmImpact = [System.Management.Automation.ConfirmImpact]'None'; HelpUri = [string]''; RemotingCapability = [System.Management.Automation.RemotingCapability]'None' }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be '[CmdletBinding]@{ PositionalBinding = [bool]$True; DefaultParameterSetName = [string]''; SupportsShouldProcess = [bool]$False; SupportsPaging = [bool]$False; SupportsTransactions = [bool]$False; ConfirmImpact = [System.Management.Automation.ConfirmImpact]'None'; HelpUri = [string]''; RemotingCapability = [System.Management.Automation.RemotingCapability]'None' }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be '[CmdletBinding]@{ PositionalBinding = [bool]$True; DefaultParameterSetName = [string]''; SupportsShouldProcess = [bool]$False; SupportsPaging = [bool]$False; SupportsTransactions = [bool]$False; ConfirmImpact = [System.Management.Automation.ConfirmImpact]'None'; HelpUri = [string]''; RemotingCapability = [System.Management.Automation.RemotingCapability]'None' }'
        # }

        It 'cultureinfo' {
            $Object = [cultureinfo]'en-US'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'en-US'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[cultureinfo]'en-US'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[cultureinfo]'en-US'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[cultureinfo]'en-US'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[cultureinfo]'en-US'"
        }

        It 'datetime' {
            $Object = [datetime]'1963-10-07T17:56:53.8139055'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'1963-10-07T17:56:53.8139055'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[datetime]'1963-10-07T17:56:53.8139055'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[datetime]'1963-10-07T17:56:53.8139055'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[datetime]'1963-10-07T17:56:53.8139055'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[datetime]'1963-10-07T17:56:53.8139055'"
        }

        It 'decimal' {
            $Object = [decimal]'0.123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0.123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[decimal]'0.123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[decimal]'0.123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[decimal]'0.123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[decimal]'0.123'"
        }

        It 'double' {
            $Object = [double]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[double]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[double]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[double]123"
        }

        It 'DscLocalConfigurationManager' {
            $Object = [DscLocalConfigurationManager]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[DscLocalConfigurationManager]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[DscLocalConfigurationManager]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[DscLocalConfigurationManager]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[DscLocalConfigurationManager]::new()"
        }

        It 'DscProperty' {
            $Object = [DscProperty]@{ Key = [bool]$False; Mandatory = [bool]$False; NotConfigurable = [bool]$False }
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be '@{ Key = $False; Mandatory = $False; NotConfigurable = $False }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be '[DscProperty]@{ Key = $False; Mandatory = $False; NotConfigurable = $False }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be '[DscProperty]@{ Key = [bool]$False; Mandatory = [bool]$False; NotConfigurable = [bool]$False }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be '[DscProperty]@{ Key = [bool]$False; Mandatory = [bool]$False; NotConfigurable = [bool]$False }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be '[DscProperty]@{ Key = [bool]$False; Mandatory = [bool]$False; NotConfigurable = [bool]$False }'
        }

        It 'DscResource' {
            $Object = [DscResource]@{ RunAsCredential = [System.Management.Automation.DSCResourceRunAsCredential]'Default' }
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{ RunAsCredential = 'Default' }"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[DscResource]@{ RunAsCredential = [System.Management.Automation.DSCResourceRunAsCredential]'Default' }"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[DscResource]@{ RunAsCredential = [System.Management.Automation.DSCResourceRunAsCredential]'Default' }"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[DscResource]@{ RunAsCredential = [System.Management.Automation.DSCResourceRunAsCredential]'Default' }"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[DscResource]@{ RunAsCredential = [System.Management.Automation.DSCResourceRunAsCredential]'Default' }"
        }

        It 'ExperimentAction' -Skip:(-not ('ExperimentAction' -as [Type])) {
            $Object = [ExperimentAction]'None'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'None'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ExperimentAction]'None'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ExperimentAction]'None'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ExperimentAction]'None'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ExperimentAction]'None'"
        }

        It 'float' {
            $Object = [float]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[float]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[float]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[float]123"
        }

        It 'guid' {
            $Object = [guid]'19631007-bd7b-41cc-a6c7-bb1772d6ef46'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'19631007-bd7b-41cc-a6c7-bb1772d6ef46'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[guid]'19631007-bd7b-41cc-a6c7-bb1772d6ef46'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[guid]'19631007-bd7b-41cc-a6c7-bb1772d6ef46'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[guid]'19631007-bd7b-41cc-a6c7-bb1772d6ef46'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[guid]'19631007-bd7b-41cc-a6c7-bb1772d6ef46'"
        }

        It 'int' {
            $Object = [int]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[int]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[int]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[int]123"
        }

        It 'short' -Skip:(-not ('short' -as [Type])) {
            $Object = [short]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[short]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[short]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[short]123"
        }

        It 'long' {
            $Object = [long]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[long]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[long]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[long]123"
        }

        It 'ipaddress' {
            $Object = [ipaddress]'198.168.1.1'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'198.168.1.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ipaddress]'198.168.1.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ipaddress]'198.168.1.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ipaddress]'198.168.1.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ipaddress]'198.168.1.1'"
        }

        It 'IPEndpoint' {
            $Object = [IPEndpoint]::new(16885958, 123)
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@(16885958, 123)"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[IPEndpoint]::new(16885958, 123)"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[IPEndpoint]::new(16885958, 123)"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[IPEndpoint]::new(16885958, 123)"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[IPEndpoint]::new(16885958, 123)"
        }

        It 'mailaddress' {
            $Object = [mailaddress]'iron@contoso.com'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'iron@contoso.com'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[mailaddress]'iron@contoso.com'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[mailaddress]'iron@contoso.com'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[mailaddress]'iron@contoso.com'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[mailaddress]'iron@contoso.com'"
        }

        It 'Microsoft.PowerShell.Commands.ModuleSpecification' {
            $Object = [Microsoft.PowerShell.Commands.ModuleSpecification]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[Microsoft.PowerShell.Commands.ModuleSpecification]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[Microsoft.PowerShell.Commands.ModuleSpecification]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[Microsoft.PowerShell.Commands.ModuleSpecification]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[Microsoft.PowerShell.Commands.ModuleSpecification]'0123'"
        }

        It 'NoRunspaceAffinity' -Skip:(-not ('NoRunspaceAffinity' -as [Type])) {
            $Object = [NoRunspaceAffinity]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[NoRunspaceAffinity]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[NoRunspaceAffinity]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[NoRunspaceAffinity]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[NoRunspaceAffinity]::new()"
        }

        It 'OutputType' {
            $Object = [OutputType]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[OutputType]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[OutputType]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[OutputType]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[OutputType]::new()"
        }

        # It 'Parameter' {
        # $Object = [Parameter]@{ Position = [int]1 }
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be '@{ ExperimentName = $Null; ExperimentAction = 'None'; Position = 1; ParameterSetName = '__AllParameterSets'; Mandatory = $False; ValueFromPipeline = $False; ValueFromPipelineByPropertyName = $False; ValueFromRemainingArguments = $False; HelpMessage = $Null; HelpMessageBaseName = $Null; HelpMessageResourceId = $Null; DontShow = $False }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be '[Parameter]@{ ExperimentName = $Null; ExperimentAction = [ExperimentAction]'None'; Position = 1; ParameterSetName = '__AllParameterSets'; Mandatory = $False; ValueFromPipeline = $False; ValueFromPipelineByPropertyName = $False; ValueFromRemainingArguments = $False; HelpMessage = $Null; HelpMessageBaseName = $Null; HelpMessageResourceId = $Null; DontShow = $False }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be '[Parameter]@{ ExperimentName = $Null; ExperimentAction = [ExperimentAction]'None'; Position = [int]1; ParameterSetName = [string]'__AllParameterSets'; Mandatory = [bool]$False; ValueFromPipeline = [bool]$False; ValueFromPipelineByPropertyName = [bool]$False; ValueFromRemainingArguments = [bool]$False; HelpMessage = $Null; HelpMessageBaseName = $Null; HelpMessageResourceId = $Null; DontShow = [bool]$False }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be '[Parameter]@{ ExperimentName = $Null; ExperimentAction = [ExperimentAction]'None'; Position = [int]1; ParameterSetName = [string]'__AllParameterSets'; Mandatory = [bool]$False; ValueFromPipeline = [bool]$False; ValueFromPipelineByPropertyName = [bool]$False; ValueFromRemainingArguments = [bool]$False; HelpMessage = $Null; HelpMessageBaseName = $Null; HelpMessageResourceId = $Null; DontShow = [bool]$False }'
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be '[Parameter]@{ ExperimentName = $Null; ExperimentAction = [ExperimentAction]'None'; Position = [int]1; ParameterSetName = [string]'__AllParameterSets'; Mandatory = [bool]$False; ValueFromPipeline = [bool]$False; ValueFromPipelineByPropertyName = [bool]$False; ValueFromRemainingArguments = [bool]$False; HelpMessage = $Null; HelpMessageBaseName = $Null; HelpMessageResourceId = $Null; DontShow = [bool]$False }'
        # }

        It 'PhysicalAddress' {
            $Object = [PhysicalAddress]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[PhysicalAddress]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[PhysicalAddress]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[PhysicalAddress]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[PhysicalAddress]'0123'"
        }

        It 'PSDefaultValue' {
            $Object = [PSDefaultValue]@{ Value = $Null; Help = [string]'' }
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be '@{ Value = $Null; Help = '''' }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be '[PSDefaultValue]@{ Value = $Null; Help = '''' }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be '[PSDefaultValue]@{ Value = $Null; Help = [string]'''' }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be '[PSDefaultValue]@{ Value = $Null; Help = [string]'''' }'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be '[PSDefaultValue]@{ Value = $Null; Help = [string]'''' }'
        }

        It 'pslistmodifier' {
            $Object = [pslistmodifier]''
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[pslistmodifier]''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[pslistmodifier]''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[pslistmodifier]''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[pslistmodifier]''"
        }

        It 'PSTypeNameAttribute' {
            $Object = [PSTypeNameAttribute]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[PSTypeNameAttribute]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[PSTypeNameAttribute]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[PSTypeNameAttribute]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[PSTypeNameAttribute]'0123'"
        }

        It 'regex' {
            $Object = [regex]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[regex]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[regex]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[regex]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[regex]'0123'"
        }

        It 'sbyte' {
            $Object = [sbyte]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[sbyte]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[sbyte]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[sbyte]123"
        }

        It 'semver' -Skip:(-not ('semver' -as [Type])) {
            $Object = [semver]'1.2.0-a.1'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'1.2.0-a.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[semver]'1.2.0-a.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[semver]'1.2.0-a.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[semver]'1.2.0-a.1'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[semver]'1.2.0-a.1'"
        }

        It 'string' {
            $Object = [string]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[string]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[string]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[string]'0123'"
        }

        It 'SupportsWildcards' {
            $Object = [SupportsWildcards]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[SupportsWildcards]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[SupportsWildcards]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[SupportsWildcards]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[SupportsWildcards]::new()"
        }

        It 'timespan' {
            $Object = [timespan]'1.02:03:04.0050000'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'1.02:03:04.0050000'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[timespan]'1.02:03:04.0050000'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[timespan]'1.02:03:04.0050000'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[timespan]'1.02:03:04.0050000'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[timespan]'1.02:03:04.0050000'"
        }

        It 'ushort' -Skip:(-not ('ushort' -as [Type])) {
            $Object = [ushort]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ushort]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ushort]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ushort]123"
        }

        It 'uint' -Skip:(-not ('uint' -as [Type])) {
            $Object = [uint]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[uint]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[uint]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[uint]123"
        }

        It 'ulong' -Skip:(-not ('ulong' -as [Type])) {
            $Object = [ulong]123
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ulong]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ulong]123"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ulong]123"
        }

        It 'uri' {
            $Object = [uri]'0123'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[uri]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[uri]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[uri]'0123'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[uri]'0123'"
        }

        # It 'ValidateDrive' {
        # $Object = [ValidateDrive]::new()
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{ ValidRootDrives = @() }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateDrive]@{ ValidRootDrives = @() }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateDrive]@{ ValidRootDrives = [string[]]@() }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateDrive]@{ ValidRootDrives = [string[]]@() }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateDrive]@{ ValidRootDrives = [string[]]@() }"
        # }

        It 'ValidateNotNull' {
            $Object = [ValidateNotNull]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateNotNull]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateNotNull]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateNotNull]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateNotNull]::new()"
        }

        It 'ValidateNotNullOrEmpty' {
            $Object = [ValidateNotNullOrEmpty]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateNotNullOrEmpty]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateNotNullOrEmpty]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateNotNullOrEmpty]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateNotNullOrEmpty]::new()"
        }

        It 'ValidateNotNullOrWhiteSpace' -Skip:(-not ('ValidateNotNullOrWhiteSpace' -as [Type])) {
            $Object = [ValidateNotNullOrWhiteSpace]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateNotNullOrWhiteSpace]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateNotNullOrWhiteSpace]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateNotNullOrWhiteSpace]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateNotNullOrWhiteSpace]::new()"
        }

        It 'ValidatePattern' {
            $Object = [ValidatePattern]'Pattern'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'Pattern'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidatePattern]'Pattern'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidatePattern]'Pattern'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidatePattern]'Pattern'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidatePattern]'Pattern'"
        }

        It 'ValidateScript' {
            $Object = [ValidateScript]{'Validate'}
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "{'Validate'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateScript]{'Validate'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateScript]{'Validate'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateScript]{'Validate'}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateScript]{'Validate'}"
        }

        It 'ValidateSet' {
            $Object = [ValidateSet]::new('Value1', 'Value2')
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@('Value1', 'Value2')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateSet]::new('Value1', 'Value2')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateSet]::new('Value1', 'Value2')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateSet]::new('Value1', 'Value2')"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateSet]::new('Value1', 'Value2')"
        }

        It 'ValidateTrustedData' {
            $Object = [ValidateTrustedData]::new()
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{}"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateTrustedData]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateTrustedData]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateTrustedData]::new()"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateTrustedData]::new()"
        }

        # It 'ValidateUserDrive' {
        # $Object = [ValidateUserDrive]::new()
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "@{ ValidRootDrives = @('User') }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[ValidateUserDrive]@{ ValidRootDrives = @('User') }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[ValidateUserDrive]@{ ValidRootDrives = [string[]]@([string]'User') }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[ValidateUserDrive]@{ ValidRootDrives = [string[]]@([string]'User') }"
        # ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[ValidateUserDrive]@{ ValidRootDrives = [string[]]@([string]'User') }"
        # }

        It 'version' {
            $Object = [version]'0.1.2.3'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'0.1.2.3'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[version]'0.1.2.3'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[version]'0.1.2.3'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[version]'0.1.2.3'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[version]'0.1.2.3'"
        }

        It 'WildcardPattern' {
            $Object = [WildcardPattern]'_T?e%s*t'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'_T?e%s*t'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[WildcardPattern]'_T?e%s*t'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[WildcardPattern]'_T?e%s*t'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[WildcardPattern]'_T?e%s*t'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[WildcardPattern]'_T?e%s*t'"
        }

        It 'wmi' {
            $Object = [wmi]''
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[wmi]''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[wmi]''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[wmi]''"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[wmi]''"
        }

        It 'wmiclass' {
            $Object = [wmiclass]'\\LAP70223274\ROOT\Cimv2:Win32_BIOS'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'\\$($Env:ComputerName)\ROOT\Cimv2:Win32_BIOS'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[wmiclass]'\\$($Env:ComputerName)\ROOT\Cimv2:Win32_BIOS'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[wmiclass]'\\$($Env:ComputerName)\ROOT\Cimv2:Win32_BIOS'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[wmiclass]'\\$($Env:ComputerName)\ROOT\Cimv2:Win32_BIOS'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[wmiclass]'\\$($Env:ComputerName)\ROOT\Cimv2:Win32_BIOS'"
        }

        It 'wmisearcher' {
            $Object = [wmisearcher]'QueryString'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'QueryString'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[wmisearcher]'QueryString'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[wmisearcher]'QueryString'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[wmisearcher]'QueryString'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[wmisearcher]'QueryString'"
        }

        It 'X500DistinguishedName' {
            $Object = [X500DistinguishedName]'CN=123,OID.0.9.2342.19200300.100.1.1=321'
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 | Should -Be "'CN=123,OID.0.9.2342.19200300.100.1.1=321'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained | Should -Be "[X500DistinguishedName]'CN=123,OID.0.9.2342.19200300.100.1.1=321'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit | Should -Be "[X500DistinguishedName]'CN=123,OID.0.9.2342.19200300.100.1.1=321'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full | Should -Be "[X500DistinguishedName]'CN=123,OID.0.9.2342.19200300.100.1.1=321'"
            ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit | Should -Be "[X500DistinguishedName]'CN=123,OID.0.9.2342.19200300.100.1.1=321'"
        }

    }

    Context 'Formatting' {
        BeforeAll {
            $Object = [PSCustomObject]@{
                first_name = 'John'
                last_name = 'Smith'
                is_alive = $True
                age = 27
                address = [PSCustomObject]@{
                    street_address = '21 2nd Street'
                    city = 'New York'
                    state = 'NY'
                    postal_code = '10021-3100'
                }
                phone_numbers =[PSCustomObject] @(
                    @{ number = '212 555-1234' },
                    @{ number = '646 555-4567' }
                )
                children = @('Catherine')
                spouse = $Null
            }
        }

        It 'ConvertTo-Expression (Default)' {
            $Expression = ConvertTo-Expression -InputObject $Object 
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = @{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = @{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{
            number = '212 555-1234'
        },
        @{
            number = '646 555-4567'
        }
    )
    children = @(
        'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = @{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandSingleton -ExpandDepth 2' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandSingleton -ExpandDepth 2
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = @{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @(
        'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = @{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }
    phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' })
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandSingleton -ExpandDepth 1' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandSingleton -ExpandDepth 1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = @{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }
    phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' })
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{ first_name = 'John'; last_name = 'Smith'; is_alive = $True; age = 27; address = @{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }; phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' }); children = @('Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandSingleton -ExpandDepth 0' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandSingleton -ExpandDepth 0
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{ first_name = 'John'; last_name = 'Smith'; is_alive = $True; age = 27; address = @{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }; phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' }); children = @('Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{first_name='John';last_name='Smith';is_alive=$True;age=27;address=@{street_address='21 2nd Street';city='New York';state='NY';postal_code='10021-3100'};phone_numbers=@(@{number='212 555-1234'}, @{number='646 555-4567'});children=@('Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandSingleton -ExpandDepth -1' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandSingleton -ExpandDepth -1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
@{first_name='John';last_name='Smith';is_alive=$True;age=27;address=@{street_address='21 2nd Street';city='New York';state='NY';postal_code='10021-3100'};phone_numbers=@(@{number='212 555-1234'}, @{number='646 555-4567'});children=@('Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [PSCustomObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [System.Management.Automation.PSObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [PSCustomObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{
            number = '212 555-1234'
        },
        @{
            number = '646 555-4567'
        }
    )
    children = @(
        'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [System.Management.Automation.PSObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{
            number = '212 555-1234'
        },
        @{
            number = '646 555-4567'
        }
    )
    children = @(
        'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandDepth 2' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandDepth 2
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [PSCustomObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Constrained -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Constrained -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [System.Management.Automation.PSObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [PSCustomObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @(
        'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [System.Management.Automation.PSObject]@{
        street_address = '21 2nd Street'
        city = 'New York'
        state = 'NY'
        postal_code = '10021-3100'
    }
    phone_numbers = @(
        @{ number = '212 555-1234' },
        @{ number = '646 555-4567' }
    )
    children = @(
        'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandDepth 1' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandDepth 1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [PSCustomObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }
    phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' })
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Constrained -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Constrained -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [System.Management.Automation.PSObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }
    phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' })
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [PSCustomObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }
    phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' })
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = 'John'
    last_name = 'Smith'
    is_alive = $True
    age = 27
    address = [System.Management.Automation.PSObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }
    phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' })
    children = @('Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandDepth 0' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandDepth 0
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = 'John'; last_name = 'Smith'; is_alive = $True; age = 27; address = [PSCustomObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }; phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' }); children = @('Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Constrained -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = 'John'; last_name = 'Smith'; is_alive = $True; age = 27; address = [System.Management.Automation.PSObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }; phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' }); children = @('Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = 'John'; last_name = 'Smith'; is_alive = $True; age = 27; address = [PSCustomObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }; phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' }); children = @('Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = 'John'; last_name = 'Smith'; is_alive = $True; age = 27; address = [System.Management.Automation.PSObject]@{ street_address = '21 2nd Street'; city = 'New York'; state = 'NY'; postal_code = '10021-3100' }; phone_numbers = @(@{ number = '212 555-1234' }, @{ number = '646 555-4567' }); children = @('Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandDepth -1' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandDepth -1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name='John';last_name='Smith';is_alive=$True;age=27;address=[PSCustomObject]@{street_address='21 2nd Street';city='New York';state='NY';postal_code='10021-3100'};phone_numbers=@(@{number='212 555-1234'}, @{number='646 555-4567'});children=@('Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Constrained -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Constrained -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name='John';last_name='Smith';is_alive=$True;age=27;address=[System.Management.Automation.PSObject]@{street_address='21 2nd Street';city='New York';state='NY';postal_code='10021-3100'};phone_numbers=@(@{number='212 555-1234'}, @{number='646 555-4567'});children=@('Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name='John';last_name='Smith';is_alive=$True;age=27;address=[PSCustomObject]@{street_address='21 2nd Street';city='New York';state='NY';postal_code='10021-3100'};phone_numbers=@(@{number='212 555-1234'}, @{number='646 555-4567'});children=@('Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name='John';last_name='Smith';is_alive=$True;age=27;address=[System.Management.Automation.PSObject]@{street_address='21 2nd Street';city='New York';state='NY';postal_code='10021-3100'};phone_numbers=@(@{number='212 555-1234'}, @{number='646 555-4567'});children=@('Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{
            number = [string]'212 555-1234'
        },
        [hashtable]@{
            number = [string]'646 555-4567'
        }
    )
    children = [array]@(
        [string]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{
            number = [System.String]'212 555-1234'
        },
        [System.Collections.Hashtable]@{
            number = [System.String]'646 555-4567'
        }
    )
    children = [System.Object[]]@(
        [System.String]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 2 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 2 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@(
        [string]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 2 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@(
        [System.String]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }
    phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' })
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 1 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 1 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }
    phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' })
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }
    phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' })
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 1 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }
    phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' })
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = [string]'John'; last_name = [string]'Smith'; is_alive = [bool]$True; age = [int]27; address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }; phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' }); children = [array]@([string]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 0 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 0 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = [System.String]'John'; last_name = [System.String]'Smith'; is_alive = [System.Boolean]$True; age = [System.Int32]27; address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }; phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }); children = [System.Object[]]@([System.String]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = [string]'John'; last_name = [string]'Smith'; is_alive = [bool]$True; age = [int]27; address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }; phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' }); children = [array]@([string]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 0 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = [System.String]'John'; last_name = [System.String]'Smith'; is_alive = [System.Boolean]$True; age = [System.Int32]27; address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }; phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }); children = [System.Object[]]@([System.String]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name=[string]'John';last_name=[string]'Smith';is_alive=[bool]$True;age=[int]27;address=[PSCustomObject]@{street_address=[string]'21 2nd Street';city=[string]'New York';state=[string]'NY';postal_code=[string]'10021-3100'};phone_numbers=[array]@([hashtable]@{number=[string]'212 555-1234'}, [hashtable]@{number=[string]'646 555-4567'});children=[array]@([string]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth -1 -LanguageMode Constrained -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth -1 -LanguageMode Constrained -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name=[System.String]'John';last_name=[System.String]'Smith';is_alive=[System.Boolean]$True;age=[System.Int32]27;address=[System.Management.Automation.PSObject]@{street_address=[System.String]'21 2nd Street';city=[System.String]'New York';state=[System.String]'NY';postal_code=[System.String]'10021-3100'};phone_numbers=[System.Object[]]@([System.Collections.Hashtable]@{number=[System.String]'212 555-1234'}, [System.Collections.Hashtable]@{number=[System.String]'646 555-4567'});children=[System.Object[]]@([System.String]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name=[string]'John';last_name=[string]'Smith';is_alive=[bool]$True;age=[int]27;address=[PSCustomObject]@{street_address=[string]'21 2nd Street';city=[string]'New York';state=[string]'NY';postal_code=[string]'10021-3100'};phone_numbers=[array]@([hashtable]@{number=[string]'212 555-1234'}, [hashtable]@{number=[string]'646 555-4567'});children=[array]@([string]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth -1 -LanguageMode Constrained -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name=[System.String]'John';last_name=[System.String]'Smith';is_alive=[System.Boolean]$True;age=[System.Int32]27;address=[System.Management.Automation.PSObject]@{street_address=[System.String]'21 2nd Street';city=[System.String]'New York';state=[System.String]'NY';postal_code=[System.String]'10021-3100'};phone_numbers=[System.Object[]]@([System.Collections.Hashtable]@{number=[System.String]'212 555-1234'}, [System.Collections.Hashtable]@{number=[System.String]'646 555-4567'});children=[System.Object[]]@([System.String]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{
            number = [string]'212 555-1234'
        },
        [hashtable]@{
            number = [string]'646 555-4567'
        }
    )
    children = [array]@(
        [string]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{
            number = [System.String]'212 555-1234'
        },
        [System.Collections.Hashtable]@{
            number = [System.String]'646 555-4567'
        }
    )
    children = [System.Object[]]@(
        [System.String]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandDepth 2' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandDepth 2
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Full -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Full -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Full -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Full -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@(
        [string]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Full -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Full -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@(
        [System.String]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandDepth 1' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandDepth 1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }
    phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' })
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Full -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Full -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }
    phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' })
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Full -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Full -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }
    phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' })
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Full -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Full -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }
    phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' })
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandDepth 0' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandDepth 0
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = [string]'John'; last_name = [string]'Smith'; is_alive = [bool]$True; age = [int]27; address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }; phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' }); children = [array]@([string]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Full -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = [System.String]'John'; last_name = [System.String]'Smith'; is_alive = [System.Boolean]$True; age = [System.Int32]27; address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }; phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }); children = [System.Object[]]@([System.String]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Full -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = [string]'John'; last_name = [string]'Smith'; is_alive = [bool]$True; age = [int]27; address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }; phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' }); children = [array]@([string]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Full -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = [System.String]'John'; last_name = [System.String]'Smith'; is_alive = [System.Boolean]$True; age = [System.Int32]27; address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }; phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }); children = [System.Object[]]@([System.String]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandDepth -1' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandDepth -1
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name=[string]'John';last_name=[string]'Smith';is_alive=[bool]$True;age=[int]27;address=[PSCustomObject]@{street_address=[string]'21 2nd Street';city=[string]'New York';state=[string]'NY';postal_code=[string]'10021-3100'};phone_numbers=[array]@([hashtable]@{number=[string]'212 555-1234'}, [hashtable]@{number=[string]'646 555-4567'});children=[array]@([string]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Full -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Full -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name=[System.String]'John';last_name=[System.String]'Smith';is_alive=[System.Boolean]$True;age=[System.Int32]27;address=[System.Management.Automation.PSObject]@{street_address=[System.String]'21 2nd Street';city=[System.String]'New York';state=[System.String]'NY';postal_code=[System.String]'10021-3100'};phone_numbers=[System.Object[]]@([System.Collections.Hashtable]@{number=[System.String]'212 555-1234'}, [System.Collections.Hashtable]@{number=[System.String]'646 555-4567'});children=[System.Object[]]@([System.String]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Full -ExpandSingleton' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Full -ExpandSingleton
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name=[string]'John';last_name=[string]'Smith';is_alive=[bool]$True;age=[int]27;address=[PSCustomObject]@{street_address=[string]'21 2nd Street';city=[string]'New York';state=[string]'NY';postal_code=[string]'10021-3100'};phone_numbers=[array]@([hashtable]@{number=[string]'212 555-1234'}, [hashtable]@{number=[string]'646 555-4567'});children=[array]@([string]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Full -ExpandSingleton -FullTypeName' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Full -ExpandSingleton -FullTypeName
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name=[System.String]'John';last_name=[System.String]'Smith';is_alive=[System.Boolean]$True;age=[System.Int32]27;address=[System.Management.Automation.PSObject]@{street_address=[System.String]'21 2nd Street';city=[System.String]'New York';state=[System.String]'NY';postal_code=[System.String]'10021-3100'};phone_numbers=[System.Object[]]@([System.Collections.Hashtable]@{number=[System.String]'212 555-1234'}, [System.Collections.Hashtable]@{number=[System.String]'646 555-4567'});children=[System.Object[]]@([System.String]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{
            number = [string]'212 555-1234'
        },
        [hashtable]@{
            number = [string]'646 555-4567'
        }
    )
    children = [array]@(
        [string]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{
            number = [System.String]'212 555-1234'
        },
        [System.Collections.Hashtable]@{
            number = [System.String]'646 555-4567'
        }
    )
    children = [System.Object[]]@(
        [System.String]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 2 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 2 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 2 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 2 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{
        street_address = [string]'21 2nd Street'
        city = [string]'New York'
        state = [string]'NY'
        postal_code = [string]'10021-3100'
    }
    phone_numbers = [array]@(
        [hashtable]@{ number = [string]'212 555-1234' },
        [hashtable]@{ number = [string]'646 555-4567' }
    )
    children = [array]@(
        [string]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 2 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 2 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{
        street_address = [System.String]'21 2nd Street'
        city = [System.String]'New York'
        state = [System.String]'NY'
        postal_code = [System.String]'10021-3100'
    }
    phone_numbers = [System.Object[]]@(
        [System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' },
        [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }
    )
    children = [System.Object[]]@(
        [System.String]'Catherine'
    )
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }
    phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' })
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 1 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 1 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }
    phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' })
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 1 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 1 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{
    first_name = [string]'John'
    last_name = [string]'Smith'
    is_alive = [bool]$True
    age = [int]27
    address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }
    phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' })
    children = [array]@([string]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 1 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 1 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{
    first_name = [System.String]'John'
    last_name = [System.String]'Smith'
    is_alive = [System.Boolean]$True
    age = [System.Int32]27
    address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }
    phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' })
    children = [System.Object[]]@([System.String]'Catherine')
    spouse = $Null
}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = [string]'John'; last_name = [string]'Smith'; is_alive = [bool]$True; age = [int]27; address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }; phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' }); children = [array]@([string]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 0 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 0 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = [System.String]'John'; last_name = [System.String]'Smith'; is_alive = [System.Boolean]$True; age = [System.Int32]27; address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }; phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }); children = [System.Object[]]@([System.String]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth 0 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth 0 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{ first_name = [string]'John'; last_name = [string]'Smith'; is_alive = [bool]$True; age = [int]27; address = [PSCustomObject]@{ street_address = [string]'21 2nd Street'; city = [string]'New York'; state = [string]'NY'; postal_code = [string]'10021-3100' }; phone_numbers = [array]@([hashtable]@{ number = [string]'212 555-1234' }, [hashtable]@{ number = [string]'646 555-4567' }); children = [array]@([string]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth 0 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth 0 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{ first_name = [System.String]'John'; last_name = [System.String]'Smith'; is_alive = [System.Boolean]$True; age = [System.Int32]27; address = [System.Management.Automation.PSObject]@{ street_address = [System.String]'21 2nd Street'; city = [System.String]'New York'; state = [System.String]'NY'; postal_code = [System.String]'10021-3100' }; phone_numbers = [System.Object[]]@([System.Collections.Hashtable]@{ number = [System.String]'212 555-1234' }, [System.Collections.Hashtable]@{ number = [System.String]'646 555-4567' }); children = [System.Object[]]@([System.String]'Catherine'); spouse = $Null }
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name=[string]'John';last_name=[string]'Smith';is_alive=[bool]$True;age=[int]27;address=[PSCustomObject]@{street_address=[string]'21 2nd Street';city=[string]'New York';state=[string]'NY';postal_code=[string]'10021-3100'};phone_numbers=[array]@([hashtable]@{number=[string]'212 555-1234'}, [hashtable]@{number=[string]'646 555-4567'});children=[array]@([string]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth -1 -LanguageMode Full -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth -1 -LanguageMode Full -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name=[System.String]'John';last_name=[System.String]'Smith';is_alive=[System.Boolean]$True;age=[System.Int32]27;address=[System.Management.Automation.PSObject]@{street_address=[System.String]'21 2nd Street';city=[System.String]'New York';state=[System.String]'NY';postal_code=[System.String]'10021-3100'};phone_numbers=[System.Object[]]@([System.Collections.Hashtable]@{number=[System.String]'212 555-1234'}, [System.Collections.Hashtable]@{number=[System.String]'646 555-4567'});children=[System.Object[]]@([System.String]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -ExpandDepth -1 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -ExpandDepth -1 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[PSCustomObject]@{first_name=[string]'John';last_name=[string]'Smith';is_alive=[bool]$True;age=[int]27;address=[PSCustomObject]@{street_address=[string]'21 2nd Street';city=[string]'New York';state=[string]'NY';postal_code=[string]'10021-3100'};phone_numbers=[array]@([hashtable]@{number=[string]'212 555-1234'}, [hashtable]@{number=[string]'646 555-4567'});children=[array]@([string]'Catherine');spouse=$Null}
'@

        }
        It 'ConvertTo-Expression -FullTypeName -ExpandDepth -1 -LanguageMode Full -ExpandSingleton -Explicit' {
            $Expression = ConvertTo-Expression -InputObject $Object -FullTypeName -ExpandDepth -1 -LanguageMode Full -ExpandSingleton -Explicit
            { Invoke-Expression $Expression } | Should -not -Throw
            $Expression | Should -Be @'
[System.Management.Automation.PSObject]@{first_name=[System.String]'John';last_name=[System.String]'Smith';is_alive=[System.Boolean]$True;age=[System.Int32]27;address=[System.Management.Automation.PSObject]@{street_address=[System.String]'21 2nd Street';city=[System.String]'New York';state=[System.String]'NY';postal_code=[System.String]'10021-3100'};phone_numbers=[System.Object[]]@([System.Collections.Hashtable]@{number=[System.String]'212 555-1234'}, [System.Collections.Hashtable]@{number=[System.String]'646 555-4567'});children=[System.Object[]]@([System.String]'Catherine');spouse=$Null}
'@

        }
    }

    Context 'Issues' {

        It '#59 quoting bug' {
            @{ Test = "foo'bar" } | ConvertTo-Expression | Should -Be "@{ Test = 'foo''bar' }"
        }

        It '#87 ConvertTo-Expression: keys with special characters should be quoted' { # https://stackoverflow.com/questions/62754771/unquoted-key-rules-and-best-practices
            @{ a = 1 }     | ConvertTo-Expression | Should -Be '@{ a = 1 }'
            @{ '$a'  = 1 } | ConvertTo-Expression | Should -Be '@{ ''$a'' = 1 }' # --> @{ '$a' = 1 }
            @{ 'a b' = 1 } | ConvertTo-Expression | Should -Be "@{ 'a b' = 1 }"
            @{ 'a"b' = 1 } | ConvertTo-Expression | Should -Be "@{ 'a""b' = 1 }" # --> @{ 'a"b' = 1 }
            @{ "a'b" = 1 } | ConvertTo-Expression | Should -Be "@{ 'a''b' = 1 }"
        }

        It '#92 ConvertTo-Expression -Expand -1 leaves space after map value' {
            @{ a = 1 } | ConvertTo-Expression -ExpandDepth -1 | Should -Be '@{a=1}'
        }

        It '#91 ConvertTo-Expression: better handle special type keys' {
            @{ (Get-Date 1963-10-07) = 7 } | ConvertTo-Expression      | Should -Be "@{ '1963-10-07T00:00:00.0000000' = 7 }"
            @{ @{ a = 1 } = 'Test' } | ConvertTo-Expression -Expand -1 | Should -Be "@{@{a=1}='Test'}"
        }
    }
}