// 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));
  });
}
