UNPKG

yarn-spinner-runner-ts

Version:

TypeScript parser, compiler, and runtime for Yarn Spinner 3.x with React adapter [NPM package](https://www.npmjs.com/package/yarn-spinner-runner-ts)

62 lines (50 loc) 2.12 kB
import { test } from "node:test"; import { strictEqual, ok } from "node:assert"; import { parseYarn, compile, YarnRunner } from "../index.js"; test("nodes and lines delivery", () => { const script = ` title: Start --- Narrator: Line one Narrator: Line two === `; const doc = parseYarn(script); const ir = compile(doc); const runner = new YarnRunner(ir, { startAt: "Start" }); strictEqual(runner.currentResult?.type, "text", "Expected first result to be text"); strictEqual(runner.currentResult?.text.includes("Line one"), true, "Expected 'Line one'"); runner.advance(); strictEqual(runner.currentResult?.type, "text", "Should still be text"); strictEqual(runner.currentResult?.text.includes("Line two"), true, "Expected 'Line two'"); runner.advance(); strictEqual(runner.currentResult?.isDialogueEnd, true, "Expected dialogue end after lines"); }); test("markup parsing propagates to runtime", () => { const script = ` title: Start --- Narrator: Plain [b]bold[/b] [wave speed=2]custom[/wave] === `; const doc = parseYarn(script); const ir = compile(doc); const runner = new YarnRunner(ir, { startAt: "Start" }); const result = runner.currentResult; ok(result && result.type === "text", "Expected text result with markup"); ok(result?.markup, "Expected markup data to be present"); const markup = result!.markup!; strictEqual(markup.text, "Plain bold custom"); const boldSegment = markup.segments.find((segment) => segment.wrappers.some((wrapper) => wrapper.name === "b" && wrapper.type === "default") ); ok(boldSegment, "Expected bold segment"); strictEqual(markup.text.slice(boldSegment!.start, boldSegment!.end), "bold"); const customSegment = markup.segments.find((segment) => segment.wrappers.some((wrapper) => wrapper.name === "wave" && wrapper.type === "custom") ); ok(customSegment, "Expected custom segment"); const waveWrapper = customSegment!.wrappers.find((wrapper) => wrapper.name === "wave"); ok(waveWrapper); strictEqual(waveWrapper!.properties.speed, 2); });