// 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 'package:flutter/material.dart';
import 'package:flutter_api_samples/material/page_transitions_theme/page_transitions_theme.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('MaterialApp defines a custom PageTransitionsTheme', (WidgetTester tester) async {
    await tester.pumpWidget(
      const example.PageTransitionsThemeApp(),
    );

    final Finder homePage = find.byType(example.HomePage);
    expect(homePage, findsOneWidget);

    final PageTransitionsTheme theme = Theme.of(tester.element(homePage)).pageTransitionsTheme;
    expect(theme.builders, isNotNull);

    // Check defined page transitions builder for each platform.
    for (final TargetPlatform platform in TargetPlatform.values) {
      switch (platform) {
        case TargetPlatform.iOS:
          expect(theme.builders[platform], isA<CupertinoPageTransitionsBuilder>());
        case TargetPlatform.linux:
          expect(theme.builders[platform], isA<OpenUpwardsPageTransitionsBuilder>());
        case TargetPlatform.macOS:
          expect(theme.builders[platform], isA<FadeUpwardsPageTransitionsBuilder>());
        case TargetPlatform.android:
        case TargetPlatform.fuchsia:
        case TargetPlatform.windows:
          expect(theme.builders[platform], isNull);
      }
    }

    // Can navigate to the second page.
    expect(find.text('To SecondPage'), findsOneWidget);
    await tester.tap(find.text('To SecondPage'));
    await tester.pumpAndSettle();

    // Can navigate back to the home page.
    expect(find.text('Back to HomePage'), findsOneWidget);
    await tester.tap(find.text('Back to HomePage'));
    await tester.pumpAndSettle();
    expect(find.text('To SecondPage'), findsOneWidget);
  });
}
