// Copyright 2014 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 'dart:ui' as ui show TextHeightBehavior;

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('DefaultTextStyle changes propagate to Text', (WidgetTester tester) async {
    const Text textWidget = Text('Hello', textDirection: TextDirection.ltr);
    const TextStyle s1 = TextStyle(
      fontSize: 10.0,
      fontWeight: FontWeight.w800,
      height: 123.0,
    );

    await tester.pumpWidget(const DefaultTextStyle(
      style: s1,
      child: textWidget,
    ));

    RichText text = tester.firstWidget(find.byType(RichText));
    expect(text, isNotNull);
    expect(text.text.style, s1);

    await tester.pumpWidget(const DefaultTextStyle(
      style: s1,
      textAlign: TextAlign.justify,
      softWrap: false,
      overflow: TextOverflow.fade,
      maxLines: 3,
      child: textWidget,
    ));

    text = tester.firstWidget(find.byType(RichText));
    expect(text, isNotNull);
    expect(text.text.style, s1);
    expect(text.textAlign, TextAlign.justify);
    expect(text.softWrap, false);
    expect(text.overflow, TextOverflow.fade);
    expect(text.maxLines, 3);
  });

  testWidgets('AnimatedDefaultTextStyle changes propagate to Text', (WidgetTester tester) async {
    const Text textWidget = Text('Hello', textDirection: TextDirection.ltr);
    const TextStyle s1 = TextStyle(
      fontSize: 10.0,
      fontWeight: FontWeight.w800,
      height: 123.0,
    );
    const TextStyle s2 = TextStyle(
      fontSize: 20.0,
      fontWeight: FontWeight.w200,
      height: 1.0,
    );

    await tester.pumpWidget(const AnimatedDefaultTextStyle(
      style: s1,
      duration: Duration(milliseconds: 1000),
      child: textWidget,
    ));

    final RichText text1 = tester.firstWidget(find.byType(RichText));
    expect(text1, isNotNull);
    expect(text1.text.style, s1);
    expect(text1.textAlign, TextAlign.start);
    expect(text1.softWrap, isTrue);
    expect(text1.overflow, TextOverflow.clip);
    expect(text1.maxLines, isNull);
    expect(text1.textWidthBasis, TextWidthBasis.parent);
    expect(text1.textHeightBehavior, isNull);

    await tester.pumpWidget(const AnimatedDefaultTextStyle(
      style: s2,
      textAlign: TextAlign.justify,
      softWrap: false,
      overflow: TextOverflow.fade,
      maxLines: 3,
      textWidthBasis: TextWidthBasis.longestLine,
      textHeightBehavior: ui.TextHeightBehavior(applyHeightToFirstAscent: false),
      duration: Duration(milliseconds: 1000),
      child: textWidget,
    ));

    final RichText text2 = tester.firstWidget(find.byType(RichText));
    expect(text2, isNotNull);
    expect(text2.text.style, s1); // animation hasn't started yet
    expect(text2.textAlign, TextAlign.justify);
    expect(text2.softWrap, false);
    expect(text2.overflow, TextOverflow.fade);
    expect(text2.maxLines, 3);
    expect(text2.textWidthBasis, TextWidthBasis.longestLine);
    expect(text2.textHeightBehavior, const ui.TextHeightBehavior(applyHeightToFirstAscent: false));

    await tester.pump(const Duration(milliseconds: 1000));

    final RichText text3 = tester.firstWidget(find.byType(RichText));
    expect(text3, isNotNull);
    expect(text3.text.style, s2); // animation has now finished
    expect(text3.textAlign, TextAlign.justify);
    expect(text3.softWrap, false);
    expect(text3.overflow, TextOverflow.fade);
    expect(text3.maxLines, 3);
    expect(text2.textWidthBasis, TextWidthBasis.longestLine);
    expect(text2.textHeightBehavior, const ui.TextHeightBehavior(applyHeightToFirstAscent: false));
  });
}
