diff --git a/package-lock.json b/package-lock.json index 51a3b93..471af70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "is": "build/index.js" }, "devDependencies": { - "@microsoft/tui-test": "^0.1.0-beta.2", + "@microsoft/tui-test": "^0.1.0", "@tsconfig/node18": "^18.2.2", "@types/color-convert": "^2.0.3", "@types/jest": "^29.5.5", @@ -1723,28 +1723,28 @@ } }, "node_modules/@microsoft/tui-test": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test/-/tui-test-0.1.0-beta.2.tgz", - "integrity": "sha512-xSnK4OUPjBHP/bfKgDiNB6AZNbGwHdGpDw/owR2uCdeCKBB/knraDWxMraPRFQcreMEtph0vWfOii4ESXIuSrg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test/-/tui-test-0.1.0.tgz", + "integrity": "sha512-nzIzoV8nFJjzzLVxoqxAdBAK+hhs10bGdgNNgp0rm5brJ1GXfYPwf4xMzL1FHRT2EV6zQmMykfLbxDhSeyQ8jg==", "dev": true, "license": "MIT", "engines": { "node": ">=20" }, "optionalDependencies": { - "@microsoft/tui-test-darwin-arm64": "0.1.0-beta.2", - "@microsoft/tui-test-darwin-x64": "0.1.0-beta.2", - "@microsoft/tui-test-linux-arm64-gnu": "0.1.0-beta.2", - "@microsoft/tui-test-linux-arm64-musl": "0.1.0-beta.2", - "@microsoft/tui-test-linux-x64-gnu": "0.1.0-beta.2", - "@microsoft/tui-test-linux-x64-musl": "0.1.0-beta.2", - "@microsoft/tui-test-win32-x64-msvc": "0.1.0-beta.2" + "@microsoft/tui-test-darwin-arm64": "0.1.0", + "@microsoft/tui-test-darwin-x64": "0.1.0", + "@microsoft/tui-test-linux-arm64-gnu": "0.1.0", + "@microsoft/tui-test-linux-arm64-musl": "0.1.0", + "@microsoft/tui-test-linux-x64-gnu": "0.1.0", + "@microsoft/tui-test-linux-x64-musl": "0.1.0", + "@microsoft/tui-test-win32-x64-msvc": "0.1.0" } }, "node_modules/@microsoft/tui-test-darwin-arm64": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-arm64/-/tui-test-darwin-arm64-0.1.0-beta.2.tgz", - "integrity": "sha512-3o9O7WQGE5vQcVuEZe2U9uajmi4PyalRFI14nccGSH8JoTIajBSZiRGV+6TFsxG4Gbfo5a+eVSeaa2eD4n5+5A==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-arm64/-/tui-test-darwin-arm64-0.1.0.tgz", + "integrity": "sha512-yhy3AwPzuoONthY2+3EolvoHF/RYc5BPIFQkcmWdpPmzRl14yNTtGuBofJ+upOoZC6WRg42JHm8Uc3y4OZJx3g==", "cpu": [ "arm64" ], @@ -1759,9 +1759,9 @@ } }, "node_modules/@microsoft/tui-test-darwin-x64": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-x64/-/tui-test-darwin-x64-0.1.0-beta.2.tgz", - "integrity": "sha512-qI+Eyn7hYzG5fUU7C5mMJG6fcfuk5HKYm6Ha74SC7J8cW8OtqYt5tVPfSlVGgTaaC0W/pcC8AWAXbLD0fbEGfQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-x64/-/tui-test-darwin-x64-0.1.0.tgz", + "integrity": "sha512-dSf8V4zdTDkliderHD8DCganNrKfztUdV7diXM3qP33nA/rJyqRrlOWmdggKfnca4fJt0h7/mlKO3DOS8rF8Mw==", "cpu": [ "x64" ], @@ -1776,9 +1776,9 @@ } }, "node_modules/@microsoft/tui-test-linux-arm64-gnu": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-gnu/-/tui-test-linux-arm64-gnu-0.1.0-beta.2.tgz", - "integrity": "sha512-bxB/MBk5mtfpobhE7QYYLGMh4Tk+OPoiR361+siz42ZQRR1G6HZYcy6iEmnqLE/85/vqQvUhGRHA//F2b8j7SA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-gnu/-/tui-test-linux-arm64-gnu-0.1.0.tgz", + "integrity": "sha512-nbEF8qWjiqtyhvYHubG+Avznx6dHpaOePC5BrMme1He90tNiFajFFAZUOpXYcQWYaEdR29hxdb2V3DF4BjOgag==", "cpu": [ "arm64" ], @@ -1793,9 +1793,9 @@ } }, "node_modules/@microsoft/tui-test-linux-arm64-musl": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-musl/-/tui-test-linux-arm64-musl-0.1.0-beta.2.tgz", - "integrity": "sha512-ERHvfe1+/vFyf7NroEUJJz6fp4l2mIGtyi9dARhkQyJAVuZ9kCpeUIjktRSOeG3Y7JzfSfAJ4UQxC+9/gFEQgQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-musl/-/tui-test-linux-arm64-musl-0.1.0.tgz", + "integrity": "sha512-Te0uRVpFu+TyDzYDNp5UqMEEFpHYa21n0LDFR7HAlWSdWlD4fu6W4xRkzm/T8aWHdiJke6vZHBTIAjMcaCGejw==", "cpu": [ "arm64" ], @@ -1810,9 +1810,9 @@ } }, "node_modules/@microsoft/tui-test-linux-x64-gnu": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-gnu/-/tui-test-linux-x64-gnu-0.1.0-beta.2.tgz", - "integrity": "sha512-m614FBXWmUUBXX2UUEeF9KIsGHWeQdydqosVuuGLdOSGS/uw2/ioSo35MhHcwAXrkPqeInBrP43DJYDkufvhyQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-gnu/-/tui-test-linux-x64-gnu-0.1.0.tgz", + "integrity": "sha512-BHAtqIH/V00AWy7Zcef7s11XTzNCkz/BPR7rd3Mv+0axiHcjRI/ceCzuVJDnk8kd4ZO7RAxlpxYd43HWmvj3sw==", "cpu": [ "x64" ], @@ -1827,9 +1827,9 @@ } }, "node_modules/@microsoft/tui-test-linux-x64-musl": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-musl/-/tui-test-linux-x64-musl-0.1.0-beta.2.tgz", - "integrity": "sha512-EhT8NiqT7w6kc+vNtkKkIxFephMIinTM3rGjfYv+uXRcPWNVlHmBuV5179oPh4LSy7aVh4QY/ke2DRVFIOyDzw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-musl/-/tui-test-linux-x64-musl-0.1.0.tgz", + "integrity": "sha512-xIBbZH/rHyzlBGn7//VJbCaGcwRZdHJrBs6/2vbRnN+TDAd7XdNplPdGxJ0fjIDcgDedRNWaoaIV5JYmerNkqA==", "cpu": [ "x64" ], @@ -1844,9 +1844,9 @@ } }, "node_modules/@microsoft/tui-test-win32-x64-msvc": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-win32-x64-msvc/-/tui-test-win32-x64-msvc-0.1.0-beta.2.tgz", - "integrity": "sha512-JZozhcE5q5G2INwemvS88nL6jXZjuvU5M45zxh25VbIlfeczFe0yGODWfHQ+QrIwwYm3aAMRhXjFqWciKuzodA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-win32-x64-msvc/-/tui-test-win32-x64-msvc-0.1.0.tgz", + "integrity": "sha512-BmgGrH7WdxAWUYakENpofKnPmtHG2scqghWk6BtTIMGE8aYaLFJhVuEQVQYBDdQXQhXrT627XfUrv3kOIc7vpw==", "cpu": [ "x64" ], @@ -9961,66 +9961,66 @@ } }, "@microsoft/tui-test": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test/-/tui-test-0.1.0-beta.2.tgz", - "integrity": "sha512-xSnK4OUPjBHP/bfKgDiNB6AZNbGwHdGpDw/owR2uCdeCKBB/knraDWxMraPRFQcreMEtph0vWfOii4ESXIuSrg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test/-/tui-test-0.1.0.tgz", + "integrity": "sha512-nzIzoV8nFJjzzLVxoqxAdBAK+hhs10bGdgNNgp0rm5brJ1GXfYPwf4xMzL1FHRT2EV6zQmMykfLbxDhSeyQ8jg==", "dev": true, "requires": { - "@microsoft/tui-test-darwin-arm64": "0.1.0-beta.2", - "@microsoft/tui-test-darwin-x64": "0.1.0-beta.2", - "@microsoft/tui-test-linux-arm64-gnu": "0.1.0-beta.2", - "@microsoft/tui-test-linux-arm64-musl": "0.1.0-beta.2", - "@microsoft/tui-test-linux-x64-gnu": "0.1.0-beta.2", - "@microsoft/tui-test-linux-x64-musl": "0.1.0-beta.2", - "@microsoft/tui-test-win32-x64-msvc": "0.1.0-beta.2" + "@microsoft/tui-test-darwin-arm64": "0.1.0", + "@microsoft/tui-test-darwin-x64": "0.1.0", + "@microsoft/tui-test-linux-arm64-gnu": "0.1.0", + "@microsoft/tui-test-linux-arm64-musl": "0.1.0", + "@microsoft/tui-test-linux-x64-gnu": "0.1.0", + "@microsoft/tui-test-linux-x64-musl": "0.1.0", + "@microsoft/tui-test-win32-x64-msvc": "0.1.0" } }, "@microsoft/tui-test-darwin-arm64": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-arm64/-/tui-test-darwin-arm64-0.1.0-beta.2.tgz", - "integrity": "sha512-3o9O7WQGE5vQcVuEZe2U9uajmi4PyalRFI14nccGSH8JoTIajBSZiRGV+6TFsxG4Gbfo5a+eVSeaa2eD4n5+5A==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-arm64/-/tui-test-darwin-arm64-0.1.0.tgz", + "integrity": "sha512-yhy3AwPzuoONthY2+3EolvoHF/RYc5BPIFQkcmWdpPmzRl14yNTtGuBofJ+upOoZC6WRg42JHm8Uc3y4OZJx3g==", "dev": true, "optional": true }, "@microsoft/tui-test-darwin-x64": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-x64/-/tui-test-darwin-x64-0.1.0-beta.2.tgz", - "integrity": "sha512-qI+Eyn7hYzG5fUU7C5mMJG6fcfuk5HKYm6Ha74SC7J8cW8OtqYt5tVPfSlVGgTaaC0W/pcC8AWAXbLD0fbEGfQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-x64/-/tui-test-darwin-x64-0.1.0.tgz", + "integrity": "sha512-dSf8V4zdTDkliderHD8DCganNrKfztUdV7diXM3qP33nA/rJyqRrlOWmdggKfnca4fJt0h7/mlKO3DOS8rF8Mw==", "dev": true, "optional": true }, "@microsoft/tui-test-linux-arm64-gnu": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-gnu/-/tui-test-linux-arm64-gnu-0.1.0-beta.2.tgz", - "integrity": "sha512-bxB/MBk5mtfpobhE7QYYLGMh4Tk+OPoiR361+siz42ZQRR1G6HZYcy6iEmnqLE/85/vqQvUhGRHA//F2b8j7SA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-gnu/-/tui-test-linux-arm64-gnu-0.1.0.tgz", + "integrity": "sha512-nbEF8qWjiqtyhvYHubG+Avznx6dHpaOePC5BrMme1He90tNiFajFFAZUOpXYcQWYaEdR29hxdb2V3DF4BjOgag==", "dev": true, "optional": true }, "@microsoft/tui-test-linux-arm64-musl": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-musl/-/tui-test-linux-arm64-musl-0.1.0-beta.2.tgz", - "integrity": "sha512-ERHvfe1+/vFyf7NroEUJJz6fp4l2mIGtyi9dARhkQyJAVuZ9kCpeUIjktRSOeG3Y7JzfSfAJ4UQxC+9/gFEQgQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-musl/-/tui-test-linux-arm64-musl-0.1.0.tgz", + "integrity": "sha512-Te0uRVpFu+TyDzYDNp5UqMEEFpHYa21n0LDFR7HAlWSdWlD4fu6W4xRkzm/T8aWHdiJke6vZHBTIAjMcaCGejw==", "dev": true, "optional": true }, "@microsoft/tui-test-linux-x64-gnu": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-gnu/-/tui-test-linux-x64-gnu-0.1.0-beta.2.tgz", - "integrity": "sha512-m614FBXWmUUBXX2UUEeF9KIsGHWeQdydqosVuuGLdOSGS/uw2/ioSo35MhHcwAXrkPqeInBrP43DJYDkufvhyQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-gnu/-/tui-test-linux-x64-gnu-0.1.0.tgz", + "integrity": "sha512-BHAtqIH/V00AWy7Zcef7s11XTzNCkz/BPR7rd3Mv+0axiHcjRI/ceCzuVJDnk8kd4ZO7RAxlpxYd43HWmvj3sw==", "dev": true, "optional": true }, "@microsoft/tui-test-linux-x64-musl": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-musl/-/tui-test-linux-x64-musl-0.1.0-beta.2.tgz", - "integrity": "sha512-EhT8NiqT7w6kc+vNtkKkIxFephMIinTM3rGjfYv+uXRcPWNVlHmBuV5179oPh4LSy7aVh4QY/ke2DRVFIOyDzw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-musl/-/tui-test-linux-x64-musl-0.1.0.tgz", + "integrity": "sha512-xIBbZH/rHyzlBGn7//VJbCaGcwRZdHJrBs6/2vbRnN+TDAd7XdNplPdGxJ0fjIDcgDedRNWaoaIV5JYmerNkqA==", "dev": true, "optional": true }, "@microsoft/tui-test-win32-x64-msvc": { - "version": "0.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@microsoft/tui-test-win32-x64-msvc/-/tui-test-win32-x64-msvc-0.1.0-beta.2.tgz", - "integrity": "sha512-JZozhcE5q5G2INwemvS88nL6jXZjuvU5M45zxh25VbIlfeczFe0yGODWfHQ+QrIwwYm3aAMRhXjFqWciKuzodA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-win32-x64-msvc/-/tui-test-win32-x64-msvc-0.1.0.tgz", + "integrity": "sha512-BmgGrH7WdxAWUYakENpofKnPmtHG2scqghWk6BtTIMGE8aYaLFJhVuEQVQYBDdQXQhXrT627XfUrv3kOIc7vpw==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index 5e4974e..1948488 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "wrap-ansi": "^8.1.0" }, "devDependencies": { - "@microsoft/tui-test": "^0.1.0-beta.2", + "@microsoft/tui-test": "^0.1.0", "@tsconfig/node18": "^18.2.2", "@types/color-convert": "^2.0.3", "@types/jest": "^29.5.5", diff --git a/src/tests/ui/autocomplete.test.ts b/src/tests/ui/autocomplete.test.ts index 3bede7d..2b8267d 100644 --- a/src/tests/ui/autocomplete.test.ts +++ b/src/tests/ui/autocomplete.test.ts @@ -4,7 +4,7 @@ import { jest } from "@jest/globals"; import { terminalSnapshot } from "@microsoft/tui-test/test"; import type { TuiTest } from "@microsoft/tui-test/test"; -import { closeSession, configs, expectPrompt, returnChar, startSession } from "./helpers"; +import { closeSession, configs, expectPrompt, expectText, returnChar, startSession } from "./helpers"; const accent = "#7d56f4"; @@ -21,22 +21,22 @@ describe("resize recovery", () => { test("restores input and suggestions after becoming too narrow", async () => { await terminal.type("git st"); - await terminal.expectText("stage"); + await expectText(terminal, "stage"); await terminal.waitIdle(); const initialView = terminalSnapshot(await terminal.text()); expect(initialView).toMatchSnapshot("initial 80 column view"); await terminal.resize(40, 30); - await terminal.expectText("┘", { not: true }); + await expectText(terminal, "┘", { not: true }); expect(terminalSnapshot(await terminal.text())).toMatchSnapshot("40 column view"); await terminal.resize(21, 30); - await terminal.expectText("┘", { not: true }); + await expectText(terminal, "┘", { not: true }); expect(terminalSnapshot(await terminal.text())).toMatchSnapshot("21 column view"); await terminal.resize(80, 30); await terminal.waitIdle(); - await terminal.expectText("stage"); + await expectText(terminal, "stage"); const restoredView = terminalSnapshot(await terminal.text()); expect(restoredView).toMatchSnapshot("restored 80 column view"); expect(restoredView).toBe(initialView); @@ -58,93 +58,93 @@ configs.map((config) => { test("basic git suggestions", async () => { await terminal.type("git "); - await terminal.expectText("blame"); - await terminal.expectText("archive", { strict: false, bg: accent }); + await expectText(terminal, "blame"); + await expectText(terminal, "archive", { strict: false, bg: accent }); }); test("cursor up when at top of list", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false, bg: accent }); + await expectText(terminal, "archive", { strict: false, bg: accent }); await terminal.press("Up"); - await terminal.expectText("archive", { strict: false, bg: accent }); + await expectText(terminal, "archive", { strict: false, bg: accent }); }); test("move cursor backwards to hide suggestions", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.press("Left"); - await terminal.expectText("archive", { strict: false, not: true }); + await expectText(terminal, "archive", { strict: false, not: true }); }); test("cursor down when at top of list", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.waitIdle(); await terminal.press("Down", "Down"); - await terminal.expectText("repository"); - await terminal.expectText("commit", { bg: accent }); - await terminal.expectText("archive", { strict: false, bg: accent, not: true }); + await expectText(terminal, "repository"); + await expectText(terminal, "commit", { bg: accent }); + await expectText(terminal, "archive", { strict: false, bg: accent, not: true }); }); test("scroll down a full page when at top of list", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.waitIdle(); await terminal.press("Down", "Down", "Down", "Down", "Down"); - await terminal.expectText("archive", { strict: false, not: true }); - await terminal.expectText("add", { bg: accent }); + await expectText(terminal, "archive", { strict: false, not: true }); + await expectText(terminal, "add", { bg: accent }); }); // excluding cmd since it doesn't support CWD tracking (config.shell !== "cmd" ? test : test.skip)("generator results lead suggestions", async () => { await terminal.type("ls "); - await terminal.expectText("📄", { strict: false }); + await expectText(terminal, "📄", { strict: false }); }); test("tab completion", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.press("Tab"); - await terminal.expectText("--format"); + await expectText(terminal, "--format"); }); test("backspacing after accepting tab completion", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.press("Tab"); - await terminal.expectText("--format"); + await expectText(terminal, "--format"); await terminal.press("Backspace", "Backspace", "Backspace"); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); }); test("suggestion cursor resets between views", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.waitIdle(); await terminal.press("Down", "Down"); - await terminal.expectText("repository"); - await terminal.expectText("commit", { bg: accent }); + await expectText(terminal, "repository"); + await expectText(terminal, "commit", { bg: accent }); await terminal.press("Backspace"); - await terminal.expectText("repository", { not: true }); + await expectText(terminal, "repository", { not: true }); await terminal.type(" "); - await terminal.expectText("archive", { strict: false, bg: accent }); + await expectText(terminal, "archive", { strict: false, bg: accent }); }); test("ui on bottom of the screen", async () => { @@ -153,61 +153,61 @@ configs.map((config) => { await expectPrompt(terminal); await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); }); test("command detection after command execution", async () => { await terminal.write(`echo "hello"${rc}`); - await terminal.expectText("hello", { strict: false }); + await expectText(terminal, "hello", { strict: false }); await expectPrompt(terminal); await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); }); test("suggestions clear after command execution", async () => { await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); await terminal.write(rc); - await terminal.expectText("archive", { strict: false, not: true }); + await expectText(terminal, "archive", { strict: false, not: true }); }); test("cursor-position reports are not treated as input", async () => { await terminal.write("\u001B[2;7R"); await terminal.waitIdle(); - await terminal.expectText("[2;7R", { not: true }); + await expectText(terminal, "[2;7R", { not: true }); await terminal.type("git "); - await terminal.expectText("archive", { strict: false }); + await expectText(terminal, "archive", { strict: false }); }); test.skip("access history when no suggestions exist", async () => { await terminal.type("clear"); - await terminal.expectText("clear"); + await expectText(terminal, "clear"); await terminal.write(rc); - await terminal.expectText("clear", { not: true }); + await expectText(terminal, "clear", { not: true }); await terminal.press("Up"); - await terminal.expectText("clear"); + await expectText(terminal, "clear"); }); test("proper overflow truncation in command", async () => { await terminal.type("dotnet add package Holoon.Newtonsoft"); - await terminal.expectText("CanBeUndefi…│"); + await expectText(terminal, "CanBeUndefi…│"); }); test.skip("command detection with suggestions", async () => { await terminal.write(`dotnet add item${rc}`); - await terminal.expectText("dotnet", { strict: false }); + await expectText(terminal, "dotnet", { strict: false }); await terminal.write(`clear${rc}`); - await terminal.expectText("dotnet", { strict: false, not: true }); + await expectText(terminal, "dotnet", { strict: false, not: true }); await terminal.type("dotnet add "); - await terminal.expectText("item"); - await terminal.expectText("package", { strict: false }); + await expectText(terminal, "item"); + await expectText(terminal, "package", { strict: false }); }); }); }); diff --git a/src/tests/ui/helpers.ts b/src/tests/ui/helpers.ts index 05eb2b8..65d08a5 100644 --- a/src/tests/ui/helpers.ts +++ b/src/tests/ui/helpers.ts @@ -40,8 +40,27 @@ const idleTimeout = 15_000; const promptTimeout = 20_000; const timeouts = { text: expectTextTimeout, idle: idleTimeout }; +type ExpectTextOptions = { + strict?: boolean; + not?: boolean; + fg?: string; + bg?: string; + timeout?: number; +}; + +export const expectText = async (terminal: TuiTest, text: string, options: ExpectTextOptions = {}): Promise => { + let locator = terminal.getByText(text); + if (options.fg || options.bg) { + locator = locator.getByStyle({ foreground: options.fg, background: options.bg }); + } + if (options.strict !== false) { + locator = locator.unique(); + } + await locator.expect({ not: options.not, timeout: options.timeout }); +}; + export const expectPrompt = async (terminal: TuiTest, timeout = promptTimeout): Promise => { - await terminal.expectText("> ", { timeout }); + await expectText(terminal, "> ", { timeout }); await terminal.waitIdle(); }; diff --git a/src/tests/ui/status.test.ts b/src/tests/ui/status.test.ts index 54cff71..e51e1fd 100644 --- a/src/tests/ui/status.test.ts +++ b/src/tests/ui/status.test.ts @@ -5,7 +5,7 @@ import os from "node:os"; import { jest } from "@jest/globals"; import type { TuiTest } from "@microsoft/tui-test/test"; import type { Shell } from "@microsoft/tui-test"; -import { closeSession, startSession, startShell } from "./helpers"; +import { closeSession, expectText, startSession, startShell } from "./helpers"; const shell: Shell = os.platform() == "darwin" ? "zsh" : os.platform() == "linux" ? "bash" : "powershell"; @@ -23,7 +23,7 @@ describe("status checks", () => { test("current status", async () => { await terminal.write("is -c\r"); - await terminal.expectText("live", { fg: "2" }); + await expectText(terminal, "live", { fg: "2" }); }); }); @@ -38,7 +38,7 @@ describe("status checks", () => { test("current status", async () => { await terminal.write("is -c\r"); - await terminal.expectText("not found", { fg: "1" }); + await expectText(terminal, "not found", { fg: "1" }); }); }); });