// Copyright 2018 The Chromium 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/material.dart';
import 'package:flutter_test/flutter_test.dart';

const ShapeBorder defaultButtonShape = RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(2.0)));
const EdgeInsets defaultButtonPadding = EdgeInsets.only(left: 16.0, right: 16.0);
const BoxConstraints defaultButtonConstraints = BoxConstraints(minWidth: 88.0, minHeight: 36.0);
const Duration defaultButtonDuration = Duration(milliseconds: 200);

void main() {
  group('RaisedButton', () {
    testWidgets('theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: Center(
            child: RaisedButton(
              onPressed: () { }, // button.enabled == true
              child: const Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0xdd000000));
      expect(raw.fillColor, const Color(0xffe0e0e0));
      expect(raw.highlightColor, const Color(0x29000000)); // Was Color(0x66bcbcbc)
      expect(raw.splashColor, const Color(0x1f000000)); // Was Color(0x66c8c8c8)
      expect(raw.elevation, 2.0);
      expect(raw.highlightElevation, 8.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      expect(raw.shape, defaultButtonShape);
      expect(raw.animationDuration, defaultButtonDuration);
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });

    testWidgets('theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: const Center(
            child: RaisedButton(
              onPressed: null, // button.enabled == false
              child: Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0x61000000));
      expect(raw.fillColor, const Color(0x61000000));
      // highlightColor, disabled button can't be pressed
      // splashColor, disabled button doesn't splash
      expect(raw.elevation, 2.0);
      expect(raw.highlightElevation, 8.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      expect(raw.shape, defaultButtonShape);
      expect(raw.animationDuration, defaultButtonDuration);
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });
  });

  group('FlatButton', () {
    testWidgets('theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: Center(
            child: FlatButton(
              onPressed: () { }, // button.enabled == true
              child: const Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0xdd000000));
      expect(raw.fillColor, null);
      expect(raw.highlightColor, const Color(0x29000000)); // Was Color(0x66bcbcbc)
      expect(raw.splashColor, const Color(0x1f000000)); // Was Color(0x66c8c8c8)
      expect(raw.elevation, 0.0);
      expect(raw.highlightElevation, 0.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      expect(raw.shape, defaultButtonShape);
      expect(raw.animationDuration, defaultButtonDuration);
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });

    testWidgets('theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: const Center(
            child: FlatButton(
              onPressed: null, // button.enabled == false
              child: Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0x61000000));
      expect(raw.fillColor, null);
      // highlightColor, disabled button can't be pressed
      // splashColor, disabled button doesn't splash
      expect(raw.elevation, 0.0);
      expect(raw.highlightElevation, 0.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      expect(raw.shape, defaultButtonShape);
      expect(raw.animationDuration, const Duration(milliseconds: 200));
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });
  });

  group('OutlineButton', () {
    testWidgets('theme: ThemeData.light(), enabled: true, highlightElevation: 2.0', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: Center(
            child: OutlineButton(
              onPressed: () { }, // button.enabled == true
              // Causes the button to be filled with the theme's canvasColor
              // instead of Colors.transparent before the button material's
              // elevation is animated to 2.0.
              highlightElevation: 2.0,
              child: const Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0xdd000000));
      expect(raw.fillColor, const Color(0x00fafafa));
      expect(raw.highlightColor, const Color(0x29000000)); // Was Color(0x66bcbcbc)
      expect(raw.splashColor, const Color(0x1f000000)); // Was Color(0x66c8c8c8)
      expect(raw.elevation, 0.0);
      expect(raw.highlightElevation, 0.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      // animationDuration can't be configed by the theme/constructor
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });

    testWidgets('theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: Center(
            child: OutlineButton(
              onPressed: () { }, // button.enabled == true
              child: const Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0xdd000000));
      expect(raw.fillColor, Colors.transparent);
      expect(raw.highlightColor, const Color(0x29000000)); // Was Color(0x66bcbcbc)
      expect(raw.splashColor, const Color(0x1f000000)); // Was Color(0x66c8c8c8)
      expect(raw.elevation, 0.0);
      expect(raw.highlightElevation, 0.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      // animationDuration can't be configed by the theme/constructor
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });

    testWidgets('theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: const Center(
            child: OutlineButton(
              onPressed: null, // button.enabled == false
              child: Text('button'),
            ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.textStyle.color, const Color(0x61000000));
      expect(raw.fillColor, const Color(0x00000000));
      // highlightColor, disabled button can't be pressed
      // splashColor, disabled button doesn't splash
      expect(raw.elevation, 0.0);
      expect(raw.highlightElevation, 0.0);
      expect(raw.disabledElevation, 0.0);
      expect(raw.constraints, defaultButtonConstraints);
      expect(raw.padding, defaultButtonPadding);
      // animationDuration can't be configed by the theme/constructor
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });
  });

  group('FloatingActionButton', () {
    const BoxConstraints defaultFABConstraints = BoxConstraints.tightFor(width: 56.0, height: 56.0);
    const ShapeBorder defaultFABShape = CircleBorder(side: BorderSide(color: Color(0xff000000), width: 0.0, style: BorderStyle.none));
    const EdgeInsets defaultFABPadding = EdgeInsets.zero;

    testWidgets('theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: Center(
              child: FloatingActionButton(
                onPressed: () { }, // button.enabled == true
                child: const Icon(Icons.add),
              ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.enabled, true);
      expect(raw.textStyle.color, const Color(0xffffffff));
      expect(raw.fillColor, const Color(0xff2196f3));
      expect(raw.elevation, 6.0);
      expect(raw.highlightElevation, 12.0);
      expect(raw.disabledElevation, 6.0);
      expect(raw.constraints, defaultFABConstraints);
      expect(raw.padding, defaultFABPadding);
      expect(raw.shape, defaultFABShape);
      expect(raw.animationDuration, defaultButtonDuration);
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });

    testWidgets('theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
      await tester.pumpWidget(
        MaterialApp(
          theme: ThemeData.light(),
          home: const Center(
              child: FloatingActionButton(
                onPressed: null, // button.enabled == false
                child: Icon(Icons.add),
              ),
          ),
        ),
      );

      final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
      expect(raw.enabled, false);
      expect(raw.textStyle.color, const Color(0xffffffff));
      expect(raw.fillColor, const Color(0xff2196f3));
      // highlightColor, disabled button can't be pressed
      // splashColor, disabled button doesn't splash
      expect(raw.elevation, 6.0);
      expect(raw.highlightElevation, 12.0);
      expect(raw.disabledElevation, 6.0);
      expect(raw.constraints, defaultFABConstraints);
      expect(raw.padding, defaultFABPadding);
      expect(raw.shape, defaultFABShape);
      expect(raw.animationDuration, defaultButtonDuration);
      expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
    });
  });
}
