@@ -85,16 +85,83 @@ void main() {
8585 ]);
8686 });
8787
88- testWidgets ('Links' , (WidgetTester tester) async {
89- await tester
90- .pumpWidget (_boilerplate (const Markdown (data: '[Link Text](href)' )));
91-
92- final RichText textWidget =
93- tester.allWidgets.firstWhere ((Widget widget) => widget is RichText );
94- final TextSpan span = textWidget.text;
95-
96- expect (
97- span.children[0 ].recognizer.runtimeType, equals (TapGestureRecognizer ));
88+ group ('Links' , () {
89+ testWidgets ('Single link' , (WidgetTester tester) async {
90+ String tapResult;
91+ await tester.pumpWidget (_boilerplate (new Markdown (
92+ data: '[Link Text](href)' ,
93+ onTapLink: (value) => tapResult = value,
94+ )));
95+
96+ final RichText textWidget =
97+ tester.allWidgets.firstWhere ((Widget widget) => widget is RichText );
98+ final TextSpan span = textWidget.text;
99+
100+ (span.children[0 ].children[0 ].recognizer as TapGestureRecognizer ).onTap ();
101+
102+ expect (span.children.length, 1 );
103+ expect (span.children[0 ].children.length, 1 );
104+ expect (span.children[0 ].children[0 ].recognizer.runtimeType,
105+ equals (TapGestureRecognizer ));
106+ expect (tapResult, 'href' );
107+ });
108+
109+ testWidgets ('Link with nested code' , (WidgetTester tester) async {
110+ final List <String > tapResults = < String > [];
111+ await tester.pumpWidget (_boilerplate (new Markdown (
112+ data: '[Link `with nested code` Text](href)' ,
113+ onTapLink: (value) => tapResults.add (value),
114+ )));
115+
116+ final RichText textWidget =
117+ tester.allWidgets.firstWhere ((Widget widget) => widget is RichText );
118+ final TextSpan span = textWidget.text;
119+
120+ final List <Type > gestureRecognizerTypes = < Type > [];
121+ span.visitTextSpan ((TextSpan textSpan) {
122+ TapGestureRecognizer recognizer = textSpan.recognizer;
123+ gestureRecognizerTypes.add (recognizer.runtimeType);
124+ recognizer.onTap ();
125+ return true ;
126+ });
127+
128+ expect (span.children.length, 1 );
129+ expect (span.children[0 ].children.length, 3 );
130+ expect (gestureRecognizerTypes, everyElement (TapGestureRecognizer ));
131+ expect (tapResults.length, 3 );
132+ expect (tapResults, everyElement ('href' ));
133+ });
134+
135+ testWidgets ('Multiple links' , (WidgetTester tester) async {
136+ final List <String > tapResults = < String > [];
137+
138+ await tester.pumpWidget (_boilerplate (new Markdown (
139+ data: '[First Link](firstHref) and [Second Link](secondHref)' ,
140+ onTapLink: (value) => tapResults.add (value),
141+ )));
142+
143+ final RichText textWidget =
144+ tester.allWidgets.firstWhere ((Widget widget) => widget is RichText );
145+ final TextSpan span = textWidget.text;
146+
147+ final List <Type > gestureRecognizerTypes = < Type > [];
148+ span.visitTextSpan ((TextSpan textSpan) {
149+ TapGestureRecognizer recognizer = textSpan.recognizer;
150+ gestureRecognizerTypes.add (recognizer.runtimeType);
151+ recognizer? .onTap ();
152+ return true ;
153+ });
154+
155+
156+ expect (span.children.length, 3 );
157+ expect (span.children[0 ].children.length, 1 );
158+ expect (span.children[1 ].children, null );
159+ expect (span.children[2 ].children.length, 1 );
160+
161+ expect (gestureRecognizerTypes,
162+ orderedEquals ([TapGestureRecognizer , Null , TapGestureRecognizer ]));
163+ expect (tapResults, orderedEquals (['firstHref' , 'secondHref' ]));
164+ });
98165 });
99166
100167 testWidgets ('HTML tag ignored ' , (WidgetTester tester) async {
0 commit comments