Just a whole lot of crap
This commit is contained in:
316
tests/tui/windows/windowsPerformance.test.js
Normal file
316
tests/tui/windows/windowsPerformance.test.js
Normal file
@@ -0,0 +1,316 @@
|
||||
/**
|
||||
* Windows Performance Tests
|
||||
* Tests TUI performance specifically on Windows systems
|
||||
*/
|
||||
|
||||
const {
|
||||
detectWindowsTerminal,
|
||||
getWindowsTerminalCapabilities,
|
||||
} = require("../../../src/tui/utils/modernTerminal.js");
|
||||
|
||||
// Mock Windows environment
|
||||
const mockWindowsEnvironment = (terminalType = "windows-terminal") => {
|
||||
Object.defineProperty(process, "platform", {
|
||||
value: "win32",
|
||||
writable: true,
|
||||
});
|
||||
|
||||
// Clear environment first
|
||||
delete process.env.WT_SESSION;
|
||||
delete process.env.TERM_PROGRAM;
|
||||
delete process.env.PSModulePath;
|
||||
delete process.env.COMSPEC;
|
||||
delete process.env.COLORTERM;
|
||||
|
||||
switch (terminalType) {
|
||||
case "windows-terminal":
|
||||
process.env.WT_SESSION = "test-session";
|
||||
process.env.TERM_PROGRAM = "Windows Terminal";
|
||||
process.env.COLORTERM = "truecolor";
|
||||
break;
|
||||
case "cmd":
|
||||
process.env.COMSPEC = "C:\\Windows\\system32\\cmd.exe";
|
||||
break;
|
||||
case "powershell":
|
||||
process.env.PSModulePath = "C:\\Program Files\\PowerShell\\Modules";
|
||||
process.env.TERM_PROGRAM = "PowerShell";
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
describe("Windows Performance Tests", () => {
|
||||
const originalPlatform = process.platform;
|
||||
const originalEnv = process.env;
|
||||
|
||||
afterEach(() => {
|
||||
process.env = originalEnv;
|
||||
Object.defineProperty(process, "platform", {
|
||||
value: originalPlatform,
|
||||
writable: true,
|
||||
});
|
||||
});
|
||||
|
||||
describe("Terminal Detection Performance", () => {
|
||||
test("should detect Windows Terminal capabilities quickly", () => {
|
||||
mockWindowsEnvironment("windows-terminal");
|
||||
|
||||
const startTime = Date.now();
|
||||
const capabilities = getWindowsTerminalCapabilities();
|
||||
const detectionTime = Date.now() - startTime;
|
||||
|
||||
expect(detectionTime).toBeLessThan(10); // Should detect within 10ms
|
||||
expect(capabilities.isWindowsTerminal).toBe(true);
|
||||
expect(capabilities.supportsUnicode).toBe(true);
|
||||
expect(capabilities.supportsTrueColor).toBe(true);
|
||||
});
|
||||
|
||||
test("should detect Command Prompt capabilities efficiently", () => {
|
||||
mockWindowsEnvironment("cmd");
|
||||
|
||||
const startTime = Date.now();
|
||||
const capabilities = getWindowsTerminalCapabilities();
|
||||
const detectionTime = Date.now() - startTime;
|
||||
|
||||
expect(detectionTime).toBeLessThan(10);
|
||||
expect(capabilities.isCommandPrompt).toBe(true);
|
||||
expect(capabilities.supportsUnicode).toBe(false);
|
||||
expect(capabilities.supportsTrueColor).toBe(false);
|
||||
});
|
||||
|
||||
test("should detect PowerShell capabilities quickly", () => {
|
||||
mockWindowsEnvironment("powershell");
|
||||
|
||||
const startTime = Date.now();
|
||||
const capabilities = getWindowsTerminalCapabilities();
|
||||
const detectionTime = Date.now() - startTime;
|
||||
|
||||
expect(detectionTime).toBeLessThan(10);
|
||||
expect(capabilities.isPowerShell).toBe(true);
|
||||
expect(capabilities.supportsUnicode).toBe(true);
|
||||
expect(capabilities.supports256Color).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Memory Usage", () => {
|
||||
test("should not leak memory during Windows Terminal detection", () => {
|
||||
mockWindowsEnvironment("windows-terminal");
|
||||
|
||||
const initialMemory = process.memoryUsage().heapUsed;
|
||||
|
||||
// Run detection multiple times
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
detectWindowsTerminal();
|
||||
getWindowsTerminalCapabilities();
|
||||
}
|
||||
|
||||
// Force garbage collection if available
|
||||
if (global.gc) {
|
||||
global.gc();
|
||||
}
|
||||
|
||||
const finalMemory = process.memoryUsage().heapUsed;
|
||||
const memoryIncrease = finalMemory - initialMemory;
|
||||
|
||||
// Memory increase should be minimal (less than 1MB)
|
||||
expect(memoryIncrease).toBeLessThan(1024 * 1024);
|
||||
});
|
||||
|
||||
test("should handle rapid terminal capability checks", () => {
|
||||
const terminals = ["windows-terminal", "cmd", "powershell"];
|
||||
const startTime = Date.now();
|
||||
|
||||
// Rapidly switch between terminal types
|
||||
for (let i = 0; i < 100; i++) {
|
||||
const terminalType = terminals[i % terminals.length];
|
||||
mockWindowsEnvironment(terminalType);
|
||||
getWindowsTerminalCapabilities();
|
||||
}
|
||||
|
||||
const totalTime = Date.now() - startTime;
|
||||
|
||||
// Should complete 300 operations in less than 1 second
|
||||
expect(totalTime).toBeLessThan(1000);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Character Rendering Performance", () => {
|
||||
test("should generate character fallbacks efficiently", () => {
|
||||
mockWindowsEnvironment("cmd");
|
||||
|
||||
const startTime = Date.now();
|
||||
const capabilities = getWindowsTerminalCapabilities();
|
||||
|
||||
// Generate character mappings
|
||||
const chars = {
|
||||
progress: capabilities.supportsUnicode ? "█" : "#",
|
||||
empty: capabilities.supportsUnicode ? "░" : "-",
|
||||
status: capabilities.supportsUnicode ? "●" : "*",
|
||||
arrow: capabilities.supportsUnicode ? "►" : ">",
|
||||
check: capabilities.supportsUnicode ? "✓" : "v",
|
||||
cross: capabilities.supportsUnicode ? "✗" : "x",
|
||||
};
|
||||
|
||||
// Generate progress bar strings
|
||||
const progressBars = [];
|
||||
for (let i = 0; i <= 100; i += 10) {
|
||||
const filled = Math.round((i / 100) * 20);
|
||||
progressBars.push(
|
||||
chars.progress.repeat(filled) + chars.empty.repeat(20 - filled)
|
||||
);
|
||||
}
|
||||
|
||||
const generationTime = Date.now() - startTime;
|
||||
|
||||
expect(generationTime).toBeLessThan(50);
|
||||
expect(progressBars).toHaveLength(11);
|
||||
expect(progressBars[0]).toBe("--------------------"); // 0% with fallback chars
|
||||
expect(progressBars[10]).toBe("####################"); // 100% with fallback chars
|
||||
});
|
||||
|
||||
test("should handle Unicode character generation efficiently", () => {
|
||||
mockWindowsEnvironment("windows-terminal");
|
||||
|
||||
const startTime = Date.now();
|
||||
const capabilities = getWindowsTerminalCapabilities();
|
||||
|
||||
// Generate Unicode character strings
|
||||
const unicodeStrings = [];
|
||||
for (let i = 0; i < 100; i++) {
|
||||
const progressChar = capabilities.supportsUnicode ? "█" : "#";
|
||||
const emptyChar = capabilities.supportsUnicode ? "░" : "-";
|
||||
unicodeStrings.push(progressChar.repeat(10) + emptyChar.repeat(10));
|
||||
}
|
||||
|
||||
const generationTime = Date.now() - startTime;
|
||||
|
||||
expect(generationTime).toBeLessThan(50);
|
||||
expect(unicodeStrings).toHaveLength(100);
|
||||
expect(unicodeStrings[0]).toBe("██████████░░░░░░░░░░");
|
||||
});
|
||||
});
|
||||
|
||||
describe("Windows-Specific Optimizations", () => {
|
||||
test("should optimize for Windows file path handling", () => {
|
||||
const windowsPaths = [
|
||||
"C:\\Users\\Test\\AppData\\Local\\Temp\\test.log",
|
||||
"D:\\Projects\\MyApp\\logs\\error.log",
|
||||
"\\\\server\\share\\file.txt",
|
||||
"C:\\Program Files\\App\\config.json",
|
||||
];
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
const normalizedPaths = windowsPaths.map((path) => {
|
||||
// Simulate path normalization
|
||||
return path.replace(/\\/g, "/");
|
||||
});
|
||||
|
||||
const processingTime = Date.now() - startTime;
|
||||
|
||||
expect(processingTime).toBeLessThan(10);
|
||||
expect(normalizedPaths).toEqual([
|
||||
"C:/Users/Test/AppData/Local/Temp/test.log",
|
||||
"D:/Projects/MyApp/logs/error.log",
|
||||
"//server/share/file.txt",
|
||||
"C:/Program Files/App/config.json",
|
||||
]);
|
||||
});
|
||||
|
||||
test("should handle Windows environment variable processing efficiently", () => {
|
||||
const windowsEnvVars = {
|
||||
USERPROFILE: "C:\\Users\\TestUser",
|
||||
APPDATA: "C:\\Users\\TestUser\\AppData\\Roaming",
|
||||
LOCALAPPDATA: "C:\\Users\\TestUser\\AppData\\Local",
|
||||
PROGRAMFILES: "C:\\Program Files",
|
||||
SYSTEMROOT: "C:\\Windows",
|
||||
};
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
// Simulate environment variable processing
|
||||
Object.entries(windowsEnvVars).forEach(([key, value]) => {
|
||||
expect(typeof value).toBe("string");
|
||||
expect(value.length).toBeGreaterThan(0);
|
||||
expect(value).toMatch(/^[A-Z]:\\/); // Windows path format
|
||||
});
|
||||
|
||||
const processingTime = Date.now() - startTime;
|
||||
expect(processingTime).toBeLessThan(10);
|
||||
});
|
||||
|
||||
test("should efficiently detect Windows version compatibility", () => {
|
||||
const startTime = Date.now();
|
||||
|
||||
// Simulate Windows version detection
|
||||
const isWindows = process.platform === "win32";
|
||||
const hasModernTerminal = Boolean(process.env.WT_SESSION);
|
||||
const hasLegacyTerminal = Boolean(process.env.COMSPEC);
|
||||
|
||||
const detectionTime = Date.now() - startTime;
|
||||
|
||||
expect(detectionTime).toBeLessThan(5);
|
||||
expect(typeof isWindows).toBe("boolean");
|
||||
expect(typeof hasModernTerminal).toBe("boolean");
|
||||
expect(typeof hasLegacyTerminal).toBe("boolean");
|
||||
});
|
||||
});
|
||||
|
||||
describe("Stress Testing", () => {
|
||||
test("should handle repeated terminal type switching", () => {
|
||||
const terminals = ["windows-terminal", "cmd", "powershell"];
|
||||
const results = [];
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
const terminalType = terminals[i % terminals.length];
|
||||
mockWindowsEnvironment(terminalType);
|
||||
const capabilities = getWindowsTerminalCapabilities();
|
||||
results.push(capabilities.terminalType);
|
||||
}
|
||||
|
||||
const totalTime = Date.now() - startTime;
|
||||
|
||||
expect(totalTime).toBeLessThan(500); // 1000 switches in less than 500ms
|
||||
expect(results).toHaveLength(1000);
|
||||
|
||||
// Verify correct distribution
|
||||
const windowsTerminalCount = results.filter(
|
||||
(t) => t === "windows-terminal"
|
||||
).length;
|
||||
const cmdCount = results.filter((t) => t === "cmd").length;
|
||||
const powershellCount = results.filter((t) => t === "powershell").length;
|
||||
|
||||
expect(windowsTerminalCount).toBeGreaterThan(300);
|
||||
expect(windowsTerminalCount).toBeLessThan(350);
|
||||
expect(cmdCount).toBeGreaterThan(300);
|
||||
expect(cmdCount).toBeLessThan(350);
|
||||
expect(powershellCount).toBeGreaterThan(300);
|
||||
expect(powershellCount).toBeLessThan(350);
|
||||
});
|
||||
|
||||
test("should maintain performance under concurrent capability checks", async () => {
|
||||
mockWindowsEnvironment("windows-terminal");
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
// Simulate concurrent capability checks
|
||||
const promises = Array.from({ length: 100 }, () =>
|
||||
Promise.resolve(getWindowsTerminalCapabilities())
|
||||
);
|
||||
|
||||
const results = await Promise.all(promises);
|
||||
const totalTime = Date.now() - startTime;
|
||||
|
||||
expect(totalTime).toBeLessThan(100);
|
||||
expect(results).toHaveLength(100);
|
||||
|
||||
// All results should be identical
|
||||
results.forEach((result) => {
|
||||
expect(result.isWindowsTerminal).toBe(true);
|
||||
expect(result.supportsUnicode).toBe(true);
|
||||
expect(result.supportsTrueColor).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user