// 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 MutableRectangle.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) {
  MutableRectangle r = new MutableRectangle.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);
  MutableRectangle r = new MutableRectangle.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)));
}
