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

import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('initialLifecycleState is used to init state paused', (WidgetTester tester) async {
    final TestWidgetsFlutterBinding binding = tester.binding;
    binding.resetInternalState();
    // Use paused as the initial state.
    binding.platformDispatcher.initialLifecycleStateTestValue = 'AppLifecycleState.paused';
    binding.readTestInitialLifecycleStateFromNativeWindow(); // Re-attempt the initialization.

    // The lifecycleState should now be the state we passed above,
    // even though no lifecycle event was fired from the platform.
    expect(binding.lifecycleState.toString(), equals('AppLifecycleState.paused'));
  });
  testWidgets('Handles all of the allowed states of AppLifecycleState', (WidgetTester tester) async {
    final TestWidgetsFlutterBinding binding = tester.binding;
    for (final AppLifecycleState state in AppLifecycleState.values) {
      binding.resetInternalState();
      binding.platformDispatcher.initialLifecycleStateTestValue = state.toString();
      binding.readTestInitialLifecycleStateFromNativeWindow();
      expect(ServicesBinding.instance.lifecycleState.toString(), equals(state.toString()));
    }
  });
  test('AppLifecycleState values are in the right order for the state machine to be correct', () {
    expect(
      AppLifecycleState.values,
      equals(
        <AppLifecycleState>[
          AppLifecycleState.detached,
          AppLifecycleState.resumed,
          AppLifecycleState.inactive,
          AppLifecycleState.hidden,
          AppLifecycleState.paused,
        ],
      ),
    );
  });
}
