42 lines
2.2 KiB
TypeScript
42 lines
2.2 KiB
TypeScript
import { parser as markdownParser } from "@lezer/markdown";
|
|
import { describe, expect, it } from "vitest";
|
|
import { findGFMEmailMatches, findMarkdownGFMEmailRanges, type MarkdownSourceNode } from "@/utils/gfm-email";
|
|
import { resolvedMarkdownLinkRanges } from "@/utils/markdown-link";
|
|
import { memoMarkdownExtensions } from "@/utils/memo-markdown-extension";
|
|
|
|
describe("GFM email source ranges", () => {
|
|
const range = (from: number, to: number, value: string) => ({ from, to, value });
|
|
const sourceParser = markdownParser.configure(memoMarkdownExtensions);
|
|
|
|
it.each([
|
|
["#foo/bar_baz@example.com", [range(5, 24, "bar_baz@example.com")]],
|
|
["#foo\\+bar@example.com", [range(1, 21, "foo+bar@example.com")]],
|
|
["#next\\_item@example.com", [range(1, 23, "next_item@example.com")]],
|
|
["#foo.bar@example.com", [range(1, 24, "foo.bar@example.com")]],
|
|
["#foo.bar@example.com", [range(1, 27, "foo.bar@example.com")]],
|
|
["#foo@example.com", [range(1, 20, "foo@example.com")]],
|
|
["#foo&bogus;bar@example.com", [range(11, 26, "bar@example.com")]],
|
|
["#foo!bar@example.com", [range(5, 20, "bar@example.com")]],
|
|
["foo@bar.com@baz.example", [range(0, 11, "foo@bar.com")]],
|
|
["foo@bar.com+abc@def.com", [range(0, 11, "foo@bar.com"), range(11, 23, "+abc@def.com")]],
|
|
["mail@example.com.", [range(0, 16, "mail@example.com")]],
|
|
["mail@example.com_", []],
|
|
["mail@example.com-", []],
|
|
["mail@example.c_m", [range(0, 16, "mail@example.c_m")]],
|
|
["mail@example.c_", []],
|
|
["😀foo@example.com", [range(2, 17, "foo@example.com")]],
|
|
["(mail@example.com", [range(1, 17, "mail@example.com")]],
|
|
])("matches canonical ranges in %s", (source, expected) => {
|
|
expect(findGFMEmailMatches(source)).toEqual(expected);
|
|
});
|
|
|
|
it.each([
|
|
["[x][_#foo@example.com_]", [range(6, 21, "foo@example.com")]],
|
|
["![x][_#foo@example.com_]", [range(7, 22, "foo@example.com")]],
|
|
["[x][`#foo@example.com`]", []],
|
|
])("reparses unresolved second-label Markdown in %s", (source, expected) => {
|
|
const root = sourceParser.parse(source).topNode as MarkdownSourceNode;
|
|
|
|
expect(findMarkdownGFMEmailRanges(source, root, resolvedMarkdownLinkRanges(source, root), true)).toEqual(expected);
|
|
});
|
|
});
|