/* eslint-disable no-irregular-whitespace */
import { assert } from "chai";
import getSentenceEnvs from "../../analyzer/getSentenceEnvs";
import xmlToEL from "../../node/el/xmlToEL";
import { omit } from "../../util";
import type { LocateFail, LocateResult } from "./locate";
import locate from "./locate";
import parse from "./parse";
const xml1 = `\
平成五年法律第八十八号
行政手続法
第一章 総則
(目的等)
第一条
この法律は、処分、行政指導及び届出に関する手続並びに命令等を定める手続に関し、共通する事項を定めることによって、行政運営における公正の確保と透明性(行政上の意思決定について、その内容及び過程が国民にとって明らかであることをいう。第四十六条において同じ。)の向上を図り、もって国民の権利利益の保護に資することを目的とする。
2
処分、行政指導及び届出に関する手続並びに命令等を定める手続に関しこの法律に規定する事項について、他の法律に特別の定めがある場合は、その定めるところによる。
(定義)
第二条
この法律において、次の各号に掲げる用語の意義は、当該各号に定めるところによる。
-
一
法令
法律、法律に基づく命令(告示を含む。)、条例及び地方公共団体の執行機関の規則(規程を含む。以下「規則」という。)をいう。
-
二
処分
行政庁の処分その他公権力の行使に当たる行為をいう。
附 則
(施行期日)
1
この法律は、公布の日から起算して一年を超えない範囲内において政令で定める日から施行する。
(経過措置)
2
この法律の施行前に第十五条第一項又は第三十条の規定による通知に相当する行為がされた場合においては、当該通知に相当する行為に係る不利益処分の手続に関しては、第三章の規定にかかわらず、なお従前の例による。
3
この法律の施行前に、届出その他政令で定める行為(以下「届出等」という。)がされた後一定期間内に限りすることができることとされている不利益処分に係る当該届出等がされた場合においては、当該不利益処分に係る手続に関しては、第三章の規定にかかわらず、なお従前の例による。
4
前二項に定めるもののほか、この法律の施行に関して必要な経過措置は、政令で定める。
`;
const xml2 = `\
昭和二十五年法律第百三十一号
電波法
別表第一
(第二十四条の二関係)
-
一
第一級総合無線通信士、第二級総合無線通信士、第三級総合無線通信士、第一級海上無線通信士、第二級海上無線通信士、第四級海上無線通信士、航空無線通信士、第一級陸上無線技術士、第二級陸上無線技術士、陸上特殊無線技士又は第一級アマチュア無線技士の資格を有すること。
-
二
外国の政府機関が発行する前号に掲げる資格に相当する資格を有する者であることの証明書を有すること。
-
三
学校教育法による大学、高等専門学校、高等学校又は中等教育学校において無線通信に関する科目を修めて卒業した者(当該科目を修めて同法による専門職大学の前期課程を修了した者を含む。)であつて、無線設備の機器の試験、調整又は保守の業務に二年以上従事した経験を有すること。
-
四
学校教育法による大学、高等専門学校、高等学校又は中等教育学校に相当する外国の学校において無線通信に関する科目を修めて卒業した者であつて、無線設備の機器の試験、調整又は保守の業務に二年以上従事した経験を有すること。
`;
const xml3 = `\
明治二十九年法律第八十九号
民法
民法第一編第二編第三編別冊ノ通定ム
此法律施行ノ期日ハ勅令ヲ以テ之ヲ定ム
明治二十三年法律第二十八号民法財産編財産取得編債権担保編証拠編ハ此法律発布ノ日ヨリ廃止ス
(別冊)
`;
describe("Test path.v1.locate", () => {
it("Success case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("a=1/p=1");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "Article",
attr: {
"Num": "1",
},
},
},
},
{
container: {
el: {
tag: "Paragraph",
attr: {
"Num": "1",
},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
}
}
});
it("Success case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("a=2/p=1/i=1");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "Article",
attr: {
"Num": "2",
},
},
},
},
{
container: {
el: {
tag: "Paragraph",
attr: {
"Num": "1",
},
},
},
},
{
container: {
el: {
tag: "Item",
attr: {
"Num": "1",
},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
}
}
});
it("Success case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("a=2/i=1");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "Article",
attr: {
"Num": "2",
},
},
},
},
{
container: {
el: {
tag: "Item",
attr: {
"Num": "1",
},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
}
}
});
it("Success case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("sp/p=2");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "SupplProvision",
attr: {},
},
},
},
{
container: {
el: {
tag: "Paragraph",
attr: {
"Num": "2",
},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
}
}
});
it("Success case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("Chapter=1");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "Chapter",
attr: {
"Num": "1",
},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
}
}
});
it("Success case", () => {
const el = xmlToEL(xml2);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("AppdxTable=1");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "AppdxTable",
attr: {
"Num": "1",
},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
}
}
});
it("Success case", () => {
const el = xmlToEL(xml3);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("EnactStatement[2]");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: true,
value: {
fragments: [
{
container: {
el: {
tag: "EnactStatement",
attr: {},
},
},
},
],
},
} as const;
const actual = locate(rootContainer, path.value, []);
assert.isTrue(actual.ok, JSON.stringify((actual as LocateFail).errors));
if (actual.ok) {
assert.strictEqual(actual.value.fragments.length, expected.value.fragments.length);
for (let i = 0; i < actual.value.fragments.length; i++) {
assert.deepInclude(actual.value.fragments[i].container.el, expected.value.fragments[i].container.el);
assert.strictEqual(actual.value.fragments[i].container.el.text(), "此法律施行ノ期日ハ勅令ヲ以テ之ヲ定ム");
}
}
});
it("Fail case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("AppdxTable=1");
if (!path.ok) throw new Error("path.parse failed");
const expected: LocateResult = {
ok: false,
errors: [
{
message: "Cannot locate AppdxTable=1 in ",
range: [0, 1],
},
],
partialValue: null,
};
const actual = locate(rootContainer, path.value, []);
assert.deepStrictEqual(actual, expected);
});
it("Fail case", () => {
const el = xmlToEL(xml1);
const { rootContainer } = getSentenceEnvs(el);
const path = parse("a=2/i=10");
if (!path.ok) throw new Error("path.parse failed");
const expected = {
ok: false,
errors: [
{
message: "Cannot locate i=10 in ",
range: [1, 2],
},
],
partialValue: {
container: {
el: {
tag: "Article",
attr: {
"Num": "2",
},
},
},
fragments: [
{
container: {
el: {
tag: "Article",
attr: {
"Num": "2",
},
},
},
},
],
},
};
const actual = locate(rootContainer, path.value, []);
assert.deepStrictEqual(omit(actual as LocateFail, "partialValue"), omit(expected, "partialValue"));
assert.deepInclude((actual as LocateFail).partialValue?.container.el, expected.partialValue.container.el);
if (!actual.ok && actual.partialValue) {
assert.strictEqual(actual.partialValue.fragments.length, expected.partialValue.fragments.length);
for (let i = 0; i < actual.partialValue.fragments.length; i++) {
assert.deepInclude(actual.partialValue.fragments[i].container.el, expected.partialValue.fragments[i].container.el);
}
}
});
});