Tests/PipeScript.tests.ps1




describe PipeScript {
    context 'Attribute Based Composition' {
        it 'Can Compose Scripts Using Psuedo-Attributes' {
            . ({
                function f {                
                    param(                
                    [VFP()]
                    $P
                    )            
                }
            } | .>Pipescript)
            $IsVfp = @($ExecutionContext.SessionState.InvokeCommand.GetCommand('f', 'Function').Parameters['P'].Attributes.ValueFromPipeline) -ne $null
            $IsVfp | Should -not -be $null
        }
    }

    context 'Inline PipeScript' {
        it 'Can be embedded in another language (to transmute source code or documents)' {
            .> {
                $CSharpLiteral = @'
        namespace TestProgram/*{Get-Random}*/ {
            public static class Program {
                public static string Hello() {
                    string helloMessage = /*{param($n)
                        if ($n) {
                            "`"hello $n`""
                        } else {
                            '"hello"', '"hello world"', '"hey there"', '"howdy"' | Get-Random
                        }
                    }*/ string.Empty;
                    return helloMessage;
                }
            }
        }
'@

        
                [OutputFile(".\HelloWorld.ps1.cs")]$CSharpLiteral
            }
        
            $AddedFile = .> .\HelloWorld.ps1.cs
            $addedType = Add-Type -TypeDefinition (Get-Content $addedFile.FullName -Raw) -PassThru
            $addedType::Hello() | Should -belike 'H*'

            $addedFile2 = .> .\HelloWorld.ps1.cs 1
            $addedType2 = Add-Type -TypeDefinition (Get-Content $addedFile.FullName -Raw) -PassThru
            $addedType2::Hello() | Should -be 'Hello 1'

            Remove-Item .\HelloWorld.ps1.cs
            Remove-Item $AddedFile.FullName 
        }
    }

    it 'Can transpile a scriptblock that is preceeded by the name of a transpiler' {
        Invoke-PipeScript -ScriptBlock {
            [bash]{param($msg = 'hello world') $msg}
        } -ErrorAction Stop |
            Should -BeLike '*!/usr/bin/env bash*pwsh*-command*$@*' 
    }
    
    it 'Can make output explicit' {
        Invoke-PipeScript -ScriptBlock {
            [explicit]{1;echo 2;3}
        } | should -be 2

        Invoke-PipeScript -ScriptBlock {
            [explicit()]
            param()
            1;echo 2;3
        } | should -be 2 

        Invoke-PipeScript -ScriptBlock {
            [explicit]{
                1;echo 2;3;
                Write-Output (4..5);
                1,2,3|
                    Measure-Object -Sum -average | Write-Output;
                $a = 1..2 | Measure-Object
            } 
        } | Select-Object -First 1 | Should -be 2        
    }
    
    it 'Will leave normal attributes alone' {
        {
            [OutputType([string])]
            param()
            "hello"
        } | .>Pipescript | Should -BeLike '*?OutputType??string???*'
    }

    it 'Can transpile a function' {
        {
            function [explicit]ExplicitOutput {
                "whoops"
                return 1
            }
        } | .>PipeScript |
            Should -BeLike "*function ExplicitOutput*`$null?=?`"whoops`"*return 1*"
    }    
}