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

void main() {
  testWidgets('UserAccountsDrawerHeader test', (WidgetTester tester) async {
    final Key avatarA = const Key('A');
    final Key avatarC = const Key('C');
    final Key avatarD = const Key('D');

    await tester.pumpWidget(
      new Material(
        child: new UserAccountsDrawerHeader(
          currentAccountPicture: new CircleAvatar(
            key: avatarA,
            child: new Text('A')
          ),
          otherAccountsPictures: <Widget>[
            new CircleAvatar(
              child: new Text('B')
            ),
            new CircleAvatar(
              key: avatarC,
              child: new Text('C')
            ),
            new CircleAvatar(
              key: avatarD,
              child: new Text('D')
            ),
            new CircleAvatar(
              child: new Text('E')
            )
          ],
          accountName: new Text("name"),
          accountEmail: new Text("email")
        )
      )
    );

    expect(find.text('A'), findsOneWidget);
    expect(find.text('B'), findsOneWidget);
    expect(find.text('C'), findsOneWidget);
    expect(find.text('D'), findsOneWidget);
    expect(find.text('E'), findsNothing);

    expect(find.text('name'), findsOneWidget);
    expect(find.text('email'), findsOneWidget);

    RenderBox box = tester.renderObject(find.byKey(avatarA));
    expect(box.size.width, equals(72.0));
    expect(box.size.height, equals(72.0));

    box = tester.renderObject(find.byKey(avatarC));
    expect(box.size.width, equals(40.0));
    expect(box.size.height, equals(40.0));

    Point topLeft = tester.getTopLeft(find.byType(UserAccountsDrawerHeader));
    Point topRight = tester.getTopRight(find.byType(UserAccountsDrawerHeader));

    Point avatarATopLeft = tester.getTopLeft(find.byKey(avatarA));
    Point avatarDTopRight = tester.getTopRight(find.byKey(avatarD));
    Point avatarCTopRight = tester.getTopRight(find.byKey(avatarC));

    expect(avatarATopLeft.x - topLeft.x, equals(16.0));
    expect(avatarATopLeft.y - topLeft.y, equals(16.0));
    expect(topRight.x - avatarDTopRight.x, equals(16.0));
    expect(avatarDTopRight.y - topRight.y, equals(16.0));
    expect(avatarDTopRight.x - avatarCTopRight.x, equals(40.0 + 16.0)); // size + space between
  });


  testWidgets('UserAccountsDrawerHeader null parameters', (WidgetTester tester) async {
    Widget buildFrame({
      Widget currentAccountPicture,
      List<Widget> otherAccountsPictures,
      Widget accountName,
      Widget accountEmail,
      VoidCallback onDetailsPressed,
    }) {
      return new Material(
        child: new UserAccountsDrawerHeader(
          currentAccountPicture: currentAccountPicture,
          otherAccountsPictures: otherAccountsPictures,
          accountName: accountName,
          accountEmail: accountEmail,
          onDetailsPressed: onDetailsPressed,
        ),
      );
    }

    await tester.pumpWidget(buildFrame());
    expect(find.byType(Icon), findsNothing);

    await tester.pumpWidget(buildFrame(
      onDetailsPressed: () { },
    ));
    expect(find.byType(Icon), findsOneWidget);

    await tester.pumpWidget(buildFrame(
      accountName: new Text('accountName'),
      onDetailsPressed: () { },
    ));
    expect(
      tester.getCenter(find.text('accountName')).y,
      tester.getCenter(find.byType(Icon)).y
    );

    await tester.pumpWidget(buildFrame(
      accountEmail: new Text('accountEmail'),
      onDetailsPressed: () { },
    ));
    expect(
      tester.getCenter(find.text('accountEmail')).y,
      tester.getCenter(find.byType(Icon)).y
    );

    await tester.pumpWidget(buildFrame(
      accountName: new Text('accountName'),
      accountEmail: new Text('accountEmail'),
      onDetailsPressed: () { },
    ));
    expect(
      tester.getCenter(find.text('accountEmail')).y,
      tester.getCenter(find.byType(Icon)).y
    );
    expect(
      tester.getBottomLeft(find.text('accountEmail')).y,
      greaterThan(tester.getBottomLeft(find.text('accountName')).y)
    );
    expect(
      tester.getBottomLeft(find.text('accountEmail')).x,
      tester.getBottomLeft(find.text('accountName')).x
    );

    await tester.pumpWidget(buildFrame(
      currentAccountPicture: new CircleAvatar(child: new Text('A')),
    ));
    expect(find.text('A'), findsOneWidget);

    await tester.pumpWidget(buildFrame(
      otherAccountsPictures: <Widget>[new CircleAvatar(child: new Text('A'))],
    ));
    expect(find.text('A'), findsOneWidget);

    final Key avatarA = const Key('A');
    await tester.pumpWidget(buildFrame(
      currentAccountPicture: new CircleAvatar(key: avatarA, child: new Text('A')),
      accountName: new Text('accountName'),
    ));
    expect(
      tester.getBottomLeft(find.byKey(avatarA)).x,
      tester.getBottomLeft(find.text('accountName')).x
    );
    expect(
      tester.getBottomLeft(find.text('accountName')).y,
      greaterThan(tester.getBottomLeft(find.byKey(avatarA)).y)
    );
  });
}