// 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('MarkdownBody shrinkWrap test', () {
    testWidgets(
      'Given a MarkdownBody with shrinkWrap=true '
      'Then it wraps its content',
      (WidgetTester tester) async {
        await tester.pumpWidget(boilerplate(Stack(
          children: const <Widget>[
            Text('shrinkWrap=true'),
            Align(
              alignment: Alignment.bottomCenter,
              child: MarkdownBody(
                data: 'This is a [link](https://flutter.dev/)',
                shrinkWrap: true,
              ),
            ),
          ],
        )));

        final Rect stackRect = tester.getRect(find.byType(Stack));
        final Rect textRect = tester.getRect(find.byType(Text));
        final Rect markdownBodyRect = tester.getRect(find.byType(MarkdownBody));

        // The Text should be on the top of the Stack
        expect(textRect.top, equals(stackRect.top));
        expect(textRect.bottom, lessThan(stackRect.bottom));
        // The MarkdownBody should be on the bottom of the Stack
        expect(markdownBodyRect.top, greaterThan(stackRect.top));
        expect(markdownBodyRect.bottom, equals(stackRect.bottom));
      },
    );
    testWidgets(
      'Given a MarkdownBody with shrinkWrap=false '
      'Then it expands to the maximum allowed height',
      (WidgetTester tester) async {
        await tester.pumpWidget(boilerplate(Stack(
          children: const <Widget>[
            Text('shrinkWrap=false test'),
            Align(
              alignment: Alignment.bottomCenter,
              child: MarkdownBody(
                data: 'This is a [link](https://flutter.dev/)',
                shrinkWrap: false,
              ),
            ),
          ],
        )));

        final Rect stackRect = tester.getRect(find.byType(Stack));
        final Rect textRect = tester.getRect(find.byType(Text));
        final Rect markdownBodyRect = tester.getRect(find.byType(MarkdownBody));

        // The Text should be on the top of the Stack
        expect(textRect.top, equals(stackRect.top));
        expect(textRect.bottom, lessThan(stackRect.bottom));
        // The MarkdownBody should take all Stack's height
        expect(markdownBodyRect.top, equals(stackRect.top));
        expect(markdownBodyRect.bottom, equals(stackRect.bottom));
      },
    );
  });
}
