// 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';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.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',
    // TODO(polina-c): remove when fixed https://github.com/flutter/flutter/issues/145600 [leak-tracking-opt-in]
    experimentalLeakTesting: LeakTesting.settings.withTracked(classes: const <String>['CurvedAnimation']),
    (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'),
    );
  });
}
