// Copyright 2013 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 'dart:async';

import 'package:test/test.dart';
import 'package:ui/ui.dart' as ui;

/// Tests frame timings in a renderer-agnostic way.
///
/// See CanvasKit-specific and HTML-specific test files `frame_timings_test.dart`.
Future<void> runFrameTimingsTest() async {
  List<ui.FrameTiming>? timings;
  ui.PlatformDispatcher.instance.onReportTimings = (List<ui.FrameTiming> data) {
    timings = data;
  };
  Completer<void> frameDone = Completer<void>();
  ui.PlatformDispatcher.instance.onDrawFrame = () {
    final ui.SceneBuilder sceneBuilder = ui.SceneBuilder();
    sceneBuilder
      ..pushOffset(0, 0)
      ..pop();
    ui.PlatformDispatcher.instance.render(sceneBuilder.build()).then((_) {
      frameDone.complete();
    });
  };

  // Frame 1.
  ui.PlatformDispatcher.instance.scheduleFrame();
  await frameDone.future;
  expect(timings, isNull, reason: "100 ms hasn't passed yet");
  await Future<void>.delayed(const Duration(milliseconds: 150));

  // Frame 2.
  frameDone = Completer<void>();
  ui.PlatformDispatcher.instance.scheduleFrame();
  await frameDone.future;
  expect(timings, hasLength(2), reason: '100 ms passed. 2 frames pumped.');
  for (final ui.FrameTiming timing in timings!) {
    expect(timing.vsyncOverhead, greaterThanOrEqualTo(Duration.zero));
    expect(timing.buildDuration, greaterThanOrEqualTo(Duration.zero));
    expect(timing.rasterDuration, greaterThanOrEqualTo(Duration.zero));
    expect(timing.totalSpan, greaterThanOrEqualTo(Duration.zero));
    expect(timing.layerCacheCount, equals(0));
    expect(timing.layerCacheBytes, equals(0));
    expect(timing.pictureCacheCount, equals(0));
    expect(timing.pictureCacheBytes, equals(0));
  }
}
