// 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_driver/flutter_driver.dart';
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;

Future<void> main() async {
  late FlutterDriver driver;

  setUpAll(() async {
    driver = await FlutterDriver.connect();
  });

  tearDownAll(() {
    driver.close();
  });

  // Run `run_release_test.sh` to also test release engine deferred components code. This
  // drive test runs as debug and thus only tests framework side deferred components handling.
  test('Install and load deferred component', () async {
    final String preloadText = await driver.getText(find.byValueKey('PreloadText'));
    expect(preloadText, 'preload');

    final SerializableFinder fab =
      find.byValueKey('FloatingActionButton');
    await driver.tap(fab);

    final String placeholderText = await driver.getText(find.byValueKey('PlaceholderText'));
    expect(placeholderText, 'placeholder');

    await driver.waitFor(find.byValueKey('DeferredWidget'));

    final String deferredText = await driver.getText(find.byValueKey('DeferredWidget'));
    expect(deferredText, 'DeferredWidget');
    await driver.waitFor(find.byValueKey('DeferredImage'));
  }, timeout: Timeout.none);
}
