blob: 3e30697ee7d29e0a7dce9b70ff5d66eb50b00f27 [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:markdown/markdown.dart';
import 'package:markdown/src/util.dart';
import 'package:test/test.dart';
void main() {
group('Document', () {
test('encodeHtml prevents less than and ampersand escaping', () {
final document = Document(encodeHtml: false);
final result = document.parseInline('< &');
expect(result, hasLength(1));
expect(
result[0],
const TypeMatcher<Text>().having((e) => e.text, 'text', equals('< &')),
);
});
group('with encodeHtml enabled', () {
final document = Document();
test('encodes HTML in an inline code snippet', () {
final result =
document.parseInline('``<p>Hello <em>Markdown</em></p>``');
final codeSnippet = result.single as Element;
expect(
codeSnippet.textContent,
equals('&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;'),
);
});
test('encodes HTML in a fenced code block', () {
final lines = '```\n<p>Hello <em>Markdown</em></p>\n```\n'.toLines();
final result = document.parseLineList(lines);
final codeBlock = result.single as Element;
expect(
codeBlock.textContent,
equals('&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;\n'),
);
});
test('encodes HTML in an indented code block', () {
final lines = ' <p>Hello <em>Markdown</em></p>\n'.toLines();
final result = document.parseLineList(lines);
final codeBlock = result.single as Element;
expect(
codeBlock.textContent,
equals('&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;\n'),
);
});
test('encodeHtml spaces are preserved in text', () {
// Example to get a <p> tag rendered before a text node.
const contents = 'Sample\n\n<pre>\n A\n B\n</pre>';
final document = Document();
final nodes = BlockParser(contents.toLines(), document).parseLines();
final result = HtmlRenderer().render(nodes);
expect(result, '<p>\n</p>\n<pre>\n A\n B\n</pre>');
});
test('encode double quotes, greater than, and less than when escaped',
() {
const contents = r'\>\"\< Hello';
final document = Document();
final nodes = document.parseInline(contents);
expect(nodes, hasLength(1));
expect(
nodes.single,
const TypeMatcher<Text>().having(
(e) => e.text,
'text',
'&gt;&quot;&lt; Hello',
),
);
});
});
group('with encodeHtml disabled', () {
final document = Document(encodeHtml: false);
test('leaves HTML alone, in a code snippet', () {
final result =
document.parseInline('```<p>Hello <em>Markdown</em></p>```');
final codeSnippet = result.single as Element;
expect(
codeSnippet.textContent,
equals('<p>Hello <em>Markdown</em></p>'),
);
});
test('leaves HTML alone, in a fenced code block', () {
final lines = '```\n<p>Hello <em>Markdown</em></p>\n```\n'.toLines();
final result = document.parseLineList(lines);
final codeBlock = result.single as Element;
expect(
codeBlock.textContent,
equals('<p>Hello <em>Markdown</em></p>\n'),
);
});
test('leaves HTML alone, in an indented code block', () {
final lines = ' <p>Hello <em>Markdown</em></p>\n'.toLines();
final result = document.parseLineList(lines);
final codeBlock = result.single as Element;
expect(
codeBlock.textContent,
equals('<p>Hello <em>Markdown</em></p>\n'),
);
});
test('leave double quotes, greater than, and less than when escaped', () {
const contents = r'\>\"\< Hello';
final document = Document(encodeHtml: false);
final nodes = document.parseInline(contents);
expect(nodes, hasLength(1));
expect(
nodes.single,
const TypeMatcher<Text>().having((e) => e.text, 'text', '>"< Hello'),
);
});
});
});
}