// Copyright 2020 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/material.dart';
import 'package:flutter_dashboard/model/commit.pb.dart';
import 'package:flutter_dashboard/widgets/commit_author_avatar.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('Author avatars meet guidelines for theme brightness', () {
    List<String> generateInitials() {
      final List<String> names = <String>[];

      for (int i = 65; i <= 90; i++) {
        names.add(String.fromCharCode(i));
      }
      for (int i = 0; i <= 9; i++) {
        names.add(i.toString());
      }
      return names;
    }

    const List<String> longNames = <String>['Michael', 'Thomas', 'Peter', 'Volkert'];

    Widget buildAuthors({required List<String> names, ThemeData? theme}) {
      final List<Widget> avatars = names
          .map(
            (String name) => CommitAuthorAvatar(
              commit: Commit()..author = name,
            ),
          )
          .toList();

      return MaterialApp(
        theme: theme ?? ThemeData.light(),
        home: Scaffold(
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Wrap(children: avatars),
            ],
          ),
        ),
      );
    }

    testWidgets('dark theme', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildAuthors(
          theme: ThemeData.dark(),
          names: generateInitials(),
        ),
      );
      await expectLater(tester, meetsGuideline(textContrastGuideline));
    });

    testWidgets('light theme', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildAuthors(
          names: generateInitials(),
        ),
      );
      await expectLater(tester, meetsGuideline(textContrastGuideline));
    });

    testWidgets('long names, dark theme', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildAuthors(
          theme: ThemeData.dark(),
          names: longNames,
        ),
      );
      await expectLater(tester, meetsGuideline(textContrastGuideline));
    });

    testWidgets('long names, light theme', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildAuthors(names: longNames),
      );
      await expectLater(tester, meetsGuideline(textContrastGuideline));
    });
  });
}
