import { assert } from "chai"; import { matchResultToJson } from "generic-parser/lib/core"; import type { Controls } from "../../../node/cst/inline"; import { LineType } from "../../../node/cst/line"; import { initialEnv } from "../env"; import $supplProvisionAppdxItemHeadLine from "./$supplProvisionAppdxItemHeadLine"; const env = initialEnv({}); describe("Test $supplProvisionAppdxItemHeadLine", () => { it("Success case (:suppl-provision-appdx:)", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ :suppl-provision-appdx: 附則付録第一(第二十六条、第四十五条、第四十六条の五関係)  `; const expectedResult = { ok: true, nextOffset: 55, } as const; const expectedText = `\ :suppl-provision-appdx: 附則付録第一(第二十六条、第四十五条、第四十六条の五関係)  `; const expectedValue = { type: LineType.SPA, indentTexts: [] as string[], mainTag: "SupplProvisionAppdx", controls: [ { control: ":suppl-provision-appdx:", controlRange: [0, 23], trailingSpace: " ", trailingSpaceRange: [23, 24], } ] as Controls, lineEndText: `  `, } as const; const expectedTitle = [ { tag: "__Text", attr: {}, children: ["附則付録第一"], }, ]; const expectedRelatedArticleNum = [ { tag: "__Parentheses", attr: { type: "round", depth: "1" }, children: [ { tag: "__PStart", attr: { type: "round" }, children: ["("] }, { tag: "__PContent", attr: { type: "round" }, children: [ { tag: "__Text", attr: {}, children: ["第二十六条、第四十五条、第四十六条の五関係"] } ] }, { tag: "__PEnd", attr: { type: "round" }, children: [")"] } ] } ] ; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); if (result.ok) { assert.deepInclude(result.value.value, expectedValue); assert.strictEqual(result.value.value.text(), expectedText); assert.deepStrictEqual(result.value.value.title.map(el => el.json(true)), expectedTitle); // console.log(JSON.stringify(result.value.value.relatedArticleNum.map(el => el.json(true)), null, 2)); assert.deepStrictEqual(result.value.value.relatedArticleNum.map(el => el.json(true)), expectedRelatedArticleNum); } }); it("Success case (w/o :suppl-provision-appdx:)", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ # 附則付録第一(第二十六条、第四十五条、第四十六条の五関係)  `; const expectedResult = { ok: true, nextOffset: 33, } as const; const expectedText = `\ # 附則付録第一(第二十六条、第四十五条、第四十六条の五関係)  `; const expectedValue = { type: LineType.SPA, indentTexts: [] as string[], mainTag: "SupplProvisionAppdx", controls: [ { control: "#", controlRange: [0, 1], trailingSpace: " ", trailingSpaceRange: [1, 2], } ] as Controls, lineEndText: `  `, } as const; const expectedTitle = [ { tag: "__Text", attr: {}, children: ["附則付録第一"], }, ]; const expectedRelatedArticleNum = [ { tag: "__Parentheses", attr: { type: "round", depth: "1" }, children: [ { tag: "__PStart", attr: { type: "round" }, children: ["("] }, { tag: "__PContent", attr: { type: "round" }, children: [ { tag: "__Text", attr: {}, children: ["第二十六条、第四十五条、第四十六条の五関係"] } ] }, { tag: "__PEnd", attr: { type: "round" }, children: [")"] } ] } ] ; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); if (result.ok) { assert.deepInclude(result.value.value, expectedValue); assert.strictEqual(result.value.value.text(), expectedText); assert.deepStrictEqual(result.value.value.title.map(el => el.json(true)), expectedTitle); // console.log(JSON.stringify(result.value.value.relatedArticleNum.map(el => el.json(true)), null, 2)); assert.deepStrictEqual(result.value.value.relatedArticleNum.map(el => el.json(true)), expectedRelatedArticleNum); } }); it("Success case (:suppl-provision-appdx-table:)", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ :suppl-provision-appdx-table:附則別表第二(第十九条、第二十一条関係)  * - 情報照会者 - 事務 `; const expectedResult = { ok: true, nextOffset: 51, } as const; const expectedText = `\ :suppl-provision-appdx-table:附則別表第二(第十九条、第二十一条関係)  `; const expectedValue = { type: LineType.SPA, indentTexts: [] as string[], mainTag: "SupplProvisionAppdxTable", controls: [ { control: ":suppl-provision-appdx-table:", controlRange: [0, 29], trailingSpace: "", trailingSpaceRange: [29, 29], } ] as Controls, lineEndText: `  `, } as const; const expectedTitle = [ { tag: "__Text", attr: {}, children: ["附則別表第二"], }, ]; const expectedRelatedArticleNum = [ { tag: "__Parentheses", attr: { type: "round", depth: "1" }, children: [ { tag: "__PStart", attr: { type: "round" }, children: ["("] }, { tag: "__PContent", attr: { type: "round" }, children: [ { tag: "__Text", attr: {}, children: ["第十九条、第二十一条関係"] } ] }, { tag: "__PEnd", attr: { type: "round" }, children: [")"] } ] } ] ; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); if (result.ok) { assert.deepInclude(result.value.value, expectedValue); assert.strictEqual(result.value.value.text(), expectedText); assert.deepStrictEqual(result.value.value.title.map(el => el.json(true)), expectedTitle); // console.log(JSON.stringify(result.value.value.relatedArticleNum.map(el => el.json(true)), null, 2)); assert.deepStrictEqual(result.value.value.relatedArticleNum.map(el => el.json(true)), expectedRelatedArticleNum); } }); it("Success case (w/o :suppl-provision-appdx-table:)", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ # 附則別表第二(第十九条、第二十一条関係)  * - 情報照会者 - 事務 `; const expectedResult = { ok: true, nextOffset: 24, } as const; const expectedText = `\ # 附則別表第二(第十九条、第二十一条関係)  `; const expectedValue = { type: LineType.SPA, indentTexts: [] as string[], mainTag: "SupplProvisionAppdxTable", controls: [ { control: "#", controlRange: [0, 1], trailingSpace: " ", trailingSpaceRange: [1, 2], } ] as Controls, lineEndText: `  `, } as const; const expectedTitle = [ { tag: "__Text", attr: {}, children: ["附則別表第二"], }, ]; const expectedRelatedArticleNum = [ { tag: "__Parentheses", attr: { type: "round", depth: "1" }, children: [ { tag: "__PStart", attr: { type: "round" }, children: ["("] }, { tag: "__PContent", attr: { type: "round" }, children: [ { tag: "__Text", attr: {}, children: ["第十九条、第二十一条関係"] } ] }, { tag: "__PEnd", attr: { type: "round" }, children: [")"] } ] } ] ; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); if (result.ok) { assert.deepInclude(result.value.value, expectedValue); assert.strictEqual(result.value.value.text(), expectedText); assert.deepStrictEqual(result.value.value.title.map(el => el.json(true)), expectedTitle); // console.log(JSON.stringify(result.value.value.relatedArticleNum.map(el => el.json(true)), null, 2)); assert.deepStrictEqual(result.value.value.relatedArticleNum.map(el => el.json(true)), expectedRelatedArticleNum); } }); it("Success case (:suppl-provision-appdx-style:)", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ :suppl-provision-appdx-style:附則別記様式(第十四条関係)  `; const expectedResult = { ok: true, nextOffset: 45, } as const; const expectedText = `\ :suppl-provision-appdx-style:附則別記様式(第十四条関係)  `; const expectedValue = { type: LineType.SPA, indentTexts: [] as string[], mainTag: "SupplProvisionAppdxStyle", controls: [ { control: ":suppl-provision-appdx-style:", controlRange: [0, 29], trailingSpace: "", trailingSpaceRange: [29, 29], } ] as Controls, lineEndText: `  `, } as const; const expectedTitle = [ { tag: "__Text", attr: {}, children: ["附則別記様式"], }, ]; const expectedRelatedArticleNum = [ { tag: "__Parentheses", attr: { type: "round", depth: "1" }, children: [ { tag: "__PStart", attr: { type: "round" }, children: ["("] }, { tag: "__PContent", attr: { type: "round" }, children: [ { tag: "__Text", attr: {}, children: ["第十四条関係"] } ] }, { tag: "__PEnd", attr: { type: "round" }, children: [")"] } ] } ] ; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); if (result.ok) { assert.deepInclude(result.value.value, expectedValue); assert.strictEqual(result.value.value.text(), expectedText); assert.deepStrictEqual(result.value.value.title.map(el => el.json(true)), expectedTitle); // console.log(JSON.stringify(result.value.value.relatedArticleNum.map(el => el.json(true)), null, 2)); assert.deepStrictEqual(result.value.value.relatedArticleNum.map(el => el.json(true)), expectedRelatedArticleNum); } }); it("Success case (w/o :suppl-provision-appdx-style:)", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ # 附則別記様式(第十四条関係)  `; const expectedResult = { ok: true, nextOffset: 18, } as const; const expectedText = `\ # 附則別記様式(第十四条関係)  `; const expectedValue = { type: LineType.SPA, indentTexts: [] as string[], controls: [ { control: "#", controlRange: [0, 1], trailingSpace: " ", trailingSpaceRange: [1, 2], } ] as Controls, lineEndText: `  `, } as const; const expectedTitle = [ { tag: "__Text", attr: {}, children: ["附則別記様式"], }, ]; const expectedRelatedArticleNum = [ { tag: "__Parentheses", attr: { type: "round", depth: "1" }, children: [ { tag: "__PStart", attr: { type: "round" }, children: ["("] }, { tag: "__PContent", attr: { type: "round" }, children: [ { tag: "__Text", attr: {}, children: ["第十四条関係"] } ] }, { tag: "__PEnd", attr: { type: "round" }, children: [")"] } ] } ] ; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); if (result.ok) { assert.deepInclude(result.value.value, expectedValue); assert.strictEqual(result.value.value.text(), expectedText); assert.deepStrictEqual(result.value.value.title.map(el => el.json(true)), expectedTitle); // console.log(JSON.stringify(result.value.value.relatedArticleNum.map(el => el.json(true)), null, 2)); assert.deepStrictEqual(result.value.value.relatedArticleNum.map(el => el.json(true)), expectedRelatedArticleNum); } }); it("Fail case", () => { /* eslint-disable no-irregular-whitespace */ const offset = 0; const target = `\ # 別表第二(第十九条、第二十一条関係) * - 情報照会者 - 事務 `; const expectedResult = { ok: false, offset: 0, expected: "supplProvisionAppdxItemHeadLine", } as const; const result = $supplProvisionAppdxItemHeadLine.abstract().match(offset, target, env); assert.deepInclude(matchResultToJson(result), expectedResult); }); });