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

import '../utils/generate_commit_for_tests.dart';

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

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

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

    Widget buildAuthors({required List<String> names, ThemeData? theme}) {
      final List<Widget> avatars = names
          .map(
            (String name) =>
                CommitAuthorAvatar(commit: generateCommitForTest(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));
    });
  });
}
