import { test } from "node:test"; import assert from "node:assert/strict"; import { parseXml } from "../out/language/xmlParser.js"; import { analyzeContext, splitListValuePrefix } from "../out/language/context.js"; test("unterminated quote is still an attribute-value context", () => { const text = ` { const text = ` { const text = `\n`; const cursor = text.indexOf("GROUND") + 6; const doc = parseXml(text); const ctx = analyzeContext(doc, text, cursor); assert.equal(ctx.kind, "attribute-value"); assert.equal(ctx.attr?.name, "Surfaces"); assert.equal(ctx.valuePrefix, "GROUND"); }); test("multi-line unterminated quote keeps attribute-value context", () => { const text = `\n` + ` \n` + ` { const text = `\n` + ` \n` + ` { const text = `\n`; const cursor = text.indexOf('GROUND"') + 'GROUND"'.length; const doc = parseXml(text); const ctx = analyzeContext(doc, text, cursor); assert.equal(ctx.kind, "attribute-name"); assert.equal(ctx.attr, null); }); test("cursor exactly after an opening tag with a closing tag is content", () => { const text = ``; const cursor = text.indexOf(">") + 1; const doc = parseXml(text); const ctx = analyzeContext(doc, text, cursor); assert.equal(ctx.kind, "content"); assert.equal(ctx.element?.name, "CreateObject"); }); test("cursor after a typed > but before the closing tag is content too", () => { const text = ``; const cursor = text.length; const doc = parseXml(text); const ctx = analyzeContext(doc, text, cursor); assert.equal(ctx.kind, "content"); assert.equal(ctx.element?.name, "CreateObject"); }); test("cursor after a closed child element belongs to the parent content", () => { const text = `` + `` + `X` + `` + ``; const cursor = text.indexOf("") + "".length; const doc = parseXml(text); const ctx = analyzeContext(doc, text, cursor); assert.equal(ctx.kind, "content"); assert.equal(ctx.element?.name, "ObjectCreationList"); }); test("splitListValuePrefix isolates the token being edited", () => { assert.deepEqual(splitListValuePrefix("GROUND WA"), { token: "WA", start: 7 }); assert.deepEqual(splitListValuePrefix("GROUND "), { token: "", start: 7 }); assert.deepEqual(splitListValuePrefix("WA"), { token: "WA", start: 0 }); assert.deepEqual(splitListValuePrefix(""), { token: "", start: 0 }); });