// 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.

// This file is run as part of a reduced test set in CI on Mac and Windows
// machines.
@Tags(<String>['reduced-test-set'])
@TestOn('!chrome')
library;

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

void main() {
  testWidgets('Centered text', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text(
              'Hello',
              textDirection: TextDirection.ltr,
              textAlign: TextAlign.center,
              style: TextStyle(color: Color(0xffff0000)),
            ),
          ),
        ),
      ),
    );

    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Centered.png'));

    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text(
              'Hello world how are you today',
              textDirection: TextDirection.ltr,
              textAlign: TextAlign.center,
              style: TextStyle(color: Color(0xffff0000)),
            ),
          ),
        ),
      ),
    );

    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Centered.wrap.png'));
  });

  testWidgets('Text Foreground', (WidgetTester tester) async {
    const Color black = Color(0xFF000000);
    const Color red = Color(0xFFFF0000);
    const Color blue = Color(0xFF0000FF);
    final Shader linearGradient = const LinearGradient(
      colors: <Color>[red, blue],
    ).createShader(const Rect.fromLTWH(0.0, 0.0, 50.0, 20.0));

    await tester.pumpWidget(
      Align(
        alignment: Alignment.topLeft,
        child: RepaintBoundary(
          child: Text(
            'Hello',
            textDirection: TextDirection.ltr,
            style: TextStyle(
              foreground: Paint()
                ..color = black
                ..shader = linearGradient,
            ),
          ),
        ),
      ),
    );

    await expectLater(
      find.byType(RepaintBoundary),
      matchesGoldenFile('text_golden.Foreground.gradient.png'),
    );

    await tester.pumpWidget(
      Align(
        alignment: Alignment.topLeft,
        child: RepaintBoundary(
          child: Text(
            'Hello',
            textDirection: TextDirection.ltr,
            style: TextStyle(
              foreground: Paint()
                ..color = black
                ..style = PaintingStyle.stroke
                ..strokeWidth = 2.0,
            ),
          ),
        ),
      ),
    );

    await expectLater(
      find.byType(RepaintBoundary),
      matchesGoldenFile('text_golden.Foreground.stroke.png'),
    );

    await tester.pumpWidget(
      Align(
        alignment: Alignment.topLeft,
        child: RepaintBoundary(
          child: Text(
            'Hello',
            textDirection: TextDirection.ltr,
            style: TextStyle(
              foreground: Paint()
                ..color = black
                ..style = PaintingStyle.stroke
                ..strokeWidth = 2.0
                ..shader = linearGradient,
            ),
          ),
        ),
      ),
    );

    await expectLater(
      find.byType(RepaintBoundary),
      matchesGoldenFile('text_golden.Foreground.stroke_and_gradient.png'),
    );
  });

  // TODO(garyq): This test requires an update when the background
  // drawing from the beginning of the line bug is fixed. The current
  // tested version is not completely correct.
  testWidgets('Text Background', (WidgetTester tester) async {
    const Color red = Colors.red;
    const Color blue = Colors.blue;
    const Color translucentGreen = Color(0x5000F000);
    const Color translucentDarkRed = Color(0x500F0000);
    await tester.pumpWidget(
      Align(
        alignment: Alignment.topLeft,
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Colors.green),
            child: Text.rich(
              TextSpan(
                text: 'text1 ',
                style: TextStyle(
                  color: translucentGreen,
                  background: Paint()..color = red.withOpacity(0.5),
                ),
                children: <InlineSpan>[
                  TextSpan(
                    text: 'text2',
                    style: TextStyle(
                      color: translucentDarkRed,
                      background: Paint()..color = blue.withOpacity(0.5),
                    ),
                  ),
                ],
              ),
              textDirection: TextDirection.ltr,
            ),
          ),
        ),
      ),
    );

    await expectLater(
      find.byType(RepaintBoundary),
      matchesGoldenFile('text_golden.Background.png'),
    );
  });

  testWidgets('Text Fade', (WidgetTester tester) async {
    await tester.pumpWidget(
      MaterialApp(
        theme: ThemeData(useMaterial3: false),
        home: Scaffold(
          backgroundColor: Colors.transparent,
          body: RepaintBoundary(
            child: Center(
              child: Container(
                width: 200.0,
                height: 200.0,
                color: Colors.green,
                child: Center(
                  child: Container(
                    width: 100.0,
                    color: Colors.blue,
                    child: const Text(
                      'Pp PPp PPPp PPPPp PPPPpp PPPPppp PPPPppppp ',
                      style: TextStyle(color: Colors.black),
                      maxLines: 3,
                      overflow: TextOverflow.fade,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );

    await expectLater(
      find.byType(RepaintBoundary).first,
      matchesGoldenFile('text_golden.Fade.png'),
    );
  });

  testWidgets('Default Strut text', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text(
              'Hello\nLine 2\nLine 3',
              textDirection: TextDirection.ltr,
              style: TextStyle(),
              strutStyle: StrutStyle(),
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.StrutDefault.png'));
  });

  testWidgets('Strut text 1', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text(
              'Hello\nLine2\nLine3',
              textDirection: TextDirection.ltr,
              style: TextStyle(),
              strutStyle: StrutStyle(height: 1.5),
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Strut.1.png'));
  });

  testWidgets('Strut text 2', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text(
              'Hello\nLine 2\nLine 3',
              textDirection: TextDirection.ltr,
              style: TextStyle(),
              strutStyle: StrutStyle(height: 1.5, fontSize: 14),
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Strut.2.png'));
  });

  testWidgets('Strut text rich', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 150.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text.rich(
              TextSpan(
                text: 'Hello\n',
                style: TextStyle(color: Colors.red, fontSize: 30),
                children: <InlineSpan>[
                  TextSpan(
                    text: 'Second line!\n',
                    style: TextStyle(fontSize: 5, color: Colors.blue),
                  ),
                  TextSpan(
                    text: 'Third line!\n',
                    style: TextStyle(fontSize: 25, color: Colors.white),
                  ),
                ],
              ),
              textDirection: TextDirection.ltr,
              strutStyle: StrutStyle(fontSize: 14, height: 1.1, leading: 0.1),
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Strut.3.png'));
  });

  testWidgets('Strut text font fallback', (WidgetTester tester) async {
    // Font Fallback
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text(
              'Hello\nLine 2\nLine 3',
              textDirection: TextDirection.ltr,
              style: TextStyle(),
              strutStyle: StrutStyle(
                fontFamily: 'FakeFont 1',
                fontFamilyFallback: <String>['FakeFont 2', 'EvilFont 3', 'Nice Font 4', 'ahem'],
                fontSize: 14,
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Strut.4.png'));
  });

  testWidgets('Strut text rich forceStrutHeight', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Text.rich(
              TextSpan(
                text: 'Hello\n',
                style: TextStyle(color: Colors.red, fontSize: 30),
                children: <InlineSpan>[
                  TextSpan(
                    text: 'Second line!\n',
                    style: TextStyle(fontSize: 9, color: Colors.blue),
                  ),
                  TextSpan(
                    text: 'Third line!\n',
                    style: TextStyle(fontSize: 27, color: Colors.white),
                  ),
                ],
              ),
              textDirection: TextDirection.ltr,
              strutStyle: StrutStyle(fontSize: 14, height: 1.1, forceStrutHeight: true),
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.StrutForce.1.png'));
  });

  testWidgets('Decoration thickness', (WidgetTester tester) async {
    final TextDecoration allDecorations = TextDecoration.combine(<TextDecoration>[
      TextDecoration.underline,
      TextDecoration.overline,
      TextDecoration.lineThrough,
    ]);

    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 300.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: Text(
              'Hello, wor!\nabcd.',
              style: TextStyle(
                fontSize: 25,
                decoration: allDecorations,
                decorationColor: Colors.blue,
                decorationStyle: TextDecorationStyle.dashed,
              ),
              textDirection: TextDirection.rtl,
            ),
          ),
        ),
      ),
    );
    await expectLater(find.byType(Container), matchesGoldenFile('text_golden.Decoration.1.png'));
  });

  testWidgets('Decoration thickness', (WidgetTester tester) async {
    final TextDecoration allDecorations = TextDecoration.combine(<TextDecoration>[
      TextDecoration.underline,
      TextDecoration.overline,
      TextDecoration.lineThrough,
    ]);

    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 300.0,
            height: 100.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: Text(
              'Hello, wor!\nabcd.',
              style: TextStyle(
                fontSize: 25,
                decoration: allDecorations,
                decorationColor: Colors.blue,
                decorationStyle: TextDecorationStyle.wavy,
                decorationThickness: 4,
              ),
              textDirection: TextDirection.rtl,
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.DecorationThickness.1.png'),
    );
  });

  testWidgets('Text Inline widget', (WidgetTester tester) async {
    await tester.pumpWidget(
      Theme(
        data: ThemeData(useMaterial3: false),
        child: Center(
          child: RepaintBoundary(
            child: Material(
              child: Directionality(
                textDirection: TextDirection.ltr,
                child: Container(
                  width: 400.0,
                  height: 200.0,
                  decoration: const BoxDecoration(color: Color(0xff00ff00)),
                  child: ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                    child: const Text.rich(
                      TextSpan(
                        text: 'C ',
                        style: TextStyle(fontSize: 16),
                        children: <InlineSpan>[
                          WidgetSpan(child: Checkbox(value: true, onChanged: null)),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          TextSpan(text: 'He ', style: TextStyle(fontSize: 20)),
                          WidgetSpan(
                            child: SizedBox(
                              width: 50.0,
                              height: 55.0,
                              child: DecoratedBox(
                                decoration: BoxDecoration(color: Color(0xffffff00)),
                                child: Center(
                                  child: SizedBox(
                                    width: 10.0,
                                    height: 15.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xffff0000)),
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ),
                          TextSpan(text: 'hello world! seize the day!'),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          WidgetSpan(
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            child: Checkbox(value: false, onChanged: null),
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                          ),
                          WidgetSpan(
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(child: Text('embedded')),
                        ],
                      ),
                      textDirection: TextDirection.ltr,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidget.1.png'),
    );
  });

  testWidgets('Text Inline widget textfield', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: MaterialApp(
          theme: ThemeData(useMaterial3: false),
          home: RepaintBoundary(
            child: Material(
              child: Container(
                width: 400.0,
                height: 200.0,
                decoration: const BoxDecoration(color: Color(0xff00ff00)),
                child: ConstrainedBox(
                  constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                  child: const Text.rich(
                    TextSpan(
                      text: 'My name is: ',
                      style: TextStyle(fontSize: 20),
                      children: <InlineSpan>[
                        WidgetSpan(child: SizedBox(width: 70, height: 25, child: TextField())),
                        TextSpan(
                          text: ', and my favorite city is: ',
                          style: TextStyle(fontSize: 20),
                        ),
                        WidgetSpan(child: SizedBox(width: 70, height: 25, child: TextField())),
                      ],
                    ),
                    textDirection: TextDirection.ltr,
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidget.2.png'),
    );
  });

  // This tests if multiple Text.rich widgets are able to inline nest within each other.
  testWidgets('Text Inline widget nesting', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: MaterialApp(
          theme: ThemeData(useMaterial3: false),
          home: RepaintBoundary(
            child: Material(
              child: Container(
                width: 400.0,
                height: 200.0,
                decoration: const BoxDecoration(color: Color(0xff00ff00)),
                child: ConstrainedBox(
                  constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                  child: const Text.rich(
                    TextSpan(
                      text: 'outer',
                      style: TextStyle(fontSize: 20),
                      children: <InlineSpan>[
                        WidgetSpan(
                          child: Text.rich(
                            TextSpan(
                              text: 'inner',
                              style: TextStyle(color: Color(0xf402f4ff)),
                              children: <InlineSpan>[
                                WidgetSpan(
                                  child: Text.rich(
                                    TextSpan(
                                      text: 'inner2',
                                      style: TextStyle(color: Color(0xf003ffff)),
                                      children: <InlineSpan>[
                                        WidgetSpan(
                                          child: SizedBox(
                                            width: 50.0,
                                            height: 55.0,
                                            child: DecoratedBox(
                                              decoration: BoxDecoration(color: Color(0xffffff30)),
                                              child: Center(
                                                child: SizedBox(
                                                  width: 10.0,
                                                  height: 15.0,
                                                  child: DecoratedBox(
                                                    decoration: BoxDecoration(
                                                      color: Color(0xff5f00f0),
                                                    ),
                                                  ),
                                                ),
                                              ),
                                            ),
                                          ),
                                        ),
                                      ],
                                    ),
                                  ),
                                ),
                                WidgetSpan(
                                  child: SizedBox(
                                    width: 50.0,
                                    height: 55.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xff5fff00)),
                                      child: Center(
                                        child: SizedBox(
                                          width: 10.0,
                                          height: 15.0,
                                          child: DecoratedBox(
                                            decoration: BoxDecoration(color: Color(0xff5f0000)),
                                          ),
                                        ),
                                      ),
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ),
                        ),
                        TextSpan(text: 'outer', style: TextStyle(fontSize: 20)),
                        WidgetSpan(child: SizedBox(width: 70, height: 25, child: TextField())),
                        WidgetSpan(
                          child: SizedBox(
                            width: 50.0,
                            height: 55.0,
                            child: DecoratedBox(
                              decoration: BoxDecoration(color: Color(0xffff00ff)),
                              child: Center(
                                child: SizedBox(
                                  width: 10.0,
                                  height: 15.0,
                                  child: DecoratedBox(
                                    decoration: BoxDecoration(color: Color(0xff0000ff)),
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                    textDirection: TextDirection.ltr,
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidgetNest.1.png'),
    );
  });

  testWidgets('Text Inline widget baseline', (WidgetTester tester) async {
    await tester.pumpWidget(
      Theme(
        data: ThemeData(useMaterial3: false),
        child: Center(
          child: RepaintBoundary(
            child: Material(
              child: Directionality(
                textDirection: TextDirection.ltr,
                child: Container(
                  width: 400.0,
                  height: 200.0,
                  decoration: const BoxDecoration(color: Color(0xff00ff00)),
                  child: ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                    child: const Text.rich(
                      TextSpan(
                        text: 'C ',
                        style: TextStyle(fontSize: 16),
                        children: <InlineSpan>[
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: true, onChanged: null),
                          ),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          TextSpan(text: 'He ', style: TextStyle(fontSize: 20)),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 50.0,
                              height: 55.0,
                              child: DecoratedBox(
                                decoration: BoxDecoration(color: Color(0xffffff00)),
                                child: Center(
                                  child: SizedBox(
                                    width: 10.0,
                                    height: 15.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xffff0000)),
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ),
                          TextSpan(text: 'hello world! seize the day!'),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.baseline,
                            baseline: TextBaseline.alphabetic,
                            child: Text('embedded'),
                          ),
                          TextSpan(text: 'ref'),
                        ],
                      ),
                      textDirection: TextDirection.ltr,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidgetBaseline.1.png'),
    );
  });

  testWidgets('Text Inline widget aboveBaseline', (WidgetTester tester) async {
    await tester.pumpWidget(
      Theme(
        data: ThemeData(useMaterial3: false),
        child: Center(
          child: RepaintBoundary(
            child: Material(
              child: Directionality(
                textDirection: TextDirection.ltr,
                child: Container(
                  width: 400.0,
                  height: 200.0,
                  decoration: const BoxDecoration(color: Color(0xff00ff00)),
                  child: ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                    child: const Text.rich(
                      TextSpan(
                        text: 'C ',
                        style: TextStyle(fontSize: 16),
                        children: <InlineSpan>[
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: true, onChanged: null),
                          ),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          TextSpan(text: 'He ', style: TextStyle(fontSize: 20)),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 50.0,
                              height: 55.0,
                              child: DecoratedBox(
                                decoration: BoxDecoration(color: Color(0xffffff00)),
                                child: Center(
                                  child: SizedBox(
                                    width: 10.0,
                                    height: 15.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xffff0000)),
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ),
                          TextSpan(text: 'hello world! seize the day!'),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.aboveBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Text('embedded'),
                          ),
                          TextSpan(text: 'ref'),
                        ],
                      ),
                      textDirection: TextDirection.ltr,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidgetAboveBaseline.1.png'),
    );
  });

  testWidgets('Text Inline widget belowBaseline', (WidgetTester tester) async {
    await tester.pumpWidget(
      Theme(
        data: ThemeData(useMaterial3: false),
        child: Center(
          child: RepaintBoundary(
            child: Material(
              child: Directionality(
                textDirection: TextDirection.ltr,
                child: Container(
                  width: 400.0,
                  height: 200.0,
                  decoration: const BoxDecoration(color: Color(0xff00ff00)),
                  child: ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                    child: const Text.rich(
                      TextSpan(
                        text: 'C ',
                        style: TextStyle(fontSize: 16),
                        children: <InlineSpan>[
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: true, onChanged: null),
                          ),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          TextSpan(text: 'He ', style: TextStyle(fontSize: 20)),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 50.0,
                              height: 55.0,
                              child: DecoratedBox(
                                decoration: BoxDecoration(color: Color(0xffffff00)),
                                child: Center(
                                  child: SizedBox(
                                    width: 10.0,
                                    height: 15.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xffff0000)),
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ),
                          TextSpan(text: 'hello world! seize the day!'),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.belowBaseline,
                            baseline: TextBaseline.alphabetic,
                            child: Text('embedded'),
                          ),
                          TextSpan(text: 'ref'),
                        ],
                      ),
                      textDirection: TextDirection.ltr,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidgetBelowBaseline.1.png'),
    );
  });

  testWidgets('Text Inline widget top', (WidgetTester tester) async {
    await tester.pumpWidget(
      Theme(
        data: ThemeData(useMaterial3: false),
        child: Center(
          child: RepaintBoundary(
            child: Material(
              child: Directionality(
                textDirection: TextDirection.ltr,
                child: Container(
                  width: 400.0,
                  height: 200.0,
                  decoration: const BoxDecoration(color: Color(0xff00ff00)),
                  child: ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                    child: const Text.rich(
                      TextSpan(
                        text: 'C ',
                        style: TextStyle(fontSize: 16),
                        children: <InlineSpan>[
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: true, onChanged: null),
                          ),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          TextSpan(text: 'He ', style: TextStyle(fontSize: 20)),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 50.0,
                              height: 55.0,
                              child: DecoratedBox(
                                decoration: BoxDecoration(color: Color(0xffffff00)),
                                child: Center(
                                  child: SizedBox(
                                    width: 10.0,
                                    height: 15.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xffff0000)),
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ),
                          TextSpan(text: 'hello world! seize the day!'),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.top,
                            baseline: TextBaseline.alphabetic,
                            child: Text('embedded'),
                          ),
                          TextSpan(text: 'ref'),
                        ],
                      ),
                      textDirection: TextDirection.ltr,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidgetTop.1.png'),
    );
  });

  testWidgets('Text Inline widget middle', (WidgetTester tester) async {
    await tester.pumpWidget(
      Theme(
        data: ThemeData(useMaterial3: false),
        child: Center(
          child: RepaintBoundary(
            child: Material(
              child: Directionality(
                textDirection: TextDirection.ltr,
                child: Container(
                  width: 400.0,
                  height: 200.0,
                  decoration: const BoxDecoration(color: Color(0xff00ff00)),
                  child: ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 200, maxHeight: 100),
                    child: const Text.rich(
                      TextSpan(
                        text: 'C ',
                        style: TextStyle(fontSize: 16),
                        children: <InlineSpan>[
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: true, onChanged: null),
                          ),
                          WidgetSpan(child: Checkbox(value: false, onChanged: null)),
                          TextSpan(text: 'He ', style: TextStyle(fontSize: 20)),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 50.0,
                              height: 55.0,
                              child: DecoratedBox(
                                decoration: BoxDecoration(color: Color(0xffffff00)),
                                child: Center(
                                  child: SizedBox(
                                    width: 10.0,
                                    height: 15.0,
                                    child: DecoratedBox(
                                      decoration: BoxDecoration(color: Color(0xffff0000)),
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          ),
                          TextSpan(text: 'hello world! seize the day!'),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: Checkbox(value: false, onChanged: null),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: SizedBox(
                              width: 20,
                              height: 20,
                              child: Checkbox(value: true, onChanged: null),
                            ),
                          ),
                          WidgetSpan(
                            alignment: PlaceholderAlignment.middle,
                            baseline: TextBaseline.alphabetic,
                            child: Text('embedded'),
                          ),
                          TextSpan(text: 'ref'),
                        ],
                      ),
                      textDirection: TextDirection.ltr,
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextInlineWidgetMiddle.1.png'),
    );
  });

  testWidgets('Text TextHeightBehavior', (WidgetTester tester) async {
    await tester.pumpWidget(
      Center(
        child: RepaintBoundary(
          child: Container(
            width: 200.0,
            height: 700.0,
            decoration: const BoxDecoration(color: Color(0xff00ff00)),
            child: const Column(
              children: <Widget>[
                Text(
                  'Hello\nLine 2\nLine 3',
                  textDirection: TextDirection.ltr,
                  style: TextStyle(height: 5),
                ),
                Text(
                  'Hello\nLine 2\nLine 3',
                  textDirection: TextDirection.ltr,
                  style: TextStyle(height: 5),
                  textHeightBehavior: TextHeightBehavior(
                    applyHeightToFirstAscent: false,
                    applyHeightToLastDescent: false,
                  ),
                ),
                Text(
                  'Hello',
                  textDirection: TextDirection.ltr,
                  style: TextStyle(height: 5),
                  textHeightBehavior: TextHeightBehavior(applyHeightToFirstAscent: false),
                ),
              ],
            ),
          ),
        ),
      ),
    );
    await expectLater(
      find.byType(Container),
      matchesGoldenFile('text_golden.TextHeightBehavior.1.png'),
    );
  });
}
