/** * Windows Terminal Specific Tests * Tests for Windows Terminal, Command Prompt, and PowerShell environments */ import { render } from "ink-testing-library"; import React from "react"; import { Text, Box } from "ink"; import { detectWindowsTerminal, getWindowsTerminalCapabilities, getWindowsColorSupport, getWindowsUnicodeSupport, } from "../../../src/tui/utils/modernTerminal.js"; describe("Windows Terminal Environment Tests", () => { const originalEnv = process.env; const originalPlatform = process.platform; beforeEach(() => { // Reset environment process.env = { ...originalEnv }; Object.defineProperty(process, "platform", { value: "win32", writable: true, }); }); afterEach(() => { process.env = originalEnv; Object.defineProperty(process, "platform", { value: originalPlatform, writable: true, }); }); describe("Windows Terminal Detection", () => { test("should detect Windows Terminal with WT_SESSION", () => { process.env.WT_SESSION = "abc123-def456"; process.env.TERM_PROGRAM = "Windows Terminal"; const isWindowsTerminal = detectWindowsTerminal(); expect(isWindowsTerminal).toBe(true); }); test("should detect Windows Terminal Preview", () => { process.env.WT_SESSION = "preview-session"; process.env.TERM_PROGRAM = "Windows Terminal Preview"; const isWindowsTerminal = detectWindowsTerminal(); expect(isWindowsTerminal).toBe(true); }); test("should not detect Windows Terminal without proper env vars", () => { delete process.env.WT_SESSION; delete process.env.TERM_PROGRAM; const isWindowsTerminal = detectWindowsTerminal(); expect(isWindowsTerminal).toBe(false); }); }); describe("Command Prompt Detection", () => { test("should detect Command Prompt environment", () => { process.env.COMSPEC = "C:\\Windows\\system32\\cmd.exe"; process.env.PROMPT = "$P$G"; delete process.env.WT_SESSION; delete process.env.TERM_PROGRAM; delete process.env.PSModulePath; delete process.env.COLORTERM; const capabilities = getWindowsTerminalCapabilities(); expect(capabilities.isCommandPrompt).toBe(true); expect(capabilities.terminalType).toBe("cmd"); }); test("should handle Command Prompt limitations", () => { process.env.COMSPEC = "C:\\Windows\\system32\\cmd.exe"; delete process.env.WT_SESSION; delete process.env.COLORTERM; delete process.env.TERM_PROGRAM; delete process.env.PSModulePath; const capabilities = getWindowsTerminalCapabilities(); expect(capabilities.supportsUnicode).toBe(false); expect(capabilities.supportsTrueColor).toBe(false); expect(capabilities.supportsColor).toBe(true); // Basic colors only }); }); describe("PowerShell Detection", () => { test("should detect PowerShell environment", () => { process.env.PSModulePath = "C:\\Program Files\\PowerShell\\Modules"; process.env.TERM_PROGRAM = "PowerShell"; delete process.env.WT_SESSION; const capabilities = getWindowsTerminalCapabilities(); expect(capabilities.isPowerShell).toBe(true); expect(capabilities.terminalType).toBe("powershell"); }); test("should detect PowerShell Core", () => { process.env.PSModulePath = "C:\\Program Files\\PowerShell\\7\\Modules"; process.env.TERM_PROGRAM = "PowerShell Core"; const capabilities = getWindowsTerminalCapabilities(); expect(capabilities.isPowerShell).toBe(true); expect(capabilities.supportsUnicode).toBe(true); }); }); describe("Color Support Detection", () => { test("should detect true color support in Windows Terminal", () => { process.env.WT_SESSION = "test"; process.env.COLORTERM = "truecolor"; const colorSupport = getWindowsColorSupport(); expect(colorSupport.supportsTrueColor).toBe(true); expect(colorSupport.supports256Color).toBe(true); expect(colorSupport.supportsBasicColor).toBe(true); }); test("should detect limited color support in Command Prompt", () => { process.env.COMSPEC = "C:\\Windows\\system32\\cmd.exe"; delete process.env.WT_SESSION; delete process.env.COLORTERM; delete process.env.TERM_PROGRAM; delete process.env.PSModulePath; const colorSupport = getWindowsColorSupport(); expect(colorSupport.supportsTrueColor).toBe(false); expect(colorSupport.supports256Color).toBe(false); expect(colorSupport.supportsBasicColor).toBe(true); }); test("should detect 256 color support in PowerShell", () => { process.env.PSModulePath = "C:\\Program Files\\PowerShell\\Modules"; delete process.env.WT_SESSION; delete process.env.COLORTERM; const colorSupport = getWindowsColorSupport(); expect(colorSupport.supportsTrueColor).toBe(false); expect(colorSupport.supports256Color).toBe(true); expect(colorSupport.supportsBasicColor).toBe(true); }); }); describe("Unicode Support Detection", () => { test("should detect Unicode support in Windows Terminal", () => { process.env.WT_SESSION = "test"; const unicodeSupport = getWindowsUnicodeSupport(); expect(unicodeSupport.supportsUnicode).toBe(true); expect(unicodeSupport.supportsEmoji).toBe(true); expect(unicodeSupport.supportsBoxDrawing).toBe(true); }); test("should detect limited Unicode support in Command Prompt", () => { process.env.COMSPEC = "C:\\Windows\\system32\\cmd.exe"; delete process.env.WT_SESSION; delete process.env.COLORTERM; delete process.env.TERM_PROGRAM; delete process.env.PSModulePath; const unicodeSupport = getWindowsUnicodeSupport(); expect(unicodeSupport.supportsUnicode).toBe(false); expect(unicodeSupport.supportsEmoji).toBe(false); expect(unicodeSupport.supportsBoxDrawing).toBe(false); }); test("should detect partial Unicode support in PowerShell", () => { process.env.PSModulePath = "C:\\Program Files\\PowerShell\\Modules"; delete process.env.WT_SESSION; const unicodeSupport = getWindowsUnicodeSupport(); expect(unicodeSupport.supportsUnicode).toBe(true); expect(unicodeSupport.supportsEmoji).toBe(false); expect(unicodeSupport.supportsBoxDrawing).toBe(true); }); }); describe("Character Generation Tests", () => { test("should render progress bars correctly in Windows Terminal", () => { process.env.WT_SESSION = "test"; process.env.COLORTERM = "truecolor"; const ProgressComponent = () => { const capabilities = getWindowsTerminalCapabilities(); const progressChar = capabilities.supportsUnicode ? "█" : "#"; const emptyChar = capabilities.supportsUnicode ? "░" : "-"; return ( Progress: {progressChar.repeat(5)} {emptyChar.repeat(5)} 50% ); }; const { lastFrame } = render(); expect(lastFrame()).toContain("Progress: █████░░░░░ 50%"); }); test("should render progress bars with fallbacks in Command Prompt", () => { process.env.COMSPEC = "C:\\Windows\\system32\\cmd.exe"; delete process.env.WT_SESSION; const ProgressComponent = () => { const capabilities = getWindowsTerminalCapabilities(); const progressChar = capabilities.supportsUnicode ? "█" : "#"; const emptyChar = capabilities.supportsUnicode ? "░" : "-"; return ( Progress: {progressChar.repeat(5)} {emptyChar.repeat(5)} 50% ); }; const { lastFrame } = render(); expect(lastFrame()).toContain("Progress: #####----- 50%"); }); test("should render status indicators correctly across terminals", () => { const testTerminals = [ { env: { WT_SESSION: "test" }, expected: "●" }, { env: { COMSPEC: "C:\\Windows\\system32\\cmd.exe" }, expected: "*" }, { env: { PSModulePath: "C:\\Program Files\\PowerShell\\Modules" }, expected: "●", }, ]; testTerminals.forEach(({ env, expected }) => { // Set environment Object.keys(env).forEach((key) => { process.env[key] = env[key]; }); const StatusComponent = () => { const capabilities = getWindowsTerminalCapabilities(); const statusChar = capabilities.supportsUnicode ? "●" : "*"; return Status: {statusChar} Connected; }; const { lastFrame } = render(); expect(lastFrame()).toContain(`Status: ${expected} Connected`); // Clean up Object.keys(env).forEach((key) => { delete process.env[key]; }); }); }); }); describe("Keyboard Input Handling", () => { test("should handle Windows-specific key codes", () => { const keyMappings = { "\x03": "ctrl+c", "\x1a": "ctrl+z", "\x1b": "escape", "\r": "enter", "\r\n": "enter", // Windows line ending "\x08": "backspace", "\x7f": "delete", }; Object.entries(keyMappings).forEach(([keyCode, expectedKey]) => { // Test key code recognition expect(keyCode).toBeDefined(); expect(expectedKey).toBeDefined(); }); }); test("should handle Windows Terminal enhanced keyboard input", () => { process.env.WT_SESSION = "test"; // Windows Terminal supports enhanced keyboard sequences const enhancedKeys = [ "\x1b[1;5A", // Ctrl+Up "\x1b[1;5B", // Ctrl+Down "\x1b[1;2A", // Shift+Up "\x1b[1;2B", // Shift+Down ]; enhancedKeys.forEach((keySequence) => { expect(keySequence).toMatch(/\x1b\[/); }); }); }); describe("Terminal Size Handling", () => { test("should handle Windows terminal resize events", () => { const originalColumns = process.stdout.columns; const originalRows = process.stdout.rows; // Mock terminal size Object.defineProperty(process.stdout, "columns", { value: 120, writable: true, }); Object.defineProperty(process.stdout, "rows", { value: 30, writable: true, }); const SizeComponent = () => { const [size, setSize] = React.useState({ width: process.stdout.columns || 80, height: process.stdout.rows || 24, }); return ( Size: {size.width}x{size.height} ); }; const { lastFrame } = render(); expect(lastFrame()).toContain("Size: 120x30"); // Restore original values Object.defineProperty(process.stdout, "columns", { value: originalColumns, writable: true, }); Object.defineProperty(process.stdout, "rows", { value: originalRows, writable: true, }); }); }); });