// 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 'dart:ui';

import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  late SchedulerBinding binding;

  setUpAll(() {
    WidgetsFlutterBinding.ensureInitialized();
    binding = SchedulerBinding.instance;
  });

  test('PerformanceModeHandler make one request', () async {
    final PerformanceModeRequestHandle? requestHandle = binding.requestPerformanceMode(DartPerformanceMode.latency);
    expect(requestHandle, isNotNull);
    expect(binding.debugGetRequestedPerformanceMode(), equals(DartPerformanceMode.latency));
    requestHandle?.dispose();
    expect(binding.debugGetRequestedPerformanceMode(), isNull);
  });

  test('PerformanceModeHandler make conflicting requests', () async {
    final PerformanceModeRequestHandle? requestHandle1 = binding.requestPerformanceMode(DartPerformanceMode.latency);
    expect(requestHandle1, isNotNull);

    final PerformanceModeRequestHandle? requestHandle2 = binding.requestPerformanceMode(DartPerformanceMode.throughput);
    expect(requestHandle2, isNull);

    expect(binding.debugGetRequestedPerformanceMode(), equals(DartPerformanceMode.latency));

    requestHandle1?.dispose();
    expect(binding.debugGetRequestedPerformanceMode(), isNull);
  });

  test('PerformanceModeHandler revert only after last requestor disposed',
      () async {
    final PerformanceModeRequestHandle? requestHandle1 = binding.requestPerformanceMode(DartPerformanceMode.latency);
    expect(requestHandle1, isNotNull);

    expect(binding.debugGetRequestedPerformanceMode(), equals(DartPerformanceMode.latency));

    final PerformanceModeRequestHandle? requestHandle2 = binding.requestPerformanceMode(DartPerformanceMode.latency);
    expect(requestHandle2, isNotNull);

    expect(binding.debugGetRequestedPerformanceMode(), equals(DartPerformanceMode.latency));
    requestHandle1?.dispose();
    expect(binding.debugGetRequestedPerformanceMode(), equals(DartPerformanceMode.latency));
    requestHandle2?.dispose();
    expect(binding.debugGetRequestedPerformanceMode(), isNull);
  });
}
