import { assertEquals } from "testing/asserts.ts";
import { HtmlStrRenderer } from "../ren/html_str.ts";
import { MarkdownParser } from "./md.ts";
const ren = new HtmlStrRenderer();
// Misc
Deno.test({
name: "should skip empty line",
fn: () => {
const par = new MarkdownParser();
assertEquals(ren.render(par.parse("\n")), "");
assertEquals(ren.render(par.parse("\r\n")), "");
assertEquals(ren.render(par.parse("\n\r\n")), "");
assertEquals(ren.render(par.parse("\n \n")), "");
},
});
// ATX Header
Deno.test({
name: "should parse empty ATX header",
fn: () => {
const par = new MarkdownParser();
const res = par.parse("#");
assertEquals(ren.render(res), "
");
},
});
Deno.test({
name: "should parse ATX header with text",
fn: () => {
const par = new MarkdownParser();
assertEquals(ren.render(par.parse("# hello")), "hello
");
assertEquals(ren.render(par.parse("# hello#")), "hello#
");
},
});
Deno.test({
name: "should parse ATX header with specific level",
fn: () => {
const par = new MarkdownParser();
assertEquals(ren.render(par.parse("# hello")), "hello
");
assertEquals(ren.render(par.parse("## hello")), "hello
");
assertEquals(ren.render(par.parse("### hello")), "hello
");
assertEquals(ren.render(par.parse("#### hello")), "hello
");
assertEquals(ren.render(par.parse("##### hello")), "hello
");
assertEquals(ren.render(par.parse("###### hello")), "hello
");
},
});
Deno.test({
name: "should parse ATX header if line contains additional spaces",
fn: () => {
const par = new MarkdownParser();
assertEquals(ren.render(par.parse(" # hello")), "hello
");
assertEquals(ren.render(par.parse(" # hello")), "hello
");
assertEquals(ren.render(par.parse(" # hello")), "hello
");
},
});
Deno.test({
name: "should parse ATX header with closing sequence",
fn: () => {
const par = new MarkdownParser();
assertEquals(ren.render(par.parse("# #")), "");
assertEquals(ren.render(par.parse("# hello #")), "hello
");
assertEquals(ren.render(par.parse("# hello #########")), "hello
");
assertEquals(ren.render(par.parse("# hello # ")), "hello
");
assertEquals(ren.render(par.parse("###### hello #")), "hello
");
},
});
Deno.test({
name: "should parse many headers with text",
fn: () => {
const par = new MarkdownParser();
const input = `\
# hello
## world
### this is
#### my world!`;
assertEquals(
ren.render(par.parse(input)),
"hello
world
this is
my world!
",
);
},
});
// Paragraph
Deno.test({
name: "should parse paragraph",
fn: () => {
const par = new MarkdownParser();
assertEquals(ren.render(par.parse("hello")), "hello
");
},
});
Deno.test({
name: "should parse paragraph with softbreak",
fn: () => {
const par = new MarkdownParser();
const input = `\
hello
world`;
assertEquals(ren.render(par.parse(input)), "hello world
");
},
});
// Link
Deno.test({
name: "should parse link",
fn: () => {
const par = new MarkdownParser();
assertEquals(
ren.render(par.parse("[]()")),
'
',
);
assertEquals(
ren.render(par.parse("[hello]()")),
'hello
',
);
assertEquals(
ren.render(par.parse("[hello]()")),
'hello
',
);
},
});
Deno.test({
name: "should parse link destination",
fn: () => {
const par = new MarkdownParser();
assertEquals(
ren.render(par.parse("[](/hello)")),
'
',
);
assertEquals(
ren.render(par.parse("[](/hello?key=value&key2=value2)")),
'
',
);
assertEquals(
ren.render(par.parse("[hello](https://example.com)")),
'hello
',
);
assertEquals(
ren.render(par.parse("[hello](mailto:john@example.com)")),
'hello
',
);
assertEquals(
ren.render(par.parse("[](/привет)")),
'
',
);
assertEquals(
ren.render(par.parse("[]()")),
'
',
);
assertEquals(
ren.render(par.parse("[]()")),
'
',
);
},
});
Deno.test({
name: "should parse link title",
fn: () => {
const par = new MarkdownParser();
assertEquals(
ren.render(par.parse("[](/hello 'hello')")),
'
',
);
assertEquals(
ren.render(par.parse('[hello](/hello "world")')),
'hello
',
);
assertEquals(
ren.render(par.parse('[hello]( "hello world")')),
'hello
',
);
},
});
// List
Deno.test({
name: "should parse list with empty items",
fn: () => {
const par = new MarkdownParser();
assertEquals(
ren.render(par.parse("-")),
"",
);
assertEquals(
ren.render(par.parse("- ")),
"",
);
},
});
Deno.test({
name: "should parse list if line contains additional spaces",
fn: () => {
const expected = "";
const par = new MarkdownParser();
assertEquals(ren.render(par.parse(" - hello")), expected);
assertEquals(ren.render(par.parse(" - hello")), expected);
assertEquals(ren.render(par.parse(" - hello")), expected);
},
});
Deno.test({
name: "should not display a single paragraph in the list",
fn: () => {
const par = new MarkdownParser();
assertEquals(
ren.render(par.parse("- hello")),
"",
);
assertEquals(
ren.render(par.parse(`\
- hello
world`)),
"",
);
assertEquals(
ren.render(par.parse(`\
- hello
world`)),
"",
);
},
});
Deno.test({
name: "should parse many items in the list",
fn: () => {
const par = new MarkdownParser();
assertEquals(
ren.render(par.parse(`\
- hello
- world`)),
"",
);
},
});