// 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() {
  const Rect rect = Rect.fromLTWH(100, 100, 200, 500);
  const Offset outsideTopLeft = Offset(50, 50);
  const Offset outsideLeft = Offset(50, 200);
  const Offset outsideBottomLeft = Offset(50, 700);
  const Offset outsideTop = Offset(200, 50);
  const Offset outsideTopRight = Offset(350, 50);
  const Offset outsideRight = Offset(350, 200);
  const Offset outsideBottomRight = Offset(350, 700);
  const Offset outsideBottom = Offset(200, 700);
  const Offset center = Offset(150, 300);

  group('selection utils', () {
    test('selectionBasedOnRect works', () {
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideTopLeft),
        SelectionResult.previous,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideLeft),
        SelectionResult.previous,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideBottomLeft),
        SelectionResult.next,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideTop),
        SelectionResult.previous,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideTopRight),
        SelectionResult.previous,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideRight),
        SelectionResult.next,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideBottomRight),
        SelectionResult.next,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, outsideBottom),
        SelectionResult.next,
      );
      expect(
        SelectionUtils.getResultBasedOnRect(rect, center),
        SelectionResult.end,
      );
    });

    test('adjustDragOffset works', () {
      // ltr
      expect(SelectionUtils.adjustDragOffset(rect, outsideTopLeft), rect.topLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideLeft), rect.topLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideBottomLeft), rect.bottomRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideTop), rect.topLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideTopRight), rect.topLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideRight), rect.bottomRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideBottomRight), rect.bottomRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideBottom), rect.bottomRight);
      expect(SelectionUtils.adjustDragOffset(rect, center), center);
      // rtl
      expect(SelectionUtils.adjustDragOffset(rect, outsideTopLeft, direction: TextDirection.rtl), rect.topRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideLeft, direction: TextDirection.rtl), rect.topRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideBottomLeft, direction: TextDirection.rtl), rect.bottomLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideTop, direction: TextDirection.rtl), rect.topRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideTopRight, direction: TextDirection.rtl), rect.topRight);
      expect(SelectionUtils.adjustDragOffset(rect, outsideRight, direction: TextDirection.rtl), rect.bottomLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideBottomRight, direction: TextDirection.rtl), rect.bottomLeft);
      expect(SelectionUtils.adjustDragOffset(rect, outsideBottom, direction: TextDirection.rtl), rect.bottomLeft);
      expect(SelectionUtils.adjustDragOffset(rect, center, direction: TextDirection.rtl), center);
    });
  });
}
