// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// @assertion Rectangle.fromPoints(Point<T> a, Point<T> b)
/// ...
/// The rectangle contains the points with x-coordinate between a.x and b.x, and
/// with y-coordinate between a.y and b.y, both inclusive.
/// @description Checks that the rectangle contains the points with x-coordinate
/// between a.x and b.x, and with y-coordinate between a.y and b.y, both
/// inclusive.
/// @author ngl@unipro.ru

import "dart:math";
import "../../../Utils/expect.dart";

void check(Point p1, Point p2) {
  Rectangle r = new Rectangle.fromPoints(p1, p2);
  Expect.equals(min(p1.x, p2.x), r.left);
  Expect.equals(min(p1.y, p2.y), r.top);
  Expect.equals((p2.x - p1.x).abs(), r.width);
  Expect.equals((p2.y - p1.y).abs(), r.height);
}

main() {
  Point p1 = new Point(2, 1);
  Point p2 = new Point(22, 16);
  Rectangle r = new Rectangle.fromPoints(p1, p2);

  for (num i = p1.x; i <= p2.x; i++) {
    for (num j = p1.y; j <= p2.y; j++) {
      Expect.isTrue(r.containsPoint(new Point(i, j)));
    }
  }
  var step = 1;
  Expect.isFalse(r.containsPoint(new Point(p1.x, p1.y - step)));
  Expect.isFalse(r.containsPoint(new Point(p1.x, p2.y + step)));
  Expect.isFalse(r.containsPoint(new Point(p1.x - step, p1.y)));
  Expect.isFalse(r.containsPoint(new Point(p2.x + step, p1.y)));

  Expect.isFalse(r.containsPoint(new Point(p1.x - step, p2.y)));
  Expect.isFalse(r.containsPoint(new Point(p2.x + step, p2.y )));
  Expect.isFalse(r.containsPoint(new Point(p2.x, p1.y - step)));
  Expect.isFalse(r.containsPoint(new Point(p2.x, p2.y + step)));
}
