// 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/flutter_markdown.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<Widget> widgets = tester.allWidgets;
        expect(widgets.whereType<SingleChildScrollView>(), isNotEmpty);
      },
    );

    testWidgets(
      'controller',
      (WidgetTester tester) async {
        final ScrollController controller = ScrollController(
          initialScrollOffset: 209.0,
        );

        await tester.pumpWidget(
          boilerplate(
            Markdown(controller: controller, data: ''),
          ),
        );

        double realOffset() {
          return tester
              .state<ScrollableState>(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<Widget> widgets = tester.allWidgets.toList();
        expectWidgetTypes(widgets.take(3), <Type>[
          Directionality,
          Markdown,
          ListView,
        ]);
        expectWidgetTypes(widgets.reversed.take(2).toList().reversed, <Type>[
          SliverPadding,
          SliverList,
        ]);
      },
    );
  });
}
