WindowsOutFilePatch.Tests.ps1

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

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

Describe 'Test-Object' {

    BeforeAll {
        Set-StrictMode -Version Latest

        $TempFile = New-TemporaryFile
    }

    AfterEach {
        Remove-Item $TempFile -ErrorAction SilentlyContinue
    }

    Context 'Version check' {

        It 'PowerShell Core' -Skip:($PSVersionTable.PSEdition -eq 'Desktop') {
            $OutFileCommand = Get-Command Out-File
            $OutFileCommand.Source  | Should -Be 'Microsoft.PowerShell.Utility'
            $OutFileCommand.Version | Should -BeGreaterOrEqual ([version]'6.0.0.0')
        }

        It 'Windows PowerShell' -Skip:($PSVersionTable.PSEdition -ne 'Desktop') {
            $OutFileCommand = Get-Command Out-File
            $OutFileCommand.Source  | Should -Be 'WindowsOutFilePatch'
            $OutFileCommand.Version | Should -BeGreaterOrEqual ([version]'3.2.0.0')
        }
    }

    Context 'Per InputObject Parameter (no encoding)' {

        It 'PowerShell Core' -Skip:($PSVersionTable.PSEdition -eq 'Desktop') {
            Out-File $TempFile -InputObject 'Test'
            (Get-Item $TempFile).Length | Should -Be 6
        }

        It 'Windows PowerShell' -Skip:($PSVersionTable.PSEdition -ne 'Desktop') {
            Out-File $TempFile -InputObject 'Test'
            (Get-Item $TempFile).Length | Should -Be 14
        }
    }

    Context 'Via pipeline (no encoding)' {

        It 'PowerShell Core' -Skip:($PSVersionTable.PSEdition -eq 'Desktop') {
            'Test' | Out-File $TempFile
            (Get-Item $TempFile).Length | Should -Be 6
        }

        It 'Windows PowerShell' -Skip:($PSVersionTable.PSEdition -ne 'Desktop') {
            'Test' | Out-File $TempFile
            (Get-Item $TempFile).Length | Should -Be 14
        }
    }

    Context 'Multiple items via pipeline (no encoding)' {

        It 'PowerShell Core' -Skip:($PSVersionTable.PSEdition -eq 'Desktop') {
            'Test1', 'Test2' | Out-File $TempFile
            (Get-Item $TempFile).Length | Should -Be 14
        }

        It 'Windows PowerShell' -Skip:($PSVersionTable.PSEdition -ne 'Desktop') {
            'Test1', 'Test2' | Out-File $TempFile
            (Get-Item $TempFile).Length | Should -Be 30
        }
    }

    Context '-Encoding utf8BOM' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test' -Encoding utf8BOM
            (Get-Item $TempFile).Length | Should -Be 9
        }

        It 'Via pipeline' {
            'Test' | Out-File $TempFile -Encoding utf8BOM
            (Get-Item $TempFile).Length | Should -Be 9
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8BOM
            (Get-Item $TempFile).Length | Should -Be 17
        }
    }

    Context '-Encoding utf8BOM -NoNewLine' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test' -Encoding utf8BOM -NoNewLine
            (Get-Item $TempFile).Length | Should -Be 7
        }

        It 'Via pipeline' {
            'Test' | Out-File $TempFile -Encoding utf8BOM -NoNewLine
            (Get-Item $TempFile).Length | Should -Be 7
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8BOM -NoNewLine
            (Get-Item $TempFile).Length | Should -Be 13
        }
    }

    Context '-Encoding utf8BOM -Append' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test1' -Encoding utf8BOM
            Out-File $TempFile -InputObject 'Test2' -Encoding utf8BOM -Append
            (Get-Item $TempFile).Length | Should -Be 17
        }

        It 'Via pipeline' {
            'Test1' | Out-File $TempFile -Encoding utf8BOM
            'Test2' | Out-File $TempFile -Encoding utf8BOM -Append
            (Get-Item $TempFile).Length | Should -Be 17
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8BOM
            'Test3', 'Test4' | Out-File $TempFile -Encoding utf8BOM -Append
            (Get-Item $TempFile).Length | Should -Be 31
        }
    }

    Context '-Encoding utf8BOM -NoNewLine -Append' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test1' -Encoding utf8BOM -NoNewLine
            Out-File $TempFile -InputObject 'Test2' -Encoding utf8BOM -NoNewLine -Append
            (Get-Item $TempFile).Length | Should -Be 13
        }

        It 'Via pipeline' {
            'Test1' | Out-File $TempFile -Encoding utf8BOM -NoNewLine
            'Test2' | Out-File $TempFile -Encoding utf8BOM -NoNewLine -Append
            (Get-Item $TempFile).Length | Should -Be 13
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8BOM -NoNewLine
            'Test3', 'Test4' | Out-File $TempFile -Encoding utf8BOM -NoNewLine -Append
            (Get-Item $TempFile).Length | Should -Be 23
        }
    }

    Context '-Encoding utf8NoBOM' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test' -Encoding utf8NoBOM
            (Get-Item $TempFile).Length | Should -Be 6
        }

        It 'Via pipeline' {
            'Test' | Out-File $TempFile -Encoding utf8NoBOM
            (Get-Item $TempFile).Length | Should -Be 6
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8NoBOM
            (Get-Item $TempFile).Length | Should -Be 14
        }
    }

    Context '-Encoding utf8NoBOM -NoNewLine' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test' -Encoding utf8NoBOM -NoNewLine
            (Get-Item $TempFile).Length | Should -Be 4
        }

        It 'Via pipeline' {
            'Test' | Out-File $TempFile -Encoding utf8NoBOM -NoNewLine
            (Get-Item $TempFile).Length | Should -Be 4
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8NoBOM -NoNewLine
            (Get-Item $TempFile).Length | Should -Be 10
        }
    }

    Context '-Encoding utf8NoBOM -Append' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test1' -Encoding utf8NoBOM
            Out-File $TempFile -InputObject 'Test2' -Encoding utf8NoBOM -Append
            (Get-Item $TempFile).Length | Should -Be 14
        }

        It 'Via pipeline' {
            'Test1' | Out-File $TempFile -Encoding utf8NoBOM
            'Test2' | Out-File $TempFile -Encoding utf8NoBOM -Append
            (Get-Item $TempFile).Length | Should -Be 14
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8NoBOM
            'Test3', 'Test4' | Out-File $TempFile -Encoding utf8NoBOM -Append
            (Get-Item $TempFile).Length | Should -Be 28
        }
    }

    Context '-Encoding utf8NoBOM -NoNewLine -Append' {

        It 'Per InputObject Parameter' {
            Out-File $TempFile -InputObject 'Test1' -Encoding utf8NoBOM -NoNewLine
            Out-File $TempFile -InputObject 'Test2' -Encoding utf8NoBOM -NoNewLine -Append
            (Get-Item $TempFile).Length | Should -Be 10
        }

        It 'Via pipeline' {
            'Test1' | Out-File $TempFile -Encoding utf8NoBOM -NoNewLine
            'Test2' | Out-File $TempFile -Encoding utf8NoBOM -NoNewLine -Append
            (Get-Item $TempFile).Length | Should -Be 10
        }

        It 'Multiple items via pipeline' {
            'Test1', 'Test2' | Out-File $TempFile -Encoding utf8NoBOM -NoNewLine
            'Test3', 'Test4' | Out-File $TempFile -Encoding utf8NoBOM -NoNewLine -Append
            (Get-Item $TempFile).Length | Should -Be 20
        }
    }
}