// 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(binding.wrapWithDefaultView(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
}
