// Copyright 2016 The Vanadium 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:test/test.dart";
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:reader/widgets/flutter_demo.dart';

void main() {
  test("Example State test", () {
    testWidgets((WidgetTester tester) {
      GlobalKey key = new GlobalKey();
      tester.pumpWidget(new MaterialApp(
          title: 'Test App',
          routes: <String, WidgetBuilder>{
            '/': (BuildContext context) => new FlutterDemo(key: key)
          }));

      // Test State.
      StatefulElement element = tester.findElementByKey(key);
      FlutterDemoState state = element.state;

      expect(tester.findText("Flutter Demo"), isNotNull);
      expect(tester.findText("Button tapped 0 times."), isNotNull);

      state.incrementCounter();
      // Advance the flutter framework to the next tick.
      tester.pump();

      expect(state.counter, equals(1));
      expect(tester.findText("Button tapped 1 time."), isNotNull);

      // NOTE: There is an animation segue for the floating action button in
      // the material scaffold. The FAB is not tappable during this initial
      // segue, the FAB will not be responsive to tapping until the animation
      // ends at 400ms.
      //
      // SEE: https://git.io/vaLPb
      tester.pump(new Duration(milliseconds: 400));

      // Test Widget input and rendering.
      StatefulElement fab = tester.findElement((Element element) {
        return element.widget is FloatingActionButton;
      });

      expect(fab, isNotNull);

      tester.tap(fab);
      tester.pump();

      expect(state.counter, equals(2));
      expect(tester.findText("Button tapped 2 times."), isNotNull);
    });
  });
}
