// 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;

import 'package:macrobenchmarks/common.dart';

void macroPerfTest(
    String testName,
    String routeName,
    { Duration pageDelay,
      Duration duration = const Duration(seconds: 3),
      Duration timeout = const Duration(seconds: 30),
      Future<void> driverOps(FlutterDriver driver),
      Future<void> setupOps(FlutterDriver driver),
    }) {
  test(testName, () 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);

    if (pageDelay != null) {
      // Wait for the page to load
      await Future<void>.delayed(pageDelay);
    }

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

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

    driver.close();

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