Skip to content

Commit 79cdb52

Browse files
committed
test: adds unit and widget tests
1 parent be2bf4a commit 79cdb52

File tree

9 files changed

+348
-151
lines changed

9 files changed

+348
-151
lines changed

lib/src/editor/raw_editor/keyboard_shortcuts/editor_keyboard_shortcut_actions.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22

33
import '../../../document/attribute.dart';
44
import '../../../document/style.dart';
5-
import '../../../toolbar/buttons/link_style2_button.dart';
5+
import '../../../toolbar/buttons/link_style/link_style2_button.dart';
66
import '../../../toolbar/buttons/search/search_dialog.dart';
77
import '../../editor.dart';
88
import '../../widgets/link.dart';

lib/src/toolbar/buttons/link_style_button.dart renamed to lib/src/toolbar/buttons/link_style/link_dialog.dart

+22-130
Original file line numberDiff line numberDiff line change
@@ -1,131 +1,21 @@
1-
import 'package:flutter/material.dart';
2-
3-
import '../../common/utils/link_validator.dart';
4-
import '../../editor/widgets/link.dart';
5-
import '../../l10n/extensions/localizations_ext.dart';
6-
import '../../rules/insert.dart';
7-
import '../base_button/base_value_button.dart';
8-
9-
import '../config/buttons/link_style_options.dart';
10-
import '../structs/link_dialog_action.dart';
11-
import '../theme/quill_dialog_theme.dart';
12-
import 'quill_icon_button.dart';
13-
14-
typedef QuillToolbarLinkStyleBaseButton = QuillToolbarBaseButton<
15-
QuillToolbarLinkStyleButtonOptions,
16-
QuillToolbarLinkStyleButtonExtraOptions>;
17-
18-
typedef QuillToolbarLinkStyleBaseButtonState<
19-
W extends QuillToolbarLinkStyleBaseButton>
20-
= QuillToolbarCommonButtonState<W, QuillToolbarLinkStyleButtonOptions,
21-
QuillToolbarLinkStyleButtonExtraOptions>;
22-
23-
class QuillToolbarLinkStyleButton extends QuillToolbarLinkStyleBaseButton {
24-
const QuillToolbarLinkStyleButton({
25-
required super.controller,
26-
super.options = const QuillToolbarLinkStyleButtonOptions(),
27-
28-
/// Shares common options between all buttons, prefer the [options]
29-
/// over the [baseOptions].
30-
super.baseOptions,
31-
super.key,
32-
});
33-
34-
@override
35-
QuillToolbarLinkStyleButtonState createState() =>
36-
QuillToolbarLinkStyleButtonState();
37-
}
38-
39-
class QuillToolbarLinkStyleButtonState
40-
extends QuillToolbarLinkStyleBaseButtonState {
41-
@override
42-
String get defaultTooltip => context.loc.insertURL;
43-
44-
void _didChangeSelection() {
45-
setState(() {});
46-
}
47-
48-
@override
49-
void initState() {
50-
super.initState();
51-
controller.addListener(_didChangeSelection);
52-
}
53-
54-
@override
55-
void didUpdateWidget(covariant QuillToolbarLinkStyleButton oldWidget) {
56-
super.didUpdateWidget(oldWidget);
57-
if (oldWidget.controller != controller) {
58-
oldWidget.controller.removeListener(_didChangeSelection);
59-
controller.addListener(_didChangeSelection);
60-
}
61-
}
62-
63-
@override
64-
void dispose() {
65-
super.dispose();
66-
controller.removeListener(_didChangeSelection);
67-
}
68-
69-
@override
70-
IconData get defaultIconData => Icons.link;
71-
72-
@override
73-
Widget build(BuildContext context) {
74-
final isToggled = QuillTextLink.isSelected(controller);
75-
76-
final childBuilder = this.childBuilder;
77-
if (childBuilder != null) {
78-
return childBuilder(
79-
options,
80-
QuillToolbarLinkStyleButtonExtraOptions(
81-
context: context,
82-
controller: controller,
83-
onPressed: () {
84-
_openLinkDialog(context);
85-
afterButtonPressed?.call();
86-
},
87-
),
88-
);
89-
}
90-
return QuillToolbarIconButton(
91-
tooltip: tooltip,
92-
icon: Icon(
93-
iconData,
94-
size: iconSize * iconButtonFactor,
95-
),
96-
isSelected: isToggled,
97-
onPressed: () => _openLinkDialog(context),
98-
afterPressed: afterButtonPressed,
99-
iconTheme: iconTheme,
100-
);
101-
}
1+
@internal
2+
@visibleForTesting
3+
library;
1024

103-
Future<void> _openLinkDialog(BuildContext context) async {
104-
final initialTextLink = QuillTextLink.prepare(widget.controller);
5+
import 'package:flutter/material.dart';
6+
import 'package:meta/meta.dart';
1057

106-
final textLink = await showDialog<QuillTextLink>(
107-
context: context,
108-
builder: (_) {
109-
return _LinkDialog(
110-
validateLink: options.validateLink,
111-
// ignore: deprecated_member_use_from_same_package
112-
legacyLinkRegExp: options.linkRegExp,
113-
dialogTheme: options.dialogTheme,
114-
text: initialTextLink.text,
115-
link: initialTextLink.link,
116-
action: options.linkDialogAction,
117-
);
118-
},
119-
);
120-
if (textLink != null) {
121-
textLink.submit(widget.controller);
122-
}
123-
}
124-
}
8+
import '../../../common/utils/link_validator.dart';
9+
import '../../../editor/widgets/link.dart';
10+
import '../../../l10n/extensions/localizations_ext.dart';
11+
import '../../../rules/insert.dart';
12+
import '../../structs/link_dialog_action.dart';
13+
import '../../theme/quill_dialog_theme.dart';
12514

126-
class _LinkDialog extends StatefulWidget {
127-
const _LinkDialog({
15+
class LinkDialog extends StatefulWidget {
16+
const LinkDialog({
12817
required this.validateLink,
18+
super.key,
12919
this.dialogTheme,
13020
this.link,
13121
this.text,
@@ -141,10 +31,10 @@ class _LinkDialog extends StatefulWidget {
14131
final LinkDialogAction? action;
14232

14333
@override
144-
_LinkDialogState createState() => _LinkDialogState();
34+
LinkDialogState createState() => LinkDialogState();
14535
}
14636

147-
class _LinkDialogState extends State<_LinkDialog> {
37+
class LinkDialogState extends State<LinkDialog> {
14838
late String _link;
14939
late String _text;
15040

@@ -217,7 +107,7 @@ class _LinkDialogState extends State<_LinkDialog> {
217107
autofillHints: const [AutofillHints.url],
218108
autocorrect: false,
219109
onEditingComplete: () {
220-
if (!_canPress()) {
110+
if (!canPress()) {
221111
return;
222112
}
223113
_applyLink();
@@ -235,13 +125,13 @@ class _LinkDialogState extends State<_LinkDialog> {
235125
Widget _okButton() {
236126
if (widget.action != null) {
237127
return widget.action!.builder(
238-
_canPress(),
128+
canPress(),
239129
_applyLink,
240130
);
241131
}
242132

243133
return TextButton(
244-
onPressed: _canPress() ? _applyLink : null,
134+
onPressed: canPress() ? _applyLink : null,
245135
child: Text(
246136
context.loc.ok,
247137
style: widget.dialogTheme?.buttonTextStyle,
@@ -256,7 +146,9 @@ class _LinkDialogState extends State<_LinkDialog> {
256146
legacyRegex: widget.legacyLinkRegExp,
257147
);
258148

259-
bool _canPress() {
149+
@visibleForTesting
150+
@internal
151+
bool canPress() {
260152
if (_text.isEmpty || _link.isEmpty) {
261153
return false;
262154
}

lib/src/toolbar/buttons/link_style2_button.dart renamed to lib/src/toolbar/buttons/link_style/link_style2_button.dart

+8-8
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import 'package:flutter/foundation.dart';
22
import 'package:flutter/material.dart';
33
import 'package:url_launcher/link.dart';
44

5-
import '../../common/utils/link_validator.dart';
6-
import '../../common/utils/widgets.dart';
5+
import '../../../common/utils/link_validator.dart';
6+
import '../../../common/utils/widgets.dart';
77

8-
import '../../editor/widgets/link.dart';
9-
import '../../l10n/extensions/localizations_ext.dart';
10-
import '../base_button/base_value_button.dart';
8+
import '../../../editor/widgets/link.dart';
9+
import '../../../l10n/extensions/localizations_ext.dart';
10+
import '../../base_button/base_value_button.dart';
1111

12-
import '../config/simple_toolbar_config.dart';
13-
import '../theme/quill_dialog_theme.dart';
12+
import '../../config/simple_toolbar_config.dart';
13+
import '../../theme/quill_dialog_theme.dart';
1414

15-
import 'quill_icon_button.dart';
15+
import '../quill_icon_button.dart';
1616

1717
typedef QuillToolbarLinkStyleBaseButton2 = QuillToolbarBaseButton<
1818
QuillToolbarLinkStyleButton2Options,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import 'package:flutter/material.dart';
2+
3+
import '../../../editor/widgets/link.dart';
4+
import '../../../l10n/extensions/localizations_ext.dart';
5+
import '../../base_button/base_value_button.dart';
6+
7+
import '../../config/buttons/link_style_options.dart';
8+
import '../quill_icon_button.dart';
9+
import 'link_dialog.dart';
10+
11+
typedef QuillToolbarLinkStyleBaseButton = QuillToolbarBaseButton<
12+
QuillToolbarLinkStyleButtonOptions,
13+
QuillToolbarLinkStyleButtonExtraOptions>;
14+
15+
typedef QuillToolbarLinkStyleBaseButtonState<
16+
W extends QuillToolbarLinkStyleBaseButton>
17+
= QuillToolbarCommonButtonState<W, QuillToolbarLinkStyleButtonOptions,
18+
QuillToolbarLinkStyleButtonExtraOptions>;
19+
20+
class QuillToolbarLinkStyleButton extends QuillToolbarLinkStyleBaseButton {
21+
const QuillToolbarLinkStyleButton({
22+
required super.controller,
23+
super.options = const QuillToolbarLinkStyleButtonOptions(),
24+
25+
/// Shares common options between all buttons, prefer the [options]
26+
/// over the [baseOptions].
27+
super.baseOptions,
28+
super.key,
29+
});
30+
31+
@override
32+
QuillToolbarLinkStyleButtonState createState() =>
33+
QuillToolbarLinkStyleButtonState();
34+
}
35+
36+
class QuillToolbarLinkStyleButtonState
37+
extends QuillToolbarLinkStyleBaseButtonState {
38+
@override
39+
String get defaultTooltip => context.loc.insertURL;
40+
41+
void _didChangeSelection() {
42+
setState(() {});
43+
}
44+
45+
@override
46+
void initState() {
47+
super.initState();
48+
controller.addListener(_didChangeSelection);
49+
}
50+
51+
@override
52+
void didUpdateWidget(covariant QuillToolbarLinkStyleButton oldWidget) {
53+
super.didUpdateWidget(oldWidget);
54+
if (oldWidget.controller != controller) {
55+
oldWidget.controller.removeListener(_didChangeSelection);
56+
controller.addListener(_didChangeSelection);
57+
}
58+
}
59+
60+
@override
61+
void dispose() {
62+
super.dispose();
63+
controller.removeListener(_didChangeSelection);
64+
}
65+
66+
@override
67+
IconData get defaultIconData => Icons.link;
68+
69+
@override
70+
Widget build(BuildContext context) {
71+
final isToggled = QuillTextLink.isSelected(controller);
72+
73+
final childBuilder = this.childBuilder;
74+
if (childBuilder != null) {
75+
return childBuilder(
76+
options,
77+
QuillToolbarLinkStyleButtonExtraOptions(
78+
context: context,
79+
controller: controller,
80+
onPressed: () {
81+
_openLinkDialog(context);
82+
afterButtonPressed?.call();
83+
},
84+
),
85+
);
86+
}
87+
return QuillToolbarIconButton(
88+
tooltip: tooltip,
89+
icon: Icon(
90+
iconData,
91+
size: iconSize * iconButtonFactor,
92+
),
93+
isSelected: isToggled,
94+
onPressed: () => _openLinkDialog(context),
95+
afterPressed: afterButtonPressed,
96+
iconTheme: iconTheme,
97+
);
98+
}
99+
100+
Future<void> _openLinkDialog(BuildContext context) async {
101+
final initialTextLink = QuillTextLink.prepare(widget.controller);
102+
103+
final textLink = await showDialog<QuillTextLink>(
104+
context: context,
105+
builder: (_) {
106+
return LinkDialog(
107+
validateLink: options.validateLink,
108+
// ignore: deprecated_member_use_from_same_package
109+
legacyLinkRegExp: options.linkRegExp,
110+
dialogTheme: options.dialogTheme,
111+
text: initialTextLink.text,
112+
link: initialTextLink.link,
113+
action: options.linkDialogAction,
114+
);
115+
},
116+
);
117+
if (textLink != null) {
118+
textLink.submit(widget.controller);
119+
}
120+
}
121+
}

lib/src/toolbar/config/simple_toolbar_config.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import 'package:meta/meta.dart';
33

44
import '../buttons/hearder_style/select_header_style_buttons.dart';
55
import '../buttons/hearder_style/select_header_style_dropdown_button.dart';
6-
import '../buttons/link_style2_button.dart';
7-
import '../buttons/link_style_button.dart';
6+
import '../buttons/link_style/link_style2_button.dart';
7+
import '../buttons/link_style/link_style_button.dart';
88
import '../embed/embed_button_builder.dart';
99
import '../structs/link_dialog_action.dart';
1010
import '../theme/quill_dialog_theme.dart';

lib/src/toolbar/simple_toolbar.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ export 'buttons/hearder_style/select_header_style_buttons.dart';
1818
export 'buttons/hearder_style/select_header_style_dropdown_button.dart';
1919
export 'buttons/history_button.dart';
2020
export 'buttons/indent_button.dart';
21-
export 'buttons/link_style2_button.dart';
22-
export 'buttons/link_style_button.dart';
21+
export 'buttons/link_style/link_style2_button.dart';
22+
export 'buttons/link_style/link_style_button.dart';
2323
export 'buttons/quill_icon_button.dart';
2424
export 'buttons/search/search_button.dart';
2525
export 'buttons/select_line_height_dropdown_button.dart';

0 commit comments

Comments
 (0)