blob: 0236e439dcdf19b3ef80d3f70b4ed736d36f3e61 [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/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_test/flutter_test.dart';
import 'utils.dart';
void main() => defineTests();
void defineTests() {
group('Style Sheet', () {
testWidgets(
'equality - Cupertino',
(WidgetTester tester) async {
const CupertinoThemeData theme =
CupertinoThemeData(brightness: Brightness.light);
final MarkdownStyleSheet style1 =
MarkdownStyleSheet.fromCupertinoTheme(theme);
final MarkdownStyleSheet style2 =
MarkdownStyleSheet.fromCupertinoTheme(theme);
expect(style1, equals(style2));
expect(style1.hashCode, equals(style2.hashCode));
},
);
testWidgets(
'equality - Material',
(WidgetTester tester) async {
final ThemeData theme =
ThemeData.light().copyWith(textTheme: textTheme);
final MarkdownStyleSheet style1 = MarkdownStyleSheet.fromTheme(theme);
final MarkdownStyleSheet style2 = MarkdownStyleSheet.fromTheme(theme);
expect(style1, equals(style2));
expect(style1.hashCode, equals(style2.hashCode));
},
);
testWidgets(
'MarkdownStyleSheet.fromCupertinoTheme',
(WidgetTester tester) async {
const CupertinoThemeData cTheme = CupertinoThemeData(
brightness: Brightness.dark,
);
final MarkdownStyleSheet style =
MarkdownStyleSheet.fromCupertinoTheme(cTheme);
// a
expect(style.a!.color, CupertinoColors.link.darkColor);
expect(style.a!.fontSize, cTheme.textTheme.textStyle.fontSize);
// p
expect(style.p, cTheme.textTheme.textStyle);
// code
expect(style.code!.color, cTheme.textTheme.textStyle.color);
expect(
style.code!.fontSize, cTheme.textTheme.textStyle.fontSize! * 0.85);
expect(style.code!.fontFamily, 'monospace');
expect(
style.code!.backgroundColor, CupertinoColors.systemGrey6.darkColor);
// H1
expect(style.h1!.color, cTheme.textTheme.textStyle.color);
expect(style.h1!.fontSize, cTheme.textTheme.textStyle.fontSize! + 10);
expect(style.h1!.fontWeight, FontWeight.w500);
// H2
expect(style.h2!.color, cTheme.textTheme.textStyle.color);
expect(style.h2!.fontSize, cTheme.textTheme.textStyle.fontSize! + 8);
expect(style.h2!.fontWeight, FontWeight.w500);
// H3
expect(style.h3!.color, cTheme.textTheme.textStyle.color);
expect(style.h3!.fontSize, cTheme.textTheme.textStyle.fontSize! + 6);
expect(style.h3!.fontWeight, FontWeight.w500);
// H4
expect(style.h4!.color, cTheme.textTheme.textStyle.color);
expect(style.h4!.fontSize, cTheme.textTheme.textStyle.fontSize! + 4);
expect(style.h4!.fontWeight, FontWeight.w500);
// H5
expect(style.h5!.color, cTheme.textTheme.textStyle.color);
expect(style.h5!.fontSize, cTheme.textTheme.textStyle.fontSize! + 2);
expect(style.h5!.fontWeight, FontWeight.w500);
// H6
expect(style.h6!.color, cTheme.textTheme.textStyle.color);
expect(style.h6!.fontSize, cTheme.textTheme.textStyle.fontSize);
expect(style.h6!.fontWeight, FontWeight.w500);
// em
expect(style.em!.color, cTheme.textTheme.textStyle.color);
expect(style.em!.fontSize, cTheme.textTheme.textStyle.fontSize);
expect(style.em!.fontStyle, FontStyle.italic);
// strong
expect(style.strong!.color, cTheme.textTheme.textStyle.color);
expect(style.strong!.fontSize, cTheme.textTheme.textStyle.fontSize);
expect(style.strong!.fontWeight, FontWeight.bold);
// del
expect(style.del!.color, cTheme.textTheme.textStyle.color);
expect(style.del!.fontSize, cTheme.textTheme.textStyle.fontSize);
expect(style.del!.decoration, TextDecoration.lineThrough);
// blockqoute
expect(style.blockquote, cTheme.textTheme.textStyle);
// img
expect(style.img, cTheme.textTheme.textStyle);
// checkbox
expect(style.checkbox!.color, cTheme.primaryColor);
expect(style.checkbox!.fontSize, cTheme.textTheme.textStyle.fontSize);
// tableHead
expect(style.tableHead!.color, cTheme.textTheme.textStyle.color);
expect(style.tableHead!.fontSize, cTheme.textTheme.textStyle.fontSize);
expect(style.tableHead!.fontWeight, FontWeight.w600);
// tableBody
expect(style.tableBody, cTheme.textTheme.textStyle);
},
);
testWidgets(
'MarkdownStyleSheet.fromTheme',
(WidgetTester tester) async {
final ThemeData theme = ThemeData.dark().copyWith(
textTheme: const TextTheme(
bodyMedium: TextStyle(fontSize: 12.0),
),
);
final MarkdownStyleSheet style = MarkdownStyleSheet.fromTheme(theme);
// a
expect(style.a!.color, Colors.blue);
// p
expect(style.p, theme.textTheme.bodyMedium);
// code
expect(style.code!.color, theme.textTheme.bodyMedium!.color);
expect(
style.code!.fontSize, theme.textTheme.bodyMedium!.fontSize! * 0.85);
expect(style.code!.fontFamily, 'monospace');
expect(style.code!.backgroundColor, theme.cardColor);
// H1
expect(style.h1, theme.textTheme.headlineSmall);
// H2
expect(style.h2, theme.textTheme.titleLarge);
// H3
expect(style.h3, theme.textTheme.titleMedium);
// H4
expect(style.h4, theme.textTheme.bodyLarge);
// H5
expect(style.h5, theme.textTheme.bodyLarge);
// H6
expect(style.h6, theme.textTheme.bodyLarge);
// em
expect(style.em!.fontStyle, FontStyle.italic);
expect(style.em!.color, theme.textTheme.bodyMedium!.color);
// strong
expect(style.strong!.fontWeight, FontWeight.bold);
expect(style.strong!.color, theme.textTheme.bodyMedium!.color);
// del
expect(style.del!.decoration, TextDecoration.lineThrough);
expect(style.del!.color, theme.textTheme.bodyMedium!.color);
// blockqoute
expect(style.blockquote, theme.textTheme.bodyMedium);
// img
expect(style.img, theme.textTheme.bodyMedium);
// checkbox
expect(style.checkbox!.color, theme.primaryColor);
expect(style.checkbox!.fontSize, theme.textTheme.bodyMedium!.fontSize);
// tableHead
expect(style.tableHead!.fontWeight, FontWeight.w600);
// tableBody
expect(style.tableBody, theme.textTheme.bodyMedium);
},
);
testWidgets(
'merge 2 style sheets',
(WidgetTester tester) async {
final ThemeData theme =
ThemeData.light().copyWith(textTheme: textTheme);
final MarkdownStyleSheet style1 = MarkdownStyleSheet.fromTheme(theme);
final MarkdownStyleSheet style2 = MarkdownStyleSheet(
p: const TextStyle(color: Colors.red),
blockquote: const TextStyle(fontSize: 16),
);
final MarkdownStyleSheet merged = style1.merge(style2);
expect(merged.p!.color, Colors.red);
expect(merged.blockquote!.fontSize, 16);
expect(merged.blockquote!.color, theme.textTheme.bodyMedium!.color);
},
);
testWidgets(
'create based on which theme',
(WidgetTester tester) async {
const String data = '[title](url)';
await tester.pumpWidget(
boilerplate(
const Markdown(
data: data,
styleSheetTheme: MarkdownStyleSheetBaseTheme.cupertino,
),
),
);
final RichText widget = tester.widget(find.byType(RichText));
expect(widget.text.style!.color, CupertinoColors.link.color);
},
);
testWidgets(
'apply 2 distinct style sheets',
(WidgetTester tester) async {
final ThemeData theme =
ThemeData.light().copyWith(textTheme: textTheme);
final MarkdownStyleSheet style1 = MarkdownStyleSheet.fromTheme(theme);
final MarkdownStyleSheet style2 =
MarkdownStyleSheet.largeFromTheme(theme);
expect(style1, isNot(style2));
await tester.pumpWidget(
boilerplate(
Markdown(
data: '# Test',
styleSheet: style1,
),
),
);
final RichText text1 = tester.widget(find.byType(RichText));
await tester.pumpWidget(
boilerplate(
Markdown(
data: '# Test',
styleSheet: style2,
),
),
);
final RichText text2 = tester.widget(find.byType(RichText));
expect(text1.text, isNot(text2.text));
},
);
testWidgets(
'use stylesheet option listBulletPadding',
(WidgetTester tester) async {
const double paddingX = 20.0;
final MarkdownStyleSheet style = MarkdownStyleSheet(
listBulletPadding:
const EdgeInsets.symmetric(horizontal: paddingX));
await tester.pumpWidget(
boilerplate(
Markdown(
data: '1. Bullet\n 2. Bullet\n * Bullet',
styleSheet: style,
),
),
);
final List<Padding> paddings =
tester.widgetList<Padding>(find.byType(Padding)).toList();
expect(paddings.length, 3);
expect(
paddings.every(
(Padding p) => p.padding.along(Axis.horizontal) == paddingX * 2,
),
true,
);
},
);
testWidgets(
'check widgets for use stylesheet option h1Padding',
(WidgetTester tester) async {
const String data = '# Header';
const double paddingX = 20.0;
final MarkdownStyleSheet style = MarkdownStyleSheet(
h1Padding: const EdgeInsets.symmetric(horizontal: paddingX),
);
await tester.pumpWidget(boilerplate(MarkdownBody(
data: data,
styleSheet: style,
)));
final Iterable<Widget> widgets = selfAndDescendantWidgetsOf(
find.byType(MarkdownBody),
tester,
);
expectWidgetTypes(widgets, <Type>[
MarkdownBody,
Column,
Padding,
Wrap,
RichText,
]);
expectTextStrings(widgets, <String>['Header']);
},
);
testWidgets(
'use stylesheet option pPadding',
(WidgetTester tester) async {
const double paddingX = 20.0;
final MarkdownStyleSheet style = MarkdownStyleSheet(
pPadding: const EdgeInsets.symmetric(horizontal: paddingX),
);
await tester.pumpWidget(
boilerplate(
Markdown(
data: 'Test line 1\n\nTest line 2\n\nTest line 3\n# H1',
styleSheet: style,
),
),
);
final List<Padding> paddings =
tester.widgetList<Padding>(find.byType(Padding)).toList();
expect(paddings.length, 3);
expect(
paddings.every(
(Padding p) => p.padding.along(Axis.horizontal) == paddingX * 2,
),
true,
);
},
);
testWidgets(
'use stylesheet option h1Padding-h6Padding',
(WidgetTester tester) async {
const double paddingX = 20.0;
final MarkdownStyleSheet style = MarkdownStyleSheet(
h1Padding: const EdgeInsets.symmetric(horizontal: paddingX),
h2Padding: const EdgeInsets.symmetric(horizontal: paddingX),
h3Padding: const EdgeInsets.symmetric(horizontal: paddingX),
h4Padding: const EdgeInsets.symmetric(horizontal: paddingX),
h5Padding: const EdgeInsets.symmetric(horizontal: paddingX),
h6Padding: const EdgeInsets.symmetric(horizontal: paddingX),
);
await tester.pumpWidget(
boilerplate(
Markdown(
data:
'Test\n\n# H1\n## H2\n### H3\n#### H4\n##### H5\n###### H6\n',
styleSheet: style,
),
),
);
final List<Padding> paddings =
tester.widgetList<Padding>(find.byType(Padding)).toList();
expect(paddings.length, 6);
expect(
paddings.every(
(Padding p) => p.padding.along(Axis.horizontal) == paddingX * 2,
),
true,
);
},
);
});
}