// 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/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('SizedBox constructors', (WidgetTester tester) async {
    const SizedBox a = SizedBox();
    expect(a.width, isNull);
    expect(a.height, isNull);

    const SizedBox b = SizedBox(width: 10.0);
    expect(b.width, 10.0);
    expect(b.height, isNull);

    const SizedBox c = SizedBox(width: 10.0, height: 20.0);
    expect(c.width, 10.0);
    expect(c.height, 20.0);

    final SizedBox d = SizedBox.fromSize();
    expect(d.width, isNull);
    expect(d.height, isNull);

    final SizedBox e = SizedBox.fromSize(size: const Size(1.0, 2.0));
    expect(e.width, 1.0);
    expect(e.height, 2.0);

    const SizedBox f = SizedBox.expand();
    expect(f.width, double.infinity);
    expect(f.height, double.infinity);

    const SizedBox g = SizedBox.shrink();
    expect(g.width, 0.0);
    expect(g.height, 0.0);
  });

  testWidgets('SizedBox - no child', (WidgetTester tester) async {
    final GlobalKey patient = GlobalKey();

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(Size.zero));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          height: 0.0,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(Size.zero));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          width: 0.0,
          height: 0.0,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(Size.zero));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          width: 100.0,
          height: 100.0,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(100.0, 100.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          width: 1000.0,
          height: 1000.0,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(800.0, 600.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox.expand(
          key: patient,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(800.0, 600.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox.shrink(
          key: patient,
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(Size.zero));
  });

  testWidgets('SizedBox - container child', (WidgetTester tester) async {
    final GlobalKey patient = GlobalKey();

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(800.0, 600.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          height: 0.0,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(800.0, 0.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          width: 0.0,
          height: 0.0,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(Size.zero));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          width: 100.0,
          height: 100.0,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(100.0, 100.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox(
          key: patient,
          width: 1000.0,
          height: 1000.0,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(800.0, 600.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox.expand(
          key: patient,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(const Size(800.0, 600.0)));

    await tester.pumpWidget(
      Center(
        child: SizedBox.shrink(
          key: patient,
          child: Container(),
        ),
      ),
    );
    expect(patient.currentContext!.size, equals(Size.zero));
  });

  testWidgets('SizedBox.square tests', (WidgetTester tester) async {
    await tester.pumpWidget(
        const SizedBox.square(
          dimension: 100,
          child: SizedBox.shrink(),
        )
    );

    expect(
      tester.renderObject<RenderConstrainedBox>(find.byType(SizedBox).first).additionalConstraints,
      BoxConstraints.tight(const Size.square(100)),
    );
  });
}