// 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('Scrollable', () { testWidgets( 'code block', (WidgetTester tester) async { const String data = "```\nvoid main() {\n print('Hello World!');\n}\n```"; await tester.pumpWidget( boilerplate( const MediaQuery( data: MediaQueryData(), child: MarkdownBody(data: data), ), ), ); final Iterable widgets = tester.allWidgets; final Iterable scrollViews = widgets.whereType(); expect(scrollViews, isNotEmpty); expect(scrollViews.first.controller, isNotNull); }, ); testWidgets( 'two code blocks use different scroll controllers', (WidgetTester tester) async { const String data = "```\nvoid main() {\n print('Hello World!');\n}\n```" '\n' "```\nvoid main() {\n print('Hello World!');\n}\n```"; await tester.pumpWidget( boilerplate( const MediaQuery( data: MediaQueryData(), child: MarkdownBody(data: data), ), ), ); final Iterable widgets = tester.allWidgets; final Iterable scrollViews = widgets.whereType(); expect(scrollViews, hasLength(2)); expect(scrollViews.first.controller, isNotNull); expect(scrollViews.last.controller, isNotNull); expect(scrollViews.first.controller, isNot(equals(scrollViews.last.controller))); }, ); testWidgets( 'controller', (WidgetTester tester) async { final ScrollController controller = ScrollController( initialScrollOffset: 209.0, ); addTearDown(controller.dispose); await tester.pumpWidget( boilerplate( Markdown(controller: controller, data: ''), ), ); double realOffset() { return tester.state(find.byType(Scrollable)).position.pixels; } expect(controller.offset, equals(209.0)); expect(realOffset(), equals(controller.offset)); }, ); testWidgets( 'Scrollable wrapping', (WidgetTester tester) async { await tester.pumpWidget( boilerplate( const Markdown(data: ''), ), ); final List widgets = selfAndDescendantWidgetsOf( find.byType(Markdown), tester, ).toList(); expectWidgetTypes(widgets.take(2), [ Markdown, ListView, ]); expectWidgetTypes(widgets.reversed.take(2).toList().reversed, [ SliverPadding, SliverList, ]); }, ); testWidgets( 'table with fixed column width', (WidgetTester tester) async { const String data = '|Header 1|Header 2|Header 3|' '\n|-----|-----|-----|' '\n|Col 1|Col 2|Col 3|'; await tester.pumpWidget( boilerplate( MediaQuery( data: const MediaQueryData(), child: MarkdownBody( data: data, styleSheet: MarkdownStyleSheet( tableColumnWidth: const FixedColumnWidth(150), ), ), ), ), ); final Iterable widgets = tester.allWidgets; final Iterable scrollViews = widgets.whereType(); expect(scrollViews, isNotEmpty); expect(scrollViews.first.controller, isNotNull); }, ); testWidgets( 'table with intrinsic column width', (WidgetTester tester) async { const String data = '|Header 1|Header 2|Header 3|' '\n|-----|-----|-----|' '\n|Col 1|Col 2|Col 3|'; await tester.pumpWidget( boilerplate( MediaQuery( data: const MediaQueryData(), child: MarkdownBody( data: data, styleSheet: MarkdownStyleSheet( tableColumnWidth: const IntrinsicColumnWidth(), ), ), ), ), ); final Iterable widgets = tester.allWidgets; final Iterable scrollViews = widgets.whereType(); expect(scrollViews, isNotEmpty); expect(scrollViews.first.controller, isNotNull); }, ); testWidgets( 'two tables use different scroll controllers', (WidgetTester tester) async { const String data = '|Header 1|Header 2|Header 3|' '\n|-----|-----|-----|' '\n|Col 1|Col 2|Col 3|' '\n' '\n|Header 1|Header 2|Header 3|' '\n|-----|-----|-----|' '\n|Col 1|Col 2|Col 3|'; await tester.pumpWidget( boilerplate( MediaQuery( data: const MediaQueryData(), child: MarkdownBody( data: data, styleSheet: MarkdownStyleSheet( tableColumnWidth: const FixedColumnWidth(150), ), ), ), ), ); final Iterable widgets = tester.allWidgets; final Iterable scrollViews = widgets.whereType(); expect(scrollViews, hasLength(2)); expect(scrollViews.first.controller, isNotNull); expect(scrollViews.last.controller, isNotNull); expect(scrollViews.first.controller, isNot(equals(scrollViews.last.controller))); }, ); }); }