357 lines
11 KiB
Dart
357 lines
11 KiB
Dart
// 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_plus/flutter_markdown_plus.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 textFinder = find.byType(Text);
|
|
expect(textFinder, findsOneWidget);
|
|
|
|
final Text textWidget = textFinder.evaluate().first.widget as Text;
|
|
final String text = textWidget.textSpan!.toPlainText();
|
|
expect(text, 'foo\nbar');
|
|
|
|
// There should be three spans of text.
|
|
final TextSpan textSpan = textWidget.textSpan! 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 textFinder = find.byType(Text);
|
|
expect(textFinder, findsOneWidget);
|
|
|
|
final Text textWidget = textFinder.evaluate().first.widget as Text;
|
|
final String text = textWidget.textSpan!.toPlainText();
|
|
expect(text, 'foo\nbar');
|
|
|
|
// There should be three spans of text.
|
|
final TextSpan textSpan = textWidget.textSpan! 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 textFinder = find.byType(Text);
|
|
expect(textFinder, findsOneWidget);
|
|
|
|
final Text textWidget = textFinder.evaluate().first.widget as Text;
|
|
final String text = textWidget.textSpan!.toPlainText();
|
|
expect(text, 'code span');
|
|
|
|
final TextSpan textSpan = textWidget.textSpan! 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 textFinder = find.byType(Text);
|
|
expect(textFinder, findsOneWidget);
|
|
|
|
final Text textWidget = textFinder.evaluate().first.widget as Text;
|
|
final String text = textWidget.textSpan!.toPlainText();
|
|
expect(text, r'code\ span');
|
|
|
|
final TextSpan textSpan = textWidget.textSpan! 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');
|
|
},
|
|
);
|
|
});
|
|
}
|