// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

class TestBinding extends LiveTestWidgetsFlutterBinding {
  TestBinding();

  int framesBegun = 0;
  int framesDrawn = 0;

  late bool handleBeginFrameMicrotaskRun;

  @override
  void handleBeginFrame(Duration? rawTimeStamp) {
    handleBeginFrameMicrotaskRun = false;
    framesBegun += 1;
    Future<void>.microtask(() { handleBeginFrameMicrotaskRun = true; });
    super.handleBeginFrame(rawTimeStamp);
  }

  @override
  void handleDrawFrame() {
    if (!handleBeginFrameMicrotaskRun) {
      throw "Microtasks scheduled by 'handledBeginFrame' must be run before 'handleDrawFrame'.";
    }
    framesDrawn += 1;
    super.handleDrawFrame();
  }
}

void main() {
  late TestBinding binding;

  setUp(() {
    binding = TestBinding();
  });

  test('test pumpBenchmark() only runs one frame', () async {
    await benchmarkWidgets(
      (WidgetTester tester) async {
        const Key root = Key('root');
        binding.attachRootWidget(Container(key: root));
        await tester.pump();

        expect(binding.framesBegun, greaterThan(0));
        expect(binding.framesDrawn, greaterThan(0));

        final Element appState = tester.element(find.byKey(root));
        binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.benchmark;

        final int startFramesBegun = binding.framesBegun;
        final int startFramesDrawn = binding.framesDrawn;
        expect(startFramesBegun, equals(startFramesDrawn));

        appState.markNeedsBuild();

        await tester.pumpBenchmark(const Duration(milliseconds: 16));

        final int endFramesBegun = binding.framesBegun;
        final int endFramesDrawn = binding.framesDrawn;
        expect(endFramesBegun, equals(endFramesDrawn));

        expect(endFramesBegun, equals(startFramesBegun + 1));
        expect(endFramesDrawn, equals(startFramesDrawn + 1));
      },
      // We are not interested in the performance of the "benchmark", we are just
      // testing the behavior. So it's OK that asserts are enabled.
      mayRunWithAsserts: true,
    );
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/87871
}
