// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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

void main() {
  testWidgets('repaint boundary with constraint changes', (WidgetTester tester) async {
    // Regression test for as https://github.com/flutter/flutter/issues/39151.
    await tester.pumpWidget(const RelayoutBoundariesCrash());
    tester.state<RelayoutBoundariesCrashState>(find.byType(RelayoutBoundariesCrash))._toggleMode();
    await tester.pump();
  });
}

class RelayoutBoundariesCrash extends StatefulWidget {
  const RelayoutBoundariesCrash({Key? key}) : super(key: key);

  @override
  RelayoutBoundariesCrashState createState() => RelayoutBoundariesCrashState();
}

class RelayoutBoundariesCrashState extends State<RelayoutBoundariesCrash> {
  bool _mode = true;

  void _toggleMode() {
    setState(() {
      _mode = !_mode;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: SizedBox(
        // when _mode is true, constraints are tight, otherwise constraints are loose
        width: !_mode ? 100.0 : null,
        height: !_mode ? 100.0 : null,
        child: LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            // Make the outer SizedBoxes relayout without making the Placeholders relayout.
            final double dimension = !_mode ? 10.0 : 20.0;
            return Column(
              children: <Widget>[
                SizedBox(
                  width: dimension,
                  height: dimension,
                  child: const Placeholder(),
                ),
                SizedBox(
                  width: dimension,
                  height: dimension,
                  child: const Placeholder(),
                ),
              ],
            );
          },
        ),
      ),
    );
  }
}
