// 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:test/test.dart';

void main() {
  group('Document', () {
    test('encodeHtml prevents less than and ampersand escaping', () {
      var document = Document(encodeHtml: false);
      var result = document.parseInline('< &');
      expect(result, hasLength(1));
      expect(
          result[0],
          const TypeMatcher<Text>()
              .having((e) => e.text, 'text', equals('< &')));
    });

    group('with encodeHtml enabled', () {
      var document = Document(encodeHtml: true);

      test('encodes HTML in an inline code snippet', () {
        var result = document.parseInline("``<p>Hello <em>Markdown</em></p>``");
        var 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', () {
        var lines = "```\n<p>Hello <em>Markdown</em></p>\n```\n".split('\n');
        var result = document.parseLines(lines);
        var 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', () {
        var lines = "    <p>Hello <em>Markdown</em></p>\n".split('\n');
        var result = document.parseLines(lines);
        var codeBlock = result.single as Element;
        expect(codeBlock.textContent,
            equals("&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;\n"));
      });
    });

    group('with encodeHtml disabled', () {
      var document = Document(encodeHtml: false);

      test('leaves HTML alone, in a code snippet', () {
        var result =
            document.parseInline("```<p>Hello <em>Markdown</em></p>```");
        var codeSnippet = result.single as Element;
        expect(
            codeSnippet.textContent, equals("<p>Hello <em>Markdown</em></p>"));
      });

      test('leaves HTML alone, in a fenced code block', () {
        var lines = "```\n<p>Hello <em>Markdown</em></p>\n```\n".split('\n');
        var result = document.parseLines(lines);
        var 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', () {
        var lines = "    <p>Hello <em>Markdown</em></p>\n".split('\n');
        var result = document.parseLines(lines);
        var codeBlock = result.single as Element;
        expect(
            codeBlock.textContent, equals("<p>Hello <em>Markdown</em></p>\n"));
      });
    });
  });
}
