// 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 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:manual_tests/card_collection.dart' as card_collection;

import 'mock_image_http.dart';

void main() {
  testWidgets('Card Collection smoke test', (WidgetTester tester) async {
    HttpOverrides.runZoned<Future<void>>(() async {
      card_collection.main(); // builds the app and schedules a frame but doesn't trigger one
      await tester.pump(); // see https://github.com/flutter/flutter/issues/1865
      await tester.pump(); // triggers a frame

      final Finder navigationMenu = find.byWidgetPredicate((Widget widget) {
        if (widget is Tooltip)
          return widget.message == 'Open navigation menu';
        return false;
      });

      expect(navigationMenu, findsOneWidget);

      await tester.tap(navigationMenu);
      await tester.pump(); // start opening menu
      await tester.pump(const Duration(seconds: 1)); // wait til it's really opened

      // smoke test for various checkboxes
      await tester.tap(find.text('Make card labels editable'));
      await tester.pump();
      await tester.tap(find.text('Let the sun shine'));
      await tester.pump();
      await tester.tap(find.text('Make card labels editable'));
      await tester.pump();
      await tester.tap(find.text('Vary font sizes'));
      await tester.pump();
    }, createHttpClient: createMockImageHttpClient);
  });
}
