# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

Describe "Validate start of console host" -Tag CI {
    BeforeAll {
        if (-not $IsWindows) {
            return
        }

        $csharp_source = @'
            using System;
            using System.Runtime.InteropServices;

            public class ScreenReaderTestUtility {
                private const uint SPI_SETSCREENREADER = 0x0047;

                [DllImport("user32.dll", SetLastError = true)]
                [return: MarshalAs(UnmanagedType.Bool)]
                private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);

                public static bool ActivateScreenReader() {
                    return SystemParametersInfo(SPI_SETSCREENREADER, 1u, IntPtr.Zero, 0);
                }

                public static bool DeactivateScreenReader() {
                    return SystemParametersInfo(SPI_SETSCREENREADER, 0u, IntPtr.Zero, 0);
                }
            }
'@
        $utilType = "ScreenReaderTestUtility" -as [type]
        if (-not $utilType) {
            $utilType = Add-Type -TypeDefinition $csharp_source -PassThru
        }

        ## Make the screen reader status active.
        $utilType::ActivateScreenReader()
    }

    AfterAll {
        if ($IsWindows) {
            ## Make the screen reader status in-active.
            $utilType::DeactivateScreenReader()
        }
    }

    It "PSReadLine should not be auto-loaded when screen reader status is active" -Skip:(-not $IsWindows) {
        $output = & "$PSHOME/pwsh" -noprofile -noexit -c "Get-Module PSReadLine; exit"
        $output.Length | Should -BeExactly 2

        ## The warning message about screen reader should be returned, but the PSReadLine module should not be loaded.
        $output[0] | Should -BeLike "Warning:*'Import-Module PSReadLine'."
        $output[1] | Should -BeExactly ([string]::Empty)
    }
}
