| Index: test/markdown_test.dart
|
| diff --git a/test/markdown_test.dart b/test/markdown_test.dart
|
| index e2d1b406ebf6268fcb852aa5a258bf8b4ef52377..e0e8e118c4602d3d9f7372156c5627c115cce12f 100644
|
| --- a/test/markdown_test.dart
|
| +++ b/test/markdown_test.dart
|
| @@ -9,16 +9,19 @@ import 'package:unittest/unittest.dart';
|
|
|
| import 'package:markdown/markdown.dart';
|
|
|
| -import 'utils.dart';
|
| +import 'util.dart';
|
|
|
| /// Most of these tests are based on observing how showdown behaves:
|
| /// http://softwaremaniacs.org/playground/showdown-highlight/
|
| void main() {
|
| group('Paragraphs', () {
|
| - validate('consecutive lines form a single paragraph', '''
|
| + validate(
|
| + 'consecutive lines form a single paragraph',
|
| + '''
|
| This is the first line.
|
| This is the second line.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>This is the first line.
|
| This is the second line.</p>
|
| ''');
|
| @@ -28,163 +31,229 @@ void main() {
|
| // code significantly cleaner, we should consider ourselves free to change
|
| // these tests.
|
|
|
| - validate('are terminated by a header', '''
|
| + validate(
|
| + 'are terminated by a header',
|
| + '''
|
| para
|
| # header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>para</p>
|
| <h1>header</h1>
|
| ''');
|
|
|
| - validate('are terminated by a setext header', '''
|
| + validate(
|
| + 'are terminated by a setext header',
|
| + '''
|
| para
|
| header
|
| ==
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>para</p>
|
| <h1>header</h1>
|
| ''');
|
|
|
| - validate('are terminated by a hr', '''
|
| + validate(
|
| + 'are terminated by a hr',
|
| + '''
|
| para
|
| ___
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>para</p>
|
| <hr />
|
| ''');
|
|
|
| - validate('consume an unordered list', '''
|
| + validate(
|
| + 'consume an unordered list',
|
| + '''
|
| para
|
| * list
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>para
|
| * list</p>
|
| ''');
|
|
|
| - validate('consume an ordered list', '''
|
| + validate(
|
| + 'consume an ordered list',
|
| + '''
|
| para
|
| 1. list
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>para
|
| 1. list</p>
|
| ''');
|
|
|
| // Windows line endings have a \r\n format
|
| // instead of the unix \n format.
|
| - validate('take account of windows line endings', '''
|
| + validate(
|
| + 'take account of windows line endings',
|
| + '''
|
| line1\r\n\r\n line2\r\n
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>line1</p>
|
| <p>line2</p>
|
| ''');
|
| });
|
|
|
| group('Setext headers', () {
|
| - validate('h1', '''
|
| + validate(
|
| + 'h1',
|
| + '''
|
| text
|
| ===
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>text</h1>
|
| ''');
|
|
|
| - validate('h2', '''
|
| + validate(
|
| + 'h2',
|
| + '''
|
| text
|
| ---
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h2>text</h2>
|
| ''');
|
|
|
| - validate('h1 on first line becomes text', '''
|
| + validate(
|
| + 'h1 on first line becomes text',
|
| + '''
|
| ===
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>===</p>
|
| ''');
|
|
|
| - validate('h2 on first line becomes text', '''
|
| + validate(
|
| + 'h2 on first line becomes text',
|
| + '''
|
| -
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>-</p>
|
| ''');
|
|
|
| - validate('h1 turns preceding list into text', '''
|
| + validate(
|
| + 'h1 turns preceding list into text',
|
| + '''
|
| - list
|
| ===
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>- list</h1>
|
| ''');
|
|
|
| - validate('h2 turns preceding list into text', '''
|
| + validate(
|
| + 'h2 turns preceding list into text',
|
| + '''
|
| - list
|
| ===
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>- list</h1>
|
| ''');
|
|
|
| - validate('h1 turns preceding blockquote into text', '''
|
| + validate(
|
| + 'h1 turns preceding blockquote into text',
|
| + '''
|
| > quote
|
| ===
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>> quote</h1>
|
| ''');
|
|
|
| - validate('h2 turns preceding blockquote into text', '''
|
| + validate(
|
| + 'h2 turns preceding blockquote into text',
|
| + '''
|
| > quote
|
| ===
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>> quote</h1>
|
| ''');
|
| });
|
|
|
| group('Headers', () {
|
| - validate('h1', '''
|
| + validate(
|
| + 'h1',
|
| + '''
|
| # header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>header</h1>
|
| ''');
|
|
|
| - validate('h2', '''
|
| + validate(
|
| + 'h2',
|
| + '''
|
| ## header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h2>header</h2>
|
| ''');
|
|
|
| - validate('h3', '''
|
| + validate(
|
| + 'h3',
|
| + '''
|
| ### header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h3>header</h3>
|
| ''');
|
|
|
| - validate('h4', '''
|
| + validate(
|
| + 'h4',
|
| + '''
|
| #### header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h4>header</h4>
|
| ''');
|
|
|
| - validate('h5', '''
|
| + validate(
|
| + 'h5',
|
| + '''
|
| ##### header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h5>header</h5>
|
| ''');
|
|
|
| - validate('h6', '''
|
| + validate(
|
| + 'h6',
|
| + '''
|
| ###### header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h6>header</h6>
|
| ''');
|
|
|
| - validate('trailing "#" are removed', '''
|
| + validate(
|
| + 'trailing "#" are removed',
|
| + '''
|
| # header ######
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <h1>header</h1>
|
| ''');
|
| });
|
|
|
| group('Unordered lists', () {
|
| - validate('asterisk, plus and hyphen', '''
|
| + validate(
|
| + 'asterisk, plus and hyphen',
|
| + '''
|
| * star
|
| - dash
|
| + plus
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li>star</li>
|
| <li>dash</li>
|
| @@ -192,22 +261,28 @@ void main() {
|
| </ul>
|
| ''');
|
|
|
| - validate('allow numbered lines after first', '''
|
| + validate(
|
| + 'allow numbered lines after first',
|
| + '''
|
| * a
|
| 1. b
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li>a</li>
|
| <li>b</li>
|
| </ul>
|
| ''');
|
|
|
| - validate('allow a tab after the marker', '''
|
| + validate(
|
| + 'allow a tab after the marker',
|
| + '''
|
| *\ta
|
| +\tb
|
| -\tc
|
| 1.\td
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li>a</li>
|
| <li>b</li>
|
| @@ -216,23 +291,29 @@ void main() {
|
| </ul>
|
| ''');
|
|
|
| - validate('wrap items in paragraphs if blank lines separate', '''
|
| + validate(
|
| + 'wrap items in paragraphs if blank lines separate',
|
| + '''
|
| * one
|
|
|
| * two
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li><p>one</p></li>
|
| <li><p>two</p></li>
|
| </ul>
|
| ''');
|
|
|
| - validate('force paragraph on item before and after blank lines', '''
|
| + validate(
|
| + 'force paragraph on item before and after blank lines',
|
| + '''
|
| * one
|
| * two
|
|
|
| * three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li>one</li>
|
| <li>
|
| @@ -244,24 +325,30 @@ void main() {
|
| </ul>
|
| ''');
|
|
|
| - validate('do not force paragraph if item is already block', '''
|
| + validate(
|
| + 'do not force paragraph if item is already block',
|
| + '''
|
| * > quote
|
|
|
| * # header
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li><blockquote><p>quote</p></blockquote></li>
|
| <li><h1>header</h1></li>
|
| </ul>
|
| ''');
|
|
|
| - validate('can contain multiple paragraphs', '''
|
| + validate(
|
| + 'can contain multiple paragraphs',
|
| + '''
|
| * one
|
|
|
| two
|
|
|
| * three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li>
|
| <p>one</p>
|
| @@ -273,11 +360,14 @@ void main() {
|
| </ul>
|
| ''');
|
|
|
| - validate('can span newlines', '''
|
| + validate(
|
| + 'can span newlines',
|
| + '''
|
| * one
|
| two
|
| * three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ul>
|
| <li>
|
| <p>one
|
| @@ -306,11 +396,14 @@ void main() {
|
| });
|
|
|
| group('Ordered lists', () {
|
| - validate('start with numbers', '''
|
| + validate(
|
| + 'start with numbers',
|
| + '''
|
| 1. one
|
| 45. two
|
| 12345. three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ol>
|
| <li>one</li>
|
| <li>two</li>
|
| @@ -318,10 +411,13 @@ void main() {
|
| </ol>
|
| ''');
|
|
|
| - validate('allow unordered lines after first', '''
|
| + validate(
|
| + 'allow unordered lines after first',
|
| + '''
|
| 1. a
|
| * b
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <ol>
|
| <li>a</li>
|
| <li>b</li>
|
| @@ -330,30 +426,39 @@ void main() {
|
| });
|
|
|
| group('Blockquotes', () {
|
| - validate('single line', '''
|
| + validate(
|
| + 'single line',
|
| + '''
|
| > blah
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <blockquote>
|
| <p>blah</p>
|
| </blockquote>
|
| ''');
|
|
|
| - validate('with two paragraphs', '''
|
| + validate(
|
| + 'with two paragraphs',
|
| + '''
|
| > first
|
| >
|
| > second
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <blockquote>
|
| <p>first</p>
|
| <p>second</p>
|
| </blockquote>
|
| ''');
|
|
|
| - validate('nested', '''
|
| + validate(
|
| + 'nested',
|
| + '''
|
| > one
|
| >> two
|
| > > > three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <blockquote>
|
| <p>one</p>
|
| <blockquote>
|
| @@ -367,32 +472,41 @@ void main() {
|
| });
|
|
|
| group('Code blocks', () {
|
| - validate('single line', '''
|
| + validate(
|
| + 'single line',
|
| + '''
|
| code
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>code</code></pre>
|
| ''');
|
|
|
| - validate('include leading whitespace after indentation', '''
|
| + validate(
|
| + 'include leading whitespace after indentation',
|
| + '''
|
| zero
|
| one
|
| two
|
| three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>zero
|
| one
|
| two
|
| three</code></pre>
|
| ''');
|
|
|
| - validate('code blocks separated by newlines form one block', '''
|
| + validate(
|
| + 'code blocks separated by newlines form one block',
|
| + '''
|
| zero
|
| one
|
|
|
| two
|
|
|
| three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>zero
|
| one
|
|
|
| @@ -401,7 +515,9 @@ void main() {
|
| three</code></pre>
|
| ''');
|
|
|
| - validate('code blocks separated by two newlines form multiple blocks', '''
|
| + validate(
|
| + 'code blocks separated by two newlines form multiple blocks',
|
| + '''
|
| zero
|
| one
|
|
|
| @@ -410,73 +526,95 @@ void main() {
|
|
|
|
|
| three
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>zero
|
| one</code></pre>
|
| <pre><code>two</code></pre>
|
| <pre><code>three</code></pre>
|
| ''');
|
|
|
| - validate('escape HTML characters', '''
|
| + validate(
|
| + 'escape HTML characters',
|
| + '''
|
| <&>
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code><&></code></pre>
|
| ''');
|
| });
|
|
|
| group('Fenced code blocks', () {
|
| - validate('without an optional language identifier', '''
|
| + validate(
|
| + 'without an optional language identifier',
|
| + '''
|
| ```
|
| code
|
| ```
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>code
|
| </code></pre>
|
| ''');
|
|
|
| - validate('with an optional language identifier', '''
|
| + validate(
|
| + 'with an optional language identifier',
|
| + '''
|
| ```dart
|
| code
|
| ```
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre class="dart"><code>code
|
| </code></pre>
|
| ''');
|
|
|
| - validate('escape HTML characters', '''
|
| + validate(
|
| + 'escape HTML characters',
|
| + '''
|
| ```
|
| <&>
|
| ```
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code><&>
|
| </code></pre>
|
| ''');
|
|
|
| - validate('Pandoc style without language identifier', '''
|
| + validate(
|
| + 'Pandoc style without language identifier',
|
| + '''
|
| ~~~~~
|
| code
|
| ~~~~~
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>code
|
| </code></pre>
|
| ''');
|
|
|
| - validate('Pandoc style with language identifier', '''
|
| + validate(
|
| + 'Pandoc style with language identifier',
|
| + '''
|
| ~~~~~dart
|
| code
|
| ~~~~~
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre class="dart"><code>code
|
| </code></pre>
|
| ''');
|
|
|
| - validate('Pandoc style with inner tildes row', '''
|
| + validate(
|
| + 'Pandoc style with inner tildes row',
|
| + '''
|
| ~~~~~
|
| ~~~
|
| code
|
| ~~~
|
| ~~~~~
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <pre><code>~~~
|
| code
|
| ~~~
|
| @@ -485,68 +623,92 @@ void main() {
|
| });
|
|
|
| group('Horizontal rules', () {
|
| - validate('from dashes', '''
|
| + validate(
|
| + 'from dashes',
|
| + '''
|
| ---
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <hr />
|
| ''');
|
|
|
| - validate('from asterisks', '''
|
| + validate(
|
| + 'from asterisks',
|
| + '''
|
| ***
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <hr />
|
| ''');
|
|
|
| - validate('from underscores', '''
|
| + validate(
|
| + 'from underscores',
|
| + '''
|
| ___
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <hr />
|
| ''');
|
|
|
| - validate('can include up to two spaces', '''
|
| + validate(
|
| + 'can include up to two spaces',
|
| + '''
|
| _ _ _
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <hr />
|
| ''');
|
| });
|
|
|
| group('Block-level HTML', () {
|
| - validate('single line', '''
|
| + validate(
|
| + 'single line',
|
| + '''
|
| <table></table>
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <table></table>
|
| ''');
|
|
|
| - validate('multi-line', '''
|
| + validate(
|
| + 'multi-line',
|
| + '''
|
| <table>
|
| blah
|
| </table>
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <table>
|
| blah
|
| </table>
|
| ''');
|
|
|
| - validate('blank line ends block', '''
|
| + validate(
|
| + 'blank line ends block',
|
| + '''
|
| <table>
|
| blah
|
| </table>
|
|
|
| para
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <table>
|
| blah
|
| </table>
|
| <p>para</p>
|
| ''');
|
|
|
| - validate('HTML can be bogus', '''
|
| + validate(
|
| + 'HTML can be bogus',
|
| + '''
|
| <bogus>
|
| blah
|
| </weird>
|
|
|
| para
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <bogus>
|
| blah
|
| </weird>
|
| @@ -555,319 +717,466 @@ void main() {
|
| });
|
|
|
| group('Strong', () {
|
| - validate('using asterisks', '''
|
| + validate(
|
| + 'using asterisks',
|
| + '''
|
| before **strong** after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <strong>strong</strong> after</p>
|
| ''');
|
|
|
| - validate('using underscores', '''
|
| + validate(
|
| + 'using underscores',
|
| + '''
|
| before __strong__ after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <strong>strong</strong> after</p>
|
| ''');
|
|
|
| - validate('unmatched asterisks', '''
|
| + validate(
|
| + 'unmatched asterisks',
|
| + '''
|
| before ** after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before ** after</p>
|
| ''');
|
|
|
| - validate('unmatched underscores', '''
|
| + validate(
|
| + 'unmatched underscores',
|
| + '''
|
| before __ after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before __ after</p>
|
| ''');
|
|
|
| - validate('multiple spans in one text', '''
|
| + validate(
|
| + 'multiple spans in one text',
|
| + '''
|
| a **one** b __two__ c
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>a <strong>one</strong> b <strong>two</strong> c</p>
|
| ''');
|
|
|
| - validate('multi-line', '''
|
| + validate(
|
| + 'multi-line',
|
| + '''
|
| before **first
|
| second** after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <strong>first
|
| second</strong> after</p>
|
| ''');
|
| });
|
|
|
| group('Emphasis and strong', () {
|
| - validate('single asterisks', '''
|
| + validate(
|
| + 'single asterisks',
|
| + '''
|
| before *em* after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <em>em</em> after</p>
|
| ''');
|
|
|
| - validate('single underscores', '''
|
| + validate(
|
| + 'single underscores',
|
| + '''
|
| before _em_ after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <em>em</em> after</p>
|
| ''');
|
|
|
| - validate('double asterisks', '''
|
| + validate(
|
| + 'double asterisks',
|
| + '''
|
| before **strong** after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <strong>strong</strong> after</p>
|
| ''');
|
|
|
| - validate('double underscores', '''
|
| + validate(
|
| + 'double underscores',
|
| + '''
|
| before __strong__ after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <strong>strong</strong> after</p>
|
| ''');
|
|
|
| - validate('unmatched asterisk', '''
|
| + validate(
|
| + 'unmatched asterisk',
|
| + '''
|
| before *after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before *after</p>
|
| ''');
|
|
|
| - validate('unmatched underscore', '''
|
| + validate(
|
| + 'unmatched underscore',
|
| + '''
|
| before _after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before _after</p>
|
| ''');
|
|
|
| - validate('multiple spans in one text', '''
|
| + validate(
|
| + 'multiple spans in one text',
|
| + '''
|
| a *one* b _two_ c
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>a <em>one</em> b <em>two</em> c</p>
|
| ''');
|
|
|
| - validate('multi-line', '''
|
| + validate(
|
| + 'multi-line',
|
| + '''
|
| before *first
|
| second* after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <em>first
|
| second</em> after</p>
|
| ''');
|
|
|
| - validate('not processed when surrounded by spaces', '''
|
| + validate(
|
| + 'not processed when surrounded by spaces',
|
| + '''
|
| a * b * c _ d _ e
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>a * b * c _ d _ e</p>
|
| ''');
|
|
|
| - validate('strong then emphasis', '''
|
| + validate(
|
| + 'strong then emphasis',
|
| + '''
|
| **strong***em*
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><strong>strong</strong><em>em</em></p>
|
| ''');
|
|
|
| - validate('emphasis then strong', '''
|
| + validate(
|
| + 'emphasis then strong',
|
| + '''
|
| *em***strong**
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><em>em</em><strong>strong</strong></p>
|
| ''');
|
|
|
| - validate('emphasis inside strong', '''
|
| + validate(
|
| + 'emphasis inside strong',
|
| + '''
|
| **strong *em***
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><strong>strong <em>em</em></strong></p>
|
| ''');
|
|
|
| - validate('mismatched in nested', '''
|
| + validate(
|
| + 'mismatched in nested',
|
| + '''
|
| *a _b* c_
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><em>a _b</em> c_</p>
|
| ''');
|
|
|
| - validate('cannot nest tags of same type', '''
|
| + validate(
|
| + 'cannot nest tags of same type',
|
| + '''
|
| *a _b *c* d_ e*
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><em>a _b </em>c<em> d_ e</em></p>
|
| ''');
|
| });
|
|
|
| group('Inline code', () {
|
| - validate('simple case', '''
|
| + validate(
|
| + 'simple case',
|
| + '''
|
| before `source` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>source</code> after</p>
|
| ''');
|
|
|
| - validate('unmatched backtick', '''
|
| + validate(
|
| + 'unmatched backtick',
|
| + '''
|
| before ` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before ` after</p>
|
| ''');
|
| - validate('multiple spans in one text', '''
|
| + validate(
|
| + 'multiple spans in one text',
|
| + '''
|
| a `one` b `two` c
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>a <code>one</code> b <code>two</code> c</p>
|
| ''');
|
|
|
| - validate('multi-line', '''
|
| + validate(
|
| + 'multi-line',
|
| + '''
|
| before `first
|
| second` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>first
|
| second</code> after</p>
|
| ''');
|
|
|
| - validate('simple double backticks', '''
|
| + validate(
|
| + 'simple double backticks',
|
| + '''
|
| before ``source`` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>source</code> after</p>
|
| ''');
|
|
|
| - validate('double backticks', '''
|
| + validate(
|
| + 'double backticks',
|
| + '''
|
| before ``can `contain` backticks`` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>can `contain` backticks</code> after</p>
|
| ''');
|
|
|
| - validate('double backticks with spaces', '''
|
| + validate(
|
| + 'double backticks with spaces',
|
| + '''
|
| before `` `tick` `` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>`tick`</code> after</p>
|
| ''');
|
|
|
| - validate('multiline double backticks with spaces', '''
|
| + validate(
|
| + 'multiline double backticks with spaces',
|
| + '''
|
| before ``in `tick`
|
| another`` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>in `tick`
|
| another</code> after</p>
|
| ''');
|
|
|
| - validate('ignore markup inside code', '''
|
| + validate(
|
| + 'ignore markup inside code',
|
| + '''
|
| before `*b* _c_` after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <code>*b* _c_</code> after</p>
|
| ''');
|
|
|
| - validate('escape HTML characters', '''
|
| + validate(
|
| + 'escape HTML characters',
|
| + '''
|
| `<&>`
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><code><&></code></p>
|
| ''');
|
|
|
| - validate('escape HTML tags', '''
|
| + validate(
|
| + 'escape HTML tags',
|
| + '''
|
| '*' `<em>`
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>'*' <code><em></code></p>
|
| ''');
|
| });
|
|
|
| group('HTML encoding', () {
|
| - validate('less than and ampersand are escaped', '''
|
| + validate(
|
| + 'less than and ampersand are escaped',
|
| + '''
|
| < &
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>< &</p>
|
| ''');
|
| - validate('greater than is not escaped', '''
|
| + validate(
|
| + 'greater than is not escaped',
|
| + '''
|
| not you >
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>not you ></p>
|
| ''');
|
| - validate('existing entities are untouched', '''
|
| + validate(
|
| + 'existing entities are untouched',
|
| + '''
|
| &
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>&</p>
|
| ''');
|
| });
|
|
|
| group('Autolinks', () {
|
| - validate('basic link', '''
|
| + validate(
|
| + 'basic link',
|
| + '''
|
| before <http://foo.com/> after
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>before <a href="http://foo.com/">http://foo.com/</a> after</p>
|
| ''');
|
| - validate('handles ampersand in url', '''
|
| + validate(
|
| + 'handles ampersand in url',
|
| + '''
|
| <http://foo.com/?a=1&b=2>
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p><a href="http://foo.com/?a=1&b=2">http://foo.com/?a=1&b=2</a></p>
|
| ''');
|
| });
|
|
|
| group('Reference links', () {
|
| - validate('double quotes for title', '''
|
| + validate(
|
| + 'double quotes for title',
|
| + '''
|
| links [are] [a] awesome
|
|
|
| [a]: http://foo.com "woo"
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com" title="woo">are</a> awesome</p>
|
| ''');
|
| - validate('single quoted title', """
|
| + validate(
|
| + 'single quoted title',
|
| + """
|
| links [are] [a] awesome
|
|
|
| [a]: http://foo.com 'woo'
|
| - """, '''
|
| + """,
|
| + '''
|
| <p>links <a href="http://foo.com" title="woo">are</a> awesome</p>
|
| ''');
|
| - validate('parentheses for title', '''
|
| + validate(
|
| + 'parentheses for title',
|
| + '''
|
| links [are] [a] awesome
|
|
|
| [a]: http://foo.com (woo)
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com" title="woo">are</a> awesome</p>
|
| ''');
|
| - validate('no title', '''
|
| + validate(
|
| + 'no title',
|
| + '''
|
| links [are] [a] awesome
|
|
|
| [a]: http://foo.com
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com">are</a> awesome</p>
|
| ''');
|
| - validate('unknown link becomes plaintext', '''
|
| + validate(
|
| + 'unknown link becomes plaintext',
|
| + '''
|
| [not] [known]
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>[not] [known]</p>
|
| ''');
|
| - validate('can style link contents', '''
|
| + validate(
|
| + 'can style link contents',
|
| + '''
|
| links [*are*] [a] awesome
|
|
|
| [a]: http://foo.com
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com"><em>are</em></a> awesome</p>
|
| ''');
|
| - validate('inline styles after a bad link are processed', '''
|
| + validate(
|
| + 'inline styles after a bad link are processed',
|
| + '''
|
| [bad] `code`
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>[bad] <code>code</code></p>
|
| ''');
|
| - validate('empty reference uses text from link', '''
|
| + validate(
|
| + 'empty reference uses text from link',
|
| + '''
|
| links [are][] awesome
|
|
|
| [are]: http://foo.com
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com">are</a> awesome</p>
|
| ''');
|
| - validate('references are case-insensitive', '''
|
| + validate(
|
| + 'references are case-insensitive',
|
| + '''
|
| links [ARE][] awesome
|
|
|
| [are]: http://foo.com
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com">ARE</a> awesome</p>
|
| ''');
|
| });
|
|
|
| group('Inline links', () {
|
| - validate('double quotes for title', '''
|
| + validate(
|
| + 'double quotes for title',
|
| + '''
|
| links [are](http://foo.com "woo") awesome
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com" title="woo">are</a> awesome</p>
|
| ''');
|
| - validate('no title', '''
|
| + validate(
|
| + 'no title',
|
| + '''
|
| links [are] (http://foo.com) awesome
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com">are</a> awesome</p>
|
| ''');
|
| - validate('can style link contents', '''
|
| + validate(
|
| + 'can style link contents',
|
| + '''
|
| links [*are*](http://foo.com) awesome
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>links <a href="http://foo.com"><em>are</em></a> awesome</p>
|
| ''');
|
| });
|
|
|
| group('Inline Images', () {
|
| - validate('image', '''
|
| + validate(
|
| + 'image',
|
| + '''
|
| 
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png">
|
| <img src="http://foo.com/foo.png"></img>
|
| @@ -875,9 +1184,12 @@ void main() {
|
| </p>
|
| ''');
|
|
|
| - validate('alternate text', '''
|
| + validate(
|
| + 'alternate text',
|
| + '''
|
| 
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png">
|
| <img alt="alternate text" src="http://foo.com/foo.png"></img>
|
| @@ -885,18 +1197,24 @@ void main() {
|
| </p>
|
| ''');
|
|
|
| - validate('title', '''
|
| + validate(
|
| + 'title',
|
| + '''
|
| 
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png" title="optional title">
|
| <img src="http://foo.com/foo.png" title="optional title"></img>
|
| </a>
|
| </p>
|
| ''');
|
| - validate('invalid alt text', '''
|
| + validate(
|
| + 'invalid alt text',
|
| + '''
|
| 
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png">
|
| <img src="http://foo.com/foo.png"></img>
|
| @@ -906,10 +1224,13 @@ void main() {
|
| });
|
|
|
| group('Reference Images', () {
|
| - validate('image', '''
|
| + validate(
|
| + 'image',
|
| + '''
|
| ![][foo]
|
| [foo]: http://foo.com/foo.png
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png">
|
| <img src="http://foo.com/foo.png"></img>
|
| @@ -917,10 +1238,13 @@ void main() {
|
| </p>
|
| ''');
|
|
|
| - validate('alternate text', '''
|
| + validate(
|
| + 'alternate text',
|
| + '''
|
| ![alternate text][foo]
|
| [foo]: http://foo.com/foo.png
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png">
|
| <img alt="alternate text" src="http://foo.com/foo.png"></img>
|
| @@ -928,10 +1252,13 @@ void main() {
|
| </p>
|
| ''');
|
|
|
| - validate('title', '''
|
| + validate(
|
| + 'title',
|
| + '''
|
| ![][foo]
|
| [foo]: http://foo.com/foo.png "optional title"
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png" title="optional title">
|
| <img src="http://foo.com/foo.png" title="optional title"></img>
|
| @@ -939,10 +1266,13 @@ void main() {
|
| </p>
|
| ''');
|
|
|
| - validate('invalid alt text', '''
|
| + validate(
|
| + 'invalid alt text',
|
| + '''
|
| ![`alt`][foo]
|
| [foo]: http://foo.com/foo.png "optional title"
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>
|
| <a href="http://foo.com/foo.png" title="optional title">
|
| <img src="http://foo.com/foo.png" title="optional title"></img>
|
| @@ -954,37 +1284,53 @@ void main() {
|
| group('Resolver', () {
|
| nyanResolver(text) => new Text('~=[,,_${text}_,,]:3');
|
|
|
| - validate('simple link resolver', '''
|
| + validate(
|
| + 'simple link resolver',
|
| + '''
|
| resolve [this] thing
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>resolve ~=[,,_this_,,]:3 thing</p>
|
| - ''', linkResolver: nyanResolver);
|
| - validate('simple image resolver', '''
|
| + ''',
|
| + linkResolver: nyanResolver);
|
| + validate(
|
| + 'simple image resolver',
|
| + '''
|
| resolve ![this] thing
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>resolve ~=[,,_this_,,]:3 thing</p>
|
| - ''', imageLinkResolver: nyanResolver);
|
| + ''',
|
| + imageLinkResolver: nyanResolver);
|
|
|
| - validate('can resolve link containing inline tags', '''
|
| + validate(
|
| + 'can resolve link containing inline tags',
|
| + '''
|
| resolve [*star* _underline_] thing
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>resolve ~=[,,_*star* _underline__,,]:3 thing</p>
|
| - ''', linkResolver: nyanResolver);
|
| + ''',
|
| + linkResolver: nyanResolver);
|
| });
|
|
|
| group('Custom inline syntax', () {
|
| var nyanSyntax = [new TextSyntax('nyan', sub: '~=[,,_,,]:3')];
|
|
|
| - validate('simple inline syntax', '''
|
| + validate(
|
| + 'simple inline syntax',
|
| + '''
|
| nyan
|
| - ''', '''
|
| + ''',
|
| + '''
|
| <p>~=[,,_,,]:3</p>
|
| - ''', inlineSyntaxes: nyanSyntax);
|
| + ''',
|
| + inlineSyntaxes: nyanSyntax);
|
|
|
| validate('dart custom links', 'links [are<foo>] awesome',
|
| '<p>links <a>are<foo></a> awesome</p>',
|
| - linkResolver: (text) => new Element.text(
|
| - 'a', text.replaceAll('<', '<')));
|
| + linkResolver: (text) =>
|
| + new Element.text('a', text.replaceAll('<', '<')));
|
|
|
| // TODO(amouravski): need more tests here for custom syntaxes, as some
|
| // things are not quite working properly. The regexps are sometime a little
|
| @@ -992,42 +1338,70 @@ void main() {
|
| });
|
|
|
| group('Inline only', () {
|
| - validate('simple line', '''
|
| + validate(
|
| + 'simple line',
|
| + '''
|
| This would normally create a paragraph.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| This would normally create a paragraph.
|
| - ''', inlineOnly: true);
|
| - validate('strong and em', '''
|
| + ''',
|
| + inlineOnly: true);
|
| + validate(
|
| + 'strong and em',
|
| + '''
|
| This would _normally_ create a **paragraph**.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| This would <em>normally</em> create a <strong>paragraph</strong>.
|
| - ''', inlineOnly: true);
|
| - validate('link', '''
|
| + ''',
|
| + inlineOnly: true);
|
| + validate(
|
| + 'link',
|
| + '''
|
| This [link](http://www.example.com/) will work normally.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| This <a href="http://www.example.com/">link</a> will work normally.
|
| - ''', inlineOnly: true);
|
| - validate('references do not work', '''
|
| + ''',
|
| + inlineOnly: true);
|
| + validate(
|
| + 'references do not work',
|
| + '''
|
| [This][] shouldn't work, though.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| [This][] shouldn't work, though.
|
| - ''', inlineOnly: true);
|
| - validate('less than and ampersand are escaped', '''
|
| + ''',
|
| + inlineOnly: true);
|
| + validate(
|
| + 'less than and ampersand are escaped',
|
| + '''
|
| < &
|
| - ''', '''
|
| + ''',
|
| + '''
|
| < &
|
| - ''', inlineOnly: true);
|
| - validate('keeps newlines', '''
|
| + ''',
|
| + inlineOnly: true);
|
| + validate(
|
| + 'keeps newlines',
|
| + '''
|
| This paragraph
|
| continues after a newline.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| This paragraph
|
| continues after a newline.
|
| - ''', inlineOnly: true);
|
| - validate('ignores block-level markdown syntax', '''
|
| + ''',
|
| + inlineOnly: true);
|
| + validate(
|
| + 'ignores block-level markdown syntax',
|
| + '''
|
| 1. This will not be an <ol>.
|
| - ''', '''
|
| + ''',
|
| + '''
|
| 1. This will not be an <ol>.
|
| - ''', inlineOnly: true);
|
| + ''',
|
| + inlineOnly: true);
|
| });
|
| }
|
|
|