blob: 68976a3b865919ffc76df3240714e88f7cfc9c73 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. 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:flutter/widgets.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_test/flutter_test.dart';
import 'utils.dart';
void main() => defineTests();
void defineTests() {
group('Hard Line Breaks', () {
testWidgets(
// Example 654 from GFM.
'two spaces at end of line',
(WidgetTester tester) async {
const String data = 'foo \nbar';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
},
);
testWidgets(
// Example 655 from GFM.
'backslash at end of line',
(WidgetTester tester) async {
const String data = 'foo\\\nbar';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
},
);
testWidgets(
// Example 656 from GFM.
'more than two spaces at end of line',
(WidgetTester tester) async {
const String data = 'foo \nbar';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
},
);
testWidgets(
// Example 657 from GFM.
'leading spaces at beginning of next line are ignored',
(WidgetTester tester) async {
const String data = 'foo \n bar';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
},
);
testWidgets(
// Example 658 from GFM.
'leading spaces at beginning of next line are ignored',
(WidgetTester tester) async {
const String data = 'foo\\\n bar';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
},
);
testWidgets(
// Example 659 from GFM.
'two spaces line break inside emphasis',
(WidgetTester tester) async {
const String data = '*foo \nbar*';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
// There should be three spans of text.
final TextSpan textSpan = richText.text as TextSpan;
expect(textSpan, isNotNull);
expect(textSpan.children!.length == 3, isTrue);
// First text span has italic style with normal weight.
final InlineSpan firstSpan = textSpan.children![0];
expectTextSpanStyle(
firstSpan as TextSpan, FontStyle.italic, FontWeight.normal);
// Second span is just the newline character with no font style or weight.
// Third text span has italic style with normal weight.
final InlineSpan thirdSpan = textSpan.children![2];
expectTextSpanStyle(
thirdSpan as TextSpan, FontStyle.italic, FontWeight.normal);
},
);
testWidgets(
// Example 660 from GFM.
'backslash line break inside emphasis',
(WidgetTester tester) async {
const String data = '*foo\\\nbar*';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo\nbar');
// There should be three spans of text.
final TextSpan textSpan = richText.text as TextSpan;
expect(textSpan, isNotNull);
expect(textSpan.children!.length == 3, isTrue);
// First text span has italic style with normal weight.
final InlineSpan firstSpan = textSpan.children![0];
expectTextSpanStyle(
firstSpan as TextSpan, FontStyle.italic, FontWeight.normal);
// Second span is just the newline character with no font style or weight.
// Third text span has italic style with normal weight.
final InlineSpan thirdSpan = textSpan.children![2];
expectTextSpanStyle(
thirdSpan as TextSpan, FontStyle.italic, FontWeight.normal);
},
);
testWidgets(
// Example 661 from GFM.
'two space line break does not occur in code span',
(WidgetTester tester) async {
const String data = '`code \nspan`';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'code span');
final TextSpan textSpan = richText.text as TextSpan;
expect(textSpan, isNotNull);
expect(textSpan.style, isNotNull);
expect(textSpan.style!.fontFamily == 'monospace', isTrue);
},
);
testWidgets(
// Example 662 from GFM.
'backslash line break does not occur in code span',
(WidgetTester tester) async {
const String data = '`code\\\nspan`';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, r'code\ span');
final TextSpan textSpan = richText.text as TextSpan;
expect(textSpan, isNotNull);
expect(textSpan.style, isNotNull);
expect(textSpan.style!.fontFamily == 'monospace', isTrue);
},
);
testWidgets(
// Example 665 from GFM.
'backslash at end of paragraph is ignored',
(WidgetTester tester) async {
const String data = r'foo\';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, r'foo\');
},
);
testWidgets(
// Example 666 from GFM.
'two spaces at end of paragraph is ignored',
(WidgetTester tester) async {
const String data = 'foo ';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo');
},
);
testWidgets(
// Example 667 from GFM.
'backslash at end of header is ignored',
(WidgetTester tester) async {
const String data = r'### foo\';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, r'foo\');
},
);
testWidgets(
// Example 668 from GFM.
'two spaces at end of header is ignored',
(WidgetTester tester) async {
const String data = '### foo ';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo');
},
);
});
group('Soft Line Breaks', () {
testWidgets(
// Example 669 from GFM.
'lines of text in paragraph',
(WidgetTester tester) async {
const String data = 'foo\nbaz';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo baz');
},
);
testWidgets(
// Example 670 from GFM.
'spaces at beginning and end of lines of text in paragraph are removed',
(WidgetTester tester) async {
const String data = 'foo \n baz';
await tester.pumpWidget(
boilerplate(
const MarkdownBody(data: data),
),
);
final Finder richTextFinder = find.byType(RichText);
expect(richTextFinder, findsOneWidget);
final RichText richText =
richTextFinder.evaluate().first.widget as RichText;
final String text = richText.text.toPlainText();
expect(text, 'foo baz');
},
);
});
}