flutter_markdown_test.dart 4.59 KB
Newer Older
1 2 3 4
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_test/flutter_test.dart';
7
import 'package:flutter/gestures.dart';
8 9 10 11
import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';

void main() {
12 13
  testWidgets('Simple string', (WidgetTester tester) {
      tester.pumpWidget(new MarkdownBody(data: 'Hello'));
14

15
      Iterable<Widget> widgets = tester.allWidgets;
16
      _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column, Container, Padding, RichText]);
17
      _expectTextStrings(widgets, <String>['Hello']);
18 19
  });

20 21
  testWidgets('Header', (WidgetTester tester) {
      tester.pumpWidget(new MarkdownBody(data: '# Header'));
22

23
      Iterable<Widget> widgets = tester.allWidgets;
24
      _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column, Container, Padding, RichText]);
25
      _expectTextStrings(widgets, <String>['Header']);
26 27
  });

28 29
  testWidgets('Empty string', (WidgetTester tester) {
      tester.pumpWidget(new MarkdownBody(data: ''));
30

31
      Iterable<Widget> widgets = tester.allWidgets;
32
      _expectWidgetTypes(widgets, <Type>[MarkdownBody, Column]);
33 34
  });

35 36
  testWidgets('Ordered list', (WidgetTester tester) {
      tester.pumpWidget(new MarkdownBody(data: '1. Item 1\n1. Item 2\n2. Item 3'));
37

38
      Iterable<Widget> widgets = tester.allWidgets;
39
      _expectTextStrings(widgets, <String>[
40 41 42 43 44 45
        '1.',
        'Item 1',
        '2.',
        'Item 2',
        '3.',
        'Item 3']
46 47 48
      );
  });

49 50
  testWidgets('Unordered list', (WidgetTester tester) {
      tester.pumpWidget(new MarkdownBody(data: '- Item 1\n- Item 2\n- Item 3'));
51

52
      Iterable<Widget> widgets = tester.allWidgets;
53
      _expectTextStrings(widgets, <String>[
54 55 56 57 58 59
        '•',
        'Item 1',
        '•',
        'Item 2',
        '•',
        'Item 3']
60 61 62
      );
  });

63 64
  testWidgets('Scrollable wrapping', (WidgetTester tester) {
      tester.pumpWidget(new Markdown(data: ''));
65

66
      List<Widget> widgets = tester.allWidgets.toList();
67
      _expectWidgetTypes(widgets.take(2), <Type>[
68 69
        Markdown,
        ScrollableViewport,
70 71
      ]);
      _expectWidgetTypes(widgets.reversed.take(3).toList().reversed, <Type>[
72 73 74 75 76
        Padding,
        MarkdownBody,
        Column
      ]);
  });
77

78 79
  testWidgets('Links', (WidgetTester tester) {
      tester.pumpWidget(new Markdown(data: '[Link Text](href)'));
80

81
      RichText textWidget = tester.allWidgets.firstWhere((Widget widget) => widget is RichText);
82 83 84 85
      TextSpan span = textWidget.text;

      expect(span.children[0].recognizer.runtimeType, equals(TapGestureRecognizer));
  });
86

87 88 89
  testWidgets('Changing config - data', (WidgetTester tester) {
      tester.pumpWidget(new Markdown(data: 'Data1'));
      _expectTextStrings(tester.allWidgets, <String>['Data1']);
90

91
      String stateBefore = WidgetsBinding.instance.renderViewElement.toStringDeep();
92
      tester.pumpWidget(new Markdown(data: 'Data1'));
93
      String stateAfter = WidgetsBinding.instance.renderViewElement.toStringDeep();
94 95
      expect(stateBefore, equals(stateAfter));

96 97
      tester.pumpWidget(new Markdown(data: 'Data2'));
      _expectTextStrings(tester.allWidgets, <String>['Data2']);
98 99
  });

100
  testWidgets('Changing config - style', (WidgetTester tester) {
101 102 103 104 105
      ThemeData theme = new ThemeData.light();

      MarkdownStyle style1 = new MarkdownStyle.defaultFromTheme(theme);
      MarkdownStyle style2 = new MarkdownStyle.largeFromTheme(theme);

106
      tester.pumpWidget(new Markdown(data: 'Test', markdownStyle: style1));
107

108
      String stateBefore = WidgetsBinding.instance.renderViewElement.toStringDeep();
109
      tester.pumpWidget(new Markdown(data: 'Test', markdownStyle: style2));
110
      String stateAfter = WidgetsBinding.instance.renderViewElement.toStringDeep();
111 112
      expect(stateBefore, isNot(stateAfter));
  });
113 114
}

115 116 117
void _expectWidgetTypes(Iterable<Widget> widgets, List<Type> expected) {
  List<Type> actual = widgets.map((Widget w) => w.runtimeType).toList();
  expect(actual, expected);
118 119
}

120
void _expectTextStrings(Iterable<Widget> widgets, List<String> strings) {
121
  int currentString = 0;
122
  for (Widget widget in widgets) {
123 124 125 126 127 128 129 130 131 132
    if (widget is RichText) {
      TextSpan span = widget.text;
      String text = _extractTextFromTextSpan(span);
      expect(text, equals(strings[currentString]));
      currentString += 1;
    }
  }
}

String _extractTextFromTextSpan(TextSpan span) {
133
  String text = span.text ?? '';
134 135 136 137 138 139 140
  if (span.children != null) {
    for (TextSpan child in span.children) {
      text += _extractTextFromTextSpan(child);
    }
  }
  return text;
}