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

// TODO(goderbauer): Delete these tests when the deprecated window property is removed.

import 'dart:ui' as ui show window;
import 'dart:ui';

import 'package:flutter/widgets.dart' show WidgetsBinding;
import 'package:flutter_test/flutter_test.dart';

import 'utils/fake_and_mock_utils.dart';

void main() {
  tearDown(() {
    final TestWindow window = WidgetsBinding.instance.window as TestWindow;
    window.clearAllTestValues();
  });

  test('TestWindow can handle new methods without breaking', () {
    final dynamic testWindow = TestWindow(window: ui.window);
    // ignore: avoid_dynamic_calls
    expect(testWindow.someNewProperty, null);
  });

  testWidgets('TestWindow can fake device pixel ratio', (WidgetTester tester) async {
    verifyPropertyFaked<double>(
      tester: tester,
      realValue: ui.window.devicePixelRatio,
      fakeValue: 2.5,
      propertyRetriever: () {
        return WidgetsBinding.instance.window.devicePixelRatio;
      },
      propertyFaker: (TestWidgetsFlutterBinding binding, double fakeValue) {
        binding.window.devicePixelRatioTestValue = fakeValue;
      },
    );
  });

  testWidgets('TestWindow can fake physical size', (WidgetTester tester) async {
    verifyPropertyFaked<Size>(
      tester: tester,
      realValue: ui.window.physicalSize,
      fakeValue: const Size(50, 50),
      propertyRetriever: () {
        return WidgetsBinding.instance.window.physicalSize;
      },
      propertyFaker: (TestWidgetsFlutterBinding binding, Size fakeValue) {
        binding.window.physicalSizeTestValue = fakeValue;
      },
    );
  });

  testWidgets('TestWindow can fake view insets', (WidgetTester tester) async {
    verifyPropertyFaked<ViewPadding>(
      tester: tester,
      realValue: ui.window.viewInsets,
      fakeValue: FakeViewPadding.zero,
      propertyRetriever: () {
        return WidgetsBinding.instance.window.viewInsets;
      },
      propertyFaker: (TestWidgetsFlutterBinding binding, ViewPadding fakeValue) {
        binding.window.viewInsetsTestValue = fakeValue;
      },
      matcher: matchesViewPadding,
    );
  });

  testWidgets('TestWindow can fake padding', (WidgetTester tester) async {
    verifyPropertyFaked<ViewPadding>(
      tester: tester,
      realValue: ui.window.padding,
      fakeValue: FakeViewPadding.zero,
      propertyRetriever: () {
        return WidgetsBinding.instance.window.padding;
      },
      propertyFaker: (TestWidgetsFlutterBinding binding, ViewPadding fakeValue) {
        binding.window.paddingTestValue = fakeValue;
      },
      matcher: matchesViewPadding
    );
  });

  testWidgets('TestWindow can fake text scale factor', (WidgetTester tester) async {
    verifyPropertyFaked<double>(
      tester: tester,
      realValue: ui.window.textScaleFactor,
      fakeValue: 2.5,
      propertyRetriever: () {
        return WidgetsBinding.instance.window.textScaleFactor;
      },
      propertyFaker: (TestWidgetsFlutterBinding binding, double fakeValue) {
        binding.platformDispatcher.textScaleFactorTestValue = fakeValue;
      },
    );
  });

  testWidgets('TestWindow can fake platform brightness', (WidgetTester tester) async {
    verifyPropertyFaked<Brightness>(
      tester: tester,
      realValue: Brightness.light,
      fakeValue: Brightness.dark,
      propertyRetriever: () {
        return WidgetsBinding.instance.window.platformBrightness;
      },
      propertyFaker: (TestWidgetsFlutterBinding binding, Brightness fakeValue) {
        binding.platformDispatcher.platformBrightnessTestValue = fakeValue;
      },
    );
  });

  testWidgets('TestWindow can clear out fake properties all at once', (WidgetTester tester) async {
    final double originalDevicePixelRatio = ui.window.devicePixelRatio;
    final double originalTextScaleFactor = ui.window.textScaleFactor;
    final TestWindow testWindow = retrieveTestBinding(tester).window;

    // Set fake values for window properties.
    testWindow.devicePixelRatioTestValue = 2.5;
    tester.platformDispatcher.textScaleFactorTestValue = 3.0;

    // Erase fake window property values.
    testWindow.clearAllTestValues();

    // Verify that the window once again reports real property values.
    expect(WidgetsBinding.instance.window.devicePixelRatio, originalDevicePixelRatio);
    expect(WidgetsBinding.instance.window.textScaleFactor, originalTextScaleFactor);
  });

  testWidgets('Updates to window also update tester.view', (WidgetTester tester) async {
    tester.binding.window.devicePixelRatioTestValue = 7;
    tester.binding.window.displayFeaturesTestValue = <DisplayFeature>[const DisplayFeature(bounds: Rect.fromLTWH(0, 0, 20, 300), type: DisplayFeatureType.unknown, state: DisplayFeatureState.unknown)];
    tester.binding.window.paddingTestValue = FakeViewPadding.zero;
    tester.binding.window.physicalSizeTestValue = const Size(505, 805);
    tester.binding.window.systemGestureInsetsTestValue = FakeViewPadding.zero;
    tester.binding.window.viewInsetsTestValue = FakeViewPadding.zero;
    tester.binding.window.viewPaddingTestValue = FakeViewPadding.zero;
    tester.binding.window.gestureSettingsTestValue = const GestureSettings(physicalTouchSlop: 4, physicalDoubleTapSlop: 5);

    expect(tester.binding.window.devicePixelRatio, tester.view.devicePixelRatio);
    expect(tester.binding.window.displayFeatures, tester.view.displayFeatures);
    expect(tester.binding.window.padding, tester.view.padding);
    expect(tester.binding.window.physicalSize, tester.view.physicalSize);
    expect(tester.binding.window.systemGestureInsets, tester.view.systemGestureInsets);
    expect(tester.binding.window.viewInsets, tester.view.viewInsets);
    expect(tester.binding.window.viewPadding, tester.view.viewPadding);
    expect(tester.binding.window.gestureSettings, tester.view.gestureSettings);
  });
}
