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

typedef DriverTestCallBack = Future<void> Function(FlutterDriver driver);

Future<void> runDriverTestForRoute(String routeName, DriverTestCallBack body) async {
  final FlutterDriver driver = await FlutterDriver.connect();

  // The slight initial delay avoids starting the timing during a
  // period of increased load on the device. Without this delay, the
  // benchmark has greater noise.
  // See: https://github.com/flutter/flutter/issues/19434
  await Future<void>.delayed(const Duration(milliseconds: 250));

  await driver.forceGC();

  final SerializableFinder scrollable = find.byValueKey(kScrollableName);
  expect(scrollable, isNotNull);
  final SerializableFinder button = find.byValueKey(routeName);
  expect(button, isNotNull);
  await driver.scrollUntilVisible(scrollable, button, dyScroll: -50.0);
  await driver.tap(button);

  await body(driver);

  driver.close();
}

void macroPerfTest(
  String testName,
  String routeName, {
  Duration? pageDelay,
  Duration duration = const Duration(seconds: 3),
  Future<void> Function(FlutterDriver driver)? driverOps,
  Future<void> Function(FlutterDriver driver)? setupOps,
}) {
  test(testName, () async {
    late Timeline timeline;
    await runDriverTestForRoute(routeName, (FlutterDriver driver) async {
      if (pageDelay != null) {
        // Wait for the page to load
        await Future<void>.delayed(pageDelay);
      }

      if (setupOps != null) {
        await setupOps(driver);
      }

      timeline = await driver.traceAction(() async {
        final Future<void> durationFuture = Future<void>.delayed(duration);
        if (driverOps != null) {
          await driverOps(driver);
        }
        await durationFuture;
      });
    });

    expect(timeline, isNotNull);

    final TimelineSummary summary = TimelineSummary.summarize(timeline);
    await summary.writeTimelineToFile(testName, pretty: true);
  }, timeout: Timeout.none);
}
