import { TagDisposition } from "src/compilation";
import { DelimiterSearcher } from "src/compilation/delimiters";
import { TagParser } from "src/compilation/tagParser";
import { TemplateCompiler } from "src/compilation/templateCompiler";
import { Delimiters } from "src/delimiters";
import { MissingCloseDelimiterError } from "src/errors";
import { createDefaultPlugins, LOOP_CONTENT_TYPE, TEXT_CONTENT_TYPE } from "src/plugins";
import { parseXml } from "test/testUtils";
import { describe, expect, test } from "vitest";
describe(TemplateCompiler, () => {
describe(TemplateCompiler.prototype.parseTags, () => {
test("simple", () => {
const compiler = createTemplateCompiler();
const tags = compiler.parseTags(parseXml(`
{#loop}{/loop}
`));
expect(tags.length).toEqual(2);
expect(tags[0].name).toEqual('loop');
expect(tags[0].disposition).toEqual(TagDisposition.Open);
expect(tags[1].name).toEqual('loop');
expect(tags[1].disposition).toEqual(TagDisposition.Close);
});
test("inline drawing in the middle of a text tag breaks the tag", () => {
const compiler = createTemplateCompiler();
expect(() => compiler.parseTags(parseXml(`
{Text
Tag}
`, false))).toThrow(MissingCloseDelimiterError);
});
test("floating drawing in the middle of a tag is ignored", () => {
const compiler = createTemplateCompiler();
const tags = compiler.parseTags(parseXml(`
{Text
Tag}
`, false));
expect(tags.length).toEqual(2);
expect(tags[0].name).toEqual('Attribute Tag');
expect(tags[1].name).toEqual('Text Tag');
});
});
});
function createTemplateCompiler(): TemplateCompiler {
const delimiters = new Delimiters();
const delimiterSearcher = new DelimiterSearcher(delimiters, 20);
const tagParser = new TagParser(delimiters);
const plugins = createDefaultPlugins();
return new TemplateCompiler(delimiterSearcher, tagParser, plugins, {
defaultContentType: TEXT_CONTENT_TYPE,
containerContentType: LOOP_CONTENT_TYPE
});
}