// 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('relayout boundary change does not trigger relayout', (WidgetTester tester) async {
    final RenderLayoutCount renderLayoutCount = RenderLayoutCount();
    final Widget layoutCounter = Center(
      key: GlobalKey(),
      child: WidgetToRenderBoxAdapter(renderBox: renderLayoutCount),
    );

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          width: 100,
          height: 100,
          child: Center(
            child: SizedBox(
              width: 100,
              height: 100,
              child: Center(
                child: layoutCounter,
              ),
            ),
          ),
        ),
      ),
    );

    expect(renderLayoutCount.layoutCount, 1);

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          width: 100,
          height: 100,
          child: layoutCounter,
        ),
      ),
    );

    expect(renderLayoutCount.layoutCount, 1);
  });
}

// This class is needed because LayoutBuilder's RenderObject does not always
// call the builder method in its PerformLayout method.
class RenderLayoutCount extends RenderBox {
  int layoutCount = 0;

  @override
  void performLayout() {
    layoutCount += 1;
    size = constraints.biggest;
  }
}
