anchor.diff:  import 'package:flutter/material.dart';
   
   void main() {
  -  test("Simple string", () {
  -    testWidgets((WidgetTester tester) {
  -      tester.pumpWidget(new MarkdownBody(data: "Hello"));
  +  testWidgets('Simple string', (WidgetTester tester) {
  +      tester.pumpWidget(new MarkdownBody(data: 'Hello'));
   
  -      Iterable<Widget> widgets = tester.widgets;
  +      Iterable<Widget> widgets = tester.allWidgets;
         _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column, Container, Padding, RichText]);
  -      _expectTextStrings(widgets, <String>["Hello"]);
  -    });
  +      _expectTextStrings(widgets, <String>['Hello']);
     });
   
  -  test("Header", () {
  -    testWidgets((WidgetTester tester) {
  -      tester.pumpWidget(new MarkdownBody(data: "# Header"));
  +  testWidgets('Header', (WidgetTester tester) {
  +      tester.pumpWidget(new MarkdownBody(data: '# Header'));
   
  -      Iterable<Widget> widgets = tester.widgets;
  +      Iterable<Widget> widgets = tester.allWidgets;
         _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column, Container, Padding, RichText]);
  -      _expectTextStrings(widgets, <String>["Header"]);
  -    });
  +      _expectTextStrings(widgets, <String>['Header']);
     });
   
  -  test("Empty string", () {
  -    testWidgets((WidgetTester tester) {
  -      tester.pumpWidget(new MarkdownBody(data: ""));
  +  testWidgets('Empty string', (WidgetTester tester) {
  +      tester.pumpWidget(new MarkdownBody(data: ''));
   
  -      Iterable<Widget> widgets = tester.widgets;
  +      Iterable<Widget> widgets = tester.allWidgets;
         _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column]);
  -    });
     });
   
  -  test("Ordered list", () {
  -    testWidgets((WidgetTester tester) {
  -      tester.pumpWidget(new MarkdownBody(data: "1. Item 1\n1. Item 2\n2. Item 3"));
  +  testWidgets('Ordered list', (WidgetTester tester) {
  +      tester.pumpWidget(new MarkdownBody(data: '1. Item 1\n1. Item 2\n2. Item 3'));
   
  -      Iterable<Widget> widgets = tester.widgets;
  +      Iterable<Widget> widgets = tester.allWidgets;
         _expectTextStrings(widgets, <String>[
  -        "1.",
  -        "Item 1",
  -        "2.",
  -        "Item 2",
  -        "3.",
  -        "Item 3"]
  +        '1.',
  +        'Item 1',
  +        '2.',
  +        'Item 2',
  +        '3.',
  +        'Item 3']
         );
  -    });
     });
   
  -  test("Unordered list", () {
  -    testWidgets((WidgetTester tester) {
  -      tester.pumpWidget(new MarkdownBody(data: "- Item 1\n- Item 2\n- Item 3"));
  +  testWidgets('Unordered list', (WidgetTester tester) {
  +      tester.pumpWidget(new MarkdownBody(data: '- Item 1\n- Item 2\n- Item 3'));
   
  -      Iterable<Widget> widgets = tester.widgets;
  +      Iterable<Widget> widgets = tester.allWidgets;
         _expectTextStrings(widgets, <String>[
  -        "•",
  -        "Item 1",
  -        "•",
  -        "Item 2",
  -        "•",
  -        "Item 3"]
  +        '•',
  +        'Item 1',
  +        '•',
  +        'Item 2',
  +        '•',
  +        'Item 3']
         );
  -    });
     });
   
  -  test("Scrollable wrapping", () {
  -    testWidgets((WidgetTester tester) {
  -      tester.pumpWidget(new Markdown(data: ""));
  +  testWidgets('Scrollable wrapping', (WidgetTester tester) {
  +      tester.pumpWidget(new Markdown(data: ''));
   
  -      List<Widget> widgets = tester.widgets.toList();
  +      List<Widget> widgets = tester.allWidgets.toList();
         _expectWidgetTypes(widgets.take(2), <Type>[
           Markdown,
           ScrollableViewport,
  
positive.code:         MarkdownBody,
          Column
        ]);
      });
    });
  
    test("Links", () {
      testWidgets((WidgetTester tester) {
        tester.pumpWidget(new Markdown(data: "[Link Text](href)"));
  
        RichText textWidget = tester.widgets.firstWhere((Widget widget) => widget is RichText);
        TextSpan span = textWidget.text;
  
        expect(span.children[0].recognizer.runtimeType, equals(TapGestureRecognizer));
      });
    });
  
    test("Changing config - data", () {
      testWidgets((WidgetTester tester) {
        tester.pumpWidget(new Markdown(data: "Data1"));
        _expectTextStrings(tester.widgets, <String>["Data1"]);
  
        String stateBefore = WidgetsBinding.instance.renderViewElement.toStringDeep();
        tester.pumpWidget(new Markdown(data: "Data1"));
        String stateAfter = WidgetsBinding.instance.renderViewElement.toStringDeep();
        expect(stateBefore, equals(stateAfter));
  
        tester.pumpWidget(new Markdown(data: "Data2"));
        _expectTextStrings(tester.widgets, <String>["Data2"]);
      });
    });
  
    test("Changing config - style", () {
      testWidgets((WidgetTester tester) {
        ThemeData theme = new ThemeData.light();
  
        MarkdownStyle style1 = new MarkdownStyle.defaultFromTheme(theme);
        MarkdownStyle style2 = new MarkdownStyle.largeFromTheme(theme);
  
        tester.pumpWidget(new Markdown(data: "Test", markdownStyle: style1));
  
        String stateBefore = WidgetsBinding.instance.renderViewElement.toStringDeep();
        tester.pumpWidget(new Markdown(data: "Test", markdownStyle: style2));
        String stateAfter = WidgetsBinding.instance.renderViewElement.toStringDeep();
        expect(stateBefore, isNot(stateAfter));
      });
    });
  }
  
  
negative.code: }
  
  String _extractTextFromTextSpan(TextSpan span) {
    String text = span.text ?? '';
    if (span.children != null) {
      for (TextSpan child in span.children) {
        text += _extractTextFromTextSpan(child);
  