// 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(T left, T top, T width, T height)
/// ...
/// The rectangle contains the points with x-coordinate between left and
/// left + width, and with y-coordinate between top and top + height, both
/// inclusive.
/// @description Checks that the rectangle contains the points with x-coordinate
/// between left and left + width, and with y-coordinate between top and
/// top + height, both inclusive.
/// @author ngl@unipro.ru

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

main() {
  Rectangle r = new Rectangle(2, 1, 20, 15);

  for (num i = r.left; i <= r.left + r.width; i++) {
    for (num j = r.top; j <= r.top + r.height; j++) {
      Expect.isTrue(r.containsPoint(new Point(i, j)));
    }
  }
  var step = 1;
  Expect.isFalse(r.containsPoint(new Point(r.left - step, r.top)));
  Expect.isFalse(r.containsPoint(new Point(r.left + r.width + step, r.top)));
  Expect.isFalse(r.containsPoint(new Point(r.left, r.top - step)));
  Expect.isFalse(r.containsPoint(new Point(r.left, r.top + r.height + step)));

  Expect.isFalse(r.containsPoint(new Point(r.left - step, r.top + r.height)));
  Expect.isFalse(
      r.containsPoint(new Point(r.left + r.width + step, r.top + r.height)));
  Expect.isFalse(r.containsPoint(new Point(r.left + r.width, r.top - step)));
  Expect.isFalse(
      r.containsPoint(new Point(r.left + r.width, r.top + r.height + step)));
}
