anchor.diff:          ''');
     });
   
  +  group('Fenced code blocks', () {
  +    validate('without an optional language identifier', '''
  +        ```
  +        code
  +        ```
  +        ''', '''
  +        <pre><code>code
  +        </code></pre>
  +        ''');
  +
  +    validate('with an optional language identifier', '''
  +        ```dart
  +        code
  +        ```
  +        ''', '''
  +        <pre><code>code
  +        </code></pre>
  +        ''');
  +
  +    validate('escape HTML characters', '''
  +        ```
  +        <&>
  +        ```
  +        ''', '''
  +        <pre><code>&lt;&amp;&gt;
  +        </code></pre>
  +        ''');
  +  });
  +
     group('Horizontal rules', () {
       validate('from dashes', '''
           ---
  
positive.code:     }
    }
  
    return Strings.join(lines, '\n');
  }
  
  validate(String description, String markdown, String html,
           {bool verbose: false}) {
    test(description, () {
      markdown = cleanUpLiteral(markdown);
      html = cleanUpLiteral(html);
  
      var result = markdownToHtml(markdown);
      var passed = compareOutput(html, result);
  
      if (!passed) {
  
negative.code: /// Unit tests for markdown.
  library markdownTests;
  
  import 'package:unittest/unittest.dart';
  
  // TODO(rnystrom): Use "package:" URL (#4968).
  import '../lib/markdown.dart';
  
  /// Most of these tests are based on observing how showdown behaves:
  /// http://softwaremaniacs.org/playground/showdown-highlight/
  