From cba6383758588068f696a50f0de614869f840614 Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Thu, 30 Jun 2022 12:10:09 +0200 Subject: Add tests for link (reference) --- tests/link_reference.rs | 402 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 tests/link_reference.rs (limited to 'tests/link_reference.rs') diff --git a/tests/link_reference.rs b/tests/link_reference.rs new file mode 100644 index 0000000..cac1b39 --- /dev/null +++ b/tests/link_reference.rs @@ -0,0 +1,402 @@ +extern crate micromark; +use micromark::{micromark, micromark_with_options, Options}; + +const DANGER: &Options = &Options { + allow_dangerous_html: true, + allow_dangerous_protocol: true, + default_line_ending: None, +}; + +#[test] +fn link_reference() { + assert_eq!( + micromark("[bar]: /url \"title\"\n\n[foo][bar]"), + "

foo

", + "should support link references" + ); + + assert_eq!( + micromark("[ref]: /uri\n\n[link [foo [bar]]][ref]"), + "

link [foo [bar]]

", + "should support balanced brackets in link references" + ); + + assert_eq!( + micromark("[ref]: /uri\n\n[link \\[bar][ref]"), + "

link [bar

", + "should support escaped brackets in link references" + ); + + // To do: attention. + // assert_eq!( + // micromark("[ref]: /uri\n\n[link *foo **bar** `#`*][ref]"), + // "

link foo bar #

", + // "should support content in link references" + // ); + + assert_eq!( + micromark("[ref]: /uri\n\n[![moon](moon.jpg)][ref]"), + "

\"moon\"

", + "should support images in link references" + ); + + assert_eq!( + micromark("[ref]: /uri\n\n[foo [bar](/uri)][ref]"), + "

[foo bar]ref

", + "should not support links in link references" + ); + + // To do: attention. + // assert_eq!( + // micromark("[ref]: /uri\n\n[foo *bar [baz][ref]*][ref]"), + // "

[foo bar baz]ref

", + // "should not support deep links in link references" + // ); + + assert_eq!( + micromark("[ref]: /uri\n\n*[foo*][ref]"), + "

*foo*

", + "should prefer link references over emphasis (1)" + ); + + assert_eq!( + micromark("[ref]: /uri\n\n[foo *bar][ref]"), + "

foo *bar

", + "should prefer link references over emphasis (2)" + ); + + assert_eq!( + micromark_with_options("[ref]: /uri\n\n[foo ", &DANGER), + "

[foo

", + "should prefer HTML over link references" + ); + + assert_eq!( + micromark("[ref]: /uri\n\n[foo`][ref]`"), + "

[foo][ref]

", + "should prefer code over link references" + ); + + assert_eq!( + micromark("[ref]: /uri\n\n[foo"), + "

[foohttp://example.com/?search=][ref]

", + "should prefer autolinks over link references" + ); + + assert_eq!( + micromark("[bar]: /url \"title\"\n\n[foo][BaR]"), + "

foo

", + "should match references to definitions case-insensitively" + ); + + assert_eq!( + micromark("[ТОЛПОЙ]: /url\n\n[Толпой][Толпой] is a Russian word."), + "

Толпой is a Russian word.

", + "should match references to definitions w/ unicode case-folding" + ); + + assert_eq!( + micromark("[Foo\n bar]: /url\n\n[Baz][Foo bar]"), + "

Baz

", + "should match references to definitions w/ collapsing" + ); + + assert_eq!( + micromark("[bar]: /url \"title\"\n\n[foo] [bar]"), + "

[foo] bar

", + "should not support whitespace between label and reference (1)" + ); + + assert_eq!( + micromark("[bar]: /url \"title\"\n\n[foo]\n[bar]"), + "

[foo]\nbar

", + "should not support whitespace between label and reference (2)" + ); + + assert_eq!( + micromark("[foo]: /url1\n\n[foo]: /url2\n\n[bar][foo]"), + "

bar

", + "should prefer earlier definitions" + ); + + assert_eq!( + micromark("[foo!]: /url\n\n[bar][foo\\!]"), + "

[bar][foo!]

", + "should not match references to definitions w/ escapes" + ); + + assert_eq!( + micromark("[ref[]: /uri\n\n[foo][ref[]"), + "

[ref[]: /uri

\n

[foo][ref[]

", + "should not support references w/ brackets (1)" + ); + + assert_eq!( + micromark("[ref[bar]]: /uri\n\n[foo][ref[bar]]"), + "

[ref[bar]]: /uri

\n

[foo][ref[bar]]

", + "should not support references w/ brackets (2)" + ); + + assert_eq!( + micromark("[[[foo]]]: /url\n\n[[[foo]]]"), + "

[[[foo]]]: /url

\n

[[[foo]]]

", + "should not support references w/ brackets (3)" + ); + + assert_eq!( + micromark("[ref\\[]: /uri\n\n[foo][ref\\[]"), + "

foo

", + "should match references to definitions w/ matching escapes" + ); + + assert_eq!( + micromark("[bar\\\\]: /uri\n\n[bar\\\\]"), + "

bar\\

", + "should support escapes" + ); + + assert_eq!( + micromark("[]: /uri\n\n[]"), + "

[]: /uri

\n

[]

", + "should not support empty references" + ); + + // To do: trimming whitespace. + // assert_eq!( + // micromark("[\n ]: /uri\n\n[\n ]"), + // "

[\n]: /uri

\n

[\n]

", + // "should not support blank references" + // ); + + assert_eq!( + micromark("[foo]: /url \"title\"\n\n[foo][]"), + "

foo

", + "should support collaped references" + ); + + // To do: attention. + // assert_eq!( + // micromark("[*foo* bar]: /url \"title\"\n\n[*foo* bar][]"), + // "

foo bar

", + // "should support content in collaped references" + // ); + + assert_eq!( + micromark("[foo]: /url \"title\"\n\n[Foo][]"), + "

Foo

", + "should match references to definitions case-insensitively" + ); + + // To do: trimming whitespace. + // assert_eq!( + // micromark("[foo]: /url \"title\"\n\n[foo] \n[]"), + // "

foo\n[]

", + // "should not support whitespace between label and collaped reference" + // ); + + assert_eq!( + micromark("[foo]: /url \"title\"\n\n[foo]"), + "

foo

", + "should support shortcut references" + ); + + // To do: attention. + // assert_eq!( + // micromark("[*foo* bar]: /url \"title\"\n\n[*foo* bar]"), + // "

foo bar

", + // "should support content in shortcut references (1)" + // ); + + // To do: attention. + // assert_eq!( + // micromark("[*foo* bar]: /url \"title\"\n\n[[*foo* bar]]"), + // "

[foo bar]

", + // "should support content in shortcut references (2)" + // ); + + assert_eq!( + micromark("[foo]: /url\n\n[[bar [foo]"), + "

[[bar foo

", + "should support content in shortcut references (3)" + ); + + assert_eq!( + micromark("[foo]: /url \"title\"\n\n[Foo]"), + "

Foo

", + "should match shortcut references to definitions case-insensitively" + ); + + assert_eq!( + micromark("[foo]: /url\n\n[foo] bar"), + "

foo bar

", + "should support whitespace after a shortcut reference" + ); + + assert_eq!( + micromark("[foo]: /url \"title\"\n\n\\[foo]"), + "

[foo]

", + "should “support” an escaped shortcut reference" + ); + + assert_eq!( + micromark("[foo*]: /url\n\n*[foo*]"), + "

*foo*

", + "should prefer shortcut references over emphasis" + ); + + assert_eq!( + micromark("[foo]: /url1\n[bar]: /url2\n\n[foo][bar]"), + "

foo

", + "should prefer full references over shortcut references" + ); + + assert_eq!( + micromark("[foo]: /url1\n\n[foo][]"), + "

foo

", + "should prefer collapsed references over shortcut references" + ); + + // To do: some bug! + // assert_eq!( + // micromark("[foo]: /url1\n\n[foo]()"), + // "

foo

", + // "should prefer resources over shortcut references" + // ); + + assert_eq!( + micromark("[foo]: /url1\n\n[foo](not a link)"), + "

foo(not a link)

", + "should support shortcut references when followed by nonconforming resources" + ); + + assert_eq!( + micromark("[baz]: /url\n\n[foo][bar][baz]"), + "

[foo]bar

", + "stable/unstable (1)" + ); + + assert_eq!( + micromark("[baz]: /url1\n[bar]: /url2\n\n[foo][bar][baz]"), + "

foobaz

", + "stable/unstable (2)" + ); + + assert_eq!( + micromark("[baz]: /url1\n[foo]: /url2\n\n[foo][bar][baz]"), + "

[foo]bar

", + "stable/unstable (3)" + ); + + // Extra + // This matches most implimentations, but is not strictly according to spec. + // See: + assert_eq!( + micromark("[x]: /url\n\n[x][ ], [x][\t], [x][\n], [x][]"), + "

[x][ ], [x][\t], [x][\n], x

", + "should not support whitespace-only full references" + ); + + // See also: + assert_eq!( + micromark("[+]: example.com\n[\\;]: example.com\n\nWill it link? [\\+], [;]"), + "

Will it link? [+], [;]

", + "should not support mismatched character escapes in shortcuts" + ); + + assert_eq!( + micromark("[©]: example.com\n[&]: example.com\n\nWill it link? [©], [&]"), + "

Will it link? [©], [&]

", + "should not support mismatched character references in shortcuts" + ); + + assert_eq!( + micromark("[+]: example.com\n[\\;]: example.com\n\nWill it link? [\\+][], [;][]"), + "

Will it link? [+][], [;][]

", + "should not support mismatched character escapes in collapsed" + ); + + assert_eq!( + micromark("[©]: example.com\n[&]: example.com\n\nWill it link? [©][], [&][]"), + "

Will it link? [©][], [&][]

", + "should not support mismatched character references in collapsed" + ); + + assert_eq!( + micromark("[+]: example.com\n[\\;]: example.com\n\nWill it link? [a][ \\+ ], [b][ ; ]"), + "

Will it link? [a][ + ], [b][ ; ]

", + "should not support mismatched character escapes in fulls" + ); + + assert_eq!( + micromark( + "[©]: example.com\n[&]: example.com\n\nWill it link? [a][ © ], [b][ & ]" + ), + "

Will it link? [a][ © ], [b][ & ]

", + "should not support mismatched character references in fulls" + ); + + // To do: attention. + // assert_eq!( + // micromark( + // "[*f*][] + // [;][] + // [\\;][] + // [;][] + // [*f*;][] + // [*f*\\;][] + // [*f*;][] + + // [*f*]: alpha + // [;]: bravo + // [\\;]: charlie + // [;]: delta + // [*f*;]: echo + // [*f*\\;]: foxtrot + // [*f*;]: golf" + // ), + // "

f + // ; + // ; + // ; + // f; + // f; + // f;

+ // ", + // "should properly handle labels w/ character references and -escapes, and phrasing" + // ); + + // 999 `x` characters. + let max = "x".repeat(999); + + assert_eq!( + micromark(format!("[{}]: a\n[y][{}]", max, max).as_str()), + "

y

", + "should support 999 characters in a reference" + ); + + assert_eq!( + micromark(format!("[{}x]: a\n[y][{}x]", max, max).as_str()), + format!("

[{}x]: a\n[y][{}x]

", max, max), + "should not support 1000 characters in a reference" + ); + + assert_eq!( + micromark("[x] missing-colon\n\nWill it link? [x]"), + "

[x] missing-colon

\n

Will it link? [x]

", + "should not fail on a missing colon in a definition" + ); + + // To do: turning things off. + // assert_eq!( + // micromark("[x]()", {extensions: [{disable: {null: ["labelStartLink"]}}]}), + // "

[x]()

", + // "should support turning off label start (link)" + // ); + + // To do: turning things off. + // assert_eq!( + // micromark("[x]()", {extensions: [{disable: {null: ["labelEnd"]}}]}), + // "

[x]()

", + // "should support turning off label end" + // ); +} -- cgit