ٹیسٹنگ

⁦@textjs/app/testing⁩ سے ایپس آف اسکرین رینڈر کریں، کلیدیں دبائیں اور فریمز پر اسَرشنز جانچیں۔

@textjs/app/testing (یا @textjs/react/testing) آپ کی ایپ کو آف اسکرین رینڈر کرتا ہے، کیز دباتا ہے اور فریم کو متن کی صورت میں واپس کرتا ہے۔ ٹیسٹ براؤزر یا DevTools کے بغیر چلتے ہیں۔

counter.test.tsxtsx
import { afterEach, expect, test } from "bun:test";import { cleanup, render } from "@textjs/app/testing";import { Counter } from "./counter";afterEach(cleanup);test("counts up", async () => {  const app = await render(<Counter />, { cols: 40, rows: 6 });  await app.press("up up");  expect(app.lastFrame()).toContain("count = 2");});

یہ ہر ایسے رنر کے ساتھ کام کرتا ہے جو async ٹیسٹ سپورٹ کرتا ہو، بشمول Bun، Vitest اور Jest۔

رینڈرنگ

میتھڈتفصیل
render(el, { cols, rows, theme })آف اسکرین ماؤنٹ کرنا (ڈیفالٹ ⁦80×24⁩)
lastFrame()سادہ متن کی صورت میں فریم
lines()قطاروں کی ایرے کی صورت میں فریم
framesاب تک کا ہر منفرد فریم
toAnsi()اسنیپ شاٹس کے لیے ⁦Truecolor ANSI⁩
cell(x, y){ char, fg, bg, attrs }
locate(text)پہلے میچ کا { x, y }
rerender(el) / unmount()اپ ڈیٹ کرنا یا ہٹانا

renderToString(el, options) ایک بار رینڈر کرتا ہے اور متن واپس کرتا ہے۔

ان پٹ

await app.press("down");await app.press("ctrl+k");      // modifiersawait app.press("g g");         // a sequenceawait app.press("G");           // Shift+Gawait app.type("hello\n");      // one key per character, \n is Enterawait app.paste("multi\nline");await app.wheel(3);await app.resize(120, 36);

ہر کال act() کے اندر چلتی ہے اور نتیجے میں بننے والے فریم فلش کرتی ہے، اس لیے اگلا اسرشن اپ ڈیٹ دیکھتا ہے۔

وقت

await app.wait(300);                    // real time passes, then frames flushawait app.waitForText("Deployed");      // poll until the frame contains itawait app.waitFor(() => expect(saved).toBe(true), { timeout: 2000 });

اینیمیشنز، اسپنرز اور ٹوسٹس حقیقی ٹائمرز استعمال کرتے ہیں، اس لیے انہیں دیکھنے کے لیے wait اور waitFor قابل اعتماد طریقے ہیں۔

اسنیپ شاٹس

expect(app.lastFrame()).toMatchSnapshot();expect(app.toAnsi()).toMatchSnapshot(); // colors too

فریم کے دائیں اور نیچے سے خالی جگہ ہٹا دی جاتی ہے، اس لیے وائٹ اسپیس کی وجہ سے اسنیپ شاٹس بار بار نہیں بدلتے۔

⁦GitHub⁩ پر اس صفحے میں ترمیم کریں