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

void main() {
  final LiveTestWidgetsFlutterBinding binding = LiveTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('localToGlobal and globalToLocal calculate correct results', (WidgetTester tester) async {
    tester.view.physicalSize = const Size(2400, 1800);
    tester.view.devicePixelRatio = 3.0;
    final RenderView renderView = RenderView(
      view: tester.view,
      configuration: TestViewConfiguration.fromView(
        view: tester.view,
        size: const Size(400, 200),
      )
    );

    // The configuration above defines a view with a resolution of 2400x1800
    // physical pixels. With a device pixel ratio of 3x, this yields a
    // resolution of 800x600 logical pixels. In this view, a RenderView sized
    // 400x200 (in logical pixels) is fitted using the BoxFit.contain
    // algorithm (as documented on TestViewConfiguration. To fit 400x200 into
    // 800x600 the RenderView is scaled up by 2 to fill the full width and then
    // vertically positioned in the middle. The origin of the RenderView is
    // located at (0, 100) in the logical coordinate space of the view:
    //
    //           View: 800 logical pixels wide (or 2400 physical pixels)
    // +---------------------------------------+
    // |                                       |
    // | 100px                                 |
    // |                                       |
    // +---------------------------------------+
    // |                                       |
    // |     RenderView (400x200px)            |
    // | 400px          scaled to 800x400px    | View: 600 logical pixels high (or 1800 physical pixels)
    // |                                       |
    // |                                       |
    // +---------------------------------------+
    // |                                       |
    // | 200px                                 |
    // |                                       |
    // +---------------------------------------+
    //
    // All values in logical pixels until otherwise noted.
    //
    // A point  can be translated from the local coordinate space of the
    // RenderView (in logical pixels) to the global coordinate space of the View
    // (in logical pixels) by multiplying each coordinate by 2 and adding 100 to
    // the y coordinate. This is what the localToGlobal/globalToLocal methods
    // do:

    expect(binding.localToGlobal(const Offset(0, -50), renderView), Offset.zero);
    expect(binding.localToGlobal(Offset.zero, renderView), const Offset(0, 100));
    expect(binding.localToGlobal(const Offset(200, 100), renderView), const Offset(400, 300));
    expect(binding.localToGlobal(const Offset(150, 75), renderView), const Offset(300, 250));
    expect(binding.localToGlobal(const Offset(400, 200), renderView), const Offset(800, 500));
    expect(binding.localToGlobal(const Offset(400, 400), renderView), const Offset(800, 900));

    expect(binding.globalToLocal(Offset.zero, renderView), const Offset(0, -50));
    expect(binding.globalToLocal(const Offset(0, 100), renderView), Offset.zero);
    expect(binding.globalToLocal(const Offset(400, 300), renderView), const Offset(200, 100));
    expect(binding.globalToLocal(const Offset(300, 250), renderView), const Offset(150, 75));
    expect(binding.globalToLocal(const Offset(800, 500), renderView), const Offset(400, 200));
    expect(binding.globalToLocal(const Offset(800, 900), renderView), const Offset(400, 400));
  });
}