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

void main() {
  testWidgets('Stepper Smoke Test', (WidgetTester tester) async {
    await tester.pumpWidget(
      const example.StepperExampleApp(),
    );

    expect(find.widgetWithText(AppBar, 'Stepper Sample'), findsOneWidget);
    expect(find.text('Step 1 title').hitTestable(), findsOneWidget);
    expect(find.text('Step 2 title').hitTestable(), findsOneWidget);
    expect(find.text('Content for Step 1').hitTestable(), findsOneWidget);
    expect(find.text('Content for Step 2').hitTestable(), findsNothing);
    final Stepper stepper = tester.widget<Stepper>(find.byType(Stepper));

    // current: 0 & clicks cancel
    stepper.onStepCancel?.call();
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsOneWidget);
    expect(find.text('Content for Step 2').hitTestable(), findsNothing);

    // current: 0 & clicks 0th step
    stepper.onStepTapped?.call(0);
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsOneWidget);
    expect(find.text('Content for Step 2').hitTestable(), findsNothing);

    // current: 0 & clicks continue
    stepper.onStepContinue?.call();
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsNothing);
    expect(find.text('Content for Step 2').hitTestable(), findsOneWidget);

    // current: 1 & clicks 1st step
    stepper.onStepTapped?.call(1);
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsNothing);
    expect(find.text('Content for Step 2').hitTestable(), findsOneWidget);

    // current: 1 & clicks continue
    stepper.onStepContinue?.call();
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsNothing);
    expect(find.text('Content for Step 2').hitTestable(), findsOneWidget);

    // current: 1 & clicks cancel
    stepper.onStepCancel?.call();
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsOneWidget);
    expect(find.text('Content for Step 2').hitTestable(), findsNothing);

    // current: 0 & clicks 1st step
    stepper.onStepTapped?.call(1);
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsNothing);
    expect(find.text('Content for Step 2').hitTestable(), findsOneWidget);

    // current: 1 & clicks 0th step
    stepper.onStepTapped?.call(0);
    await tester.pumpAndSettle();
    expect(find.text('Content for Step 1').hitTestable(), findsOneWidget);
    expect(find.text('Content for Step 2').hitTestable(), findsNothing);
  });
}
