Just a whole lot of crap
This commit is contained in:
341
tests/tui/windows/windowsTerminal.test.js
Normal file
341
tests/tui/windows/windowsTerminal.test.js
Normal file
@@ -0,0 +1,341 @@
|
||||
/**
|
||||
* 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 (
|
||||
<Box>
|
||||
<Text>
|
||||
Progress: {progressChar.repeat(5)}
|
||||
{emptyChar.repeat(5)} 50%
|
||||
</Text>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
const { lastFrame } = render(<ProgressComponent />);
|
||||
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 (
|
||||
<Box>
|
||||
<Text>
|
||||
Progress: {progressChar.repeat(5)}
|
||||
{emptyChar.repeat(5)} 50%
|
||||
</Text>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
const { lastFrame } = render(<ProgressComponent />);
|
||||
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 <Text>Status: {statusChar} Connected</Text>;
|
||||
};
|
||||
|
||||
const { lastFrame } = render(<StatusComponent />);
|
||||
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 (
|
||||
<Text>
|
||||
Size: {size.width}x{size.height}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
|
||||
const { lastFrame } = render(<SizeComponent />);
|
||||
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,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user