/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Matthias Wienand (itemis AG) - contribution for Bugzilla #355997
*
*******************************************************************************/
package org.eclipse.gef.geometry.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.eclipse.gef.geometry.euclidean.Angle;
import org.eclipse.gef.geometry.internal.utils.PrecisionUtils;
import org.eclipse.gef.geometry.planar.Dimension;
import org.eclipse.gef.geometry.planar.Line;
import org.eclipse.gef.geometry.planar.Path.Segment;
import org.eclipse.gef.geometry.planar.Point;
import org.eclipse.gef.geometry.planar.Polygon;
import org.eclipse.gef.geometry.planar.Rectangle;
import org.junit.Test;
/**
* Unit tests for {@link Rectangle}.
*
* @author sshaw
* @author ahunter
* @author anyssen
* @author mwienand
*
*/
public class RectangleTests {
private interface IAction {
void action(Rectangle rect, Point tl, Point br);
}
private static final double PRECISION_FRACTION = TestUtils
.getPrecisionFraction();
private static final double RECOGNIZABLE_FRACTION = PRECISION_FRACTION
+ PRECISION_FRACTION / 10;
private static final double UNRECOGNIZABLE_FRACTION = PRECISION_FRACTION
- PRECISION_FRACTION / 10;
private void forRectangles(IAction action) {
for (double x1 = -2; x1 <= 2; x1 += 0.4) {
for (double y1 = -2; y1 <= 2; y1 += 0.4) {
Point p1 = new Point(x1, y1);
for (double x2 = -2; x2 <= 2; x2 += 0.4) {
for (double y2 = -2; y2 <= 2; y2 += 0.4) {
Point p2 = new Point(x2, y2);
action.action(new Rectangle(p1, p2), Point.min(p1, p2),
Point.max(p1, p2));
}
}
}
}
}
private Polygon fromRectangle(double x, double y, double w, double h) {
return new Polygon(x, y, x + w, y, x + w, y + h, x, y + h);
}
@Test
public void test_clone() {
Rectangle preciseRect = new Rectangle(-9.486614173228347,
-34.431496062992125, 41.99055118110236, 25.92755905511811);
Rectangle clone = (Rectangle) preciseRect.clone();
assertTrue(preciseRect.equals(clone));
assertFalse(preciseRect == clone);
}
@Test
public void test_contains_Point() {
Rectangle preciseRect = new Rectangle(-9.486614173228347,
-34.431496062992125, 41.99055118110236, 25.92755905511811);
// test border points
Point topLeft = preciseRect.getTopLeft();
assertTrue(preciseRect.contains(topLeft));
assertTrue(preciseRect.contains(topLeft.x, topLeft.y));
assertFalse(preciseRect.contains(topLeft.getTranslated(
-RECOGNIZABLE_FRACTION, -RECOGNIZABLE_FRACTION)));
Point top = preciseRect.getTop();
assertTrue(preciseRect.contains(top));
assertTrue(preciseRect.contains(top.x, top.y));
assertFalse(preciseRect
.contains(top.getTranslated(0, -RECOGNIZABLE_FRACTION)));
Point topRight = preciseRect.getTopRight();
assertTrue(preciseRect.contains(topRight));
assertTrue(preciseRect.contains(topRight.x, topRight.y));
assertFalse(preciseRect.contains(topRight
.getTranslated(RECOGNIZABLE_FRACTION, -RECOGNIZABLE_FRACTION)));
Point left = preciseRect.getLeft();
assertTrue(preciseRect.contains(left));
assertTrue(preciseRect.contains(left.x, left.y));
assertFalse(preciseRect
.contains(left.getTranslated(-RECOGNIZABLE_FRACTION, 0)));
Point right = preciseRect.getRight();
assertTrue(preciseRect.contains(right));
assertTrue(preciseRect.contains(right.x, right.y));
assertFalse(preciseRect
.contains(right.getTranslated(RECOGNIZABLE_FRACTION, 0)));
Point bottomLeft = preciseRect.getBottomLeft();
assertTrue(preciseRect.contains(bottomLeft));
assertTrue(preciseRect.contains(bottomLeft.x, bottomLeft.y));
assertFalse(preciseRect.contains(bottomLeft
.getTranslated(-RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION)));
Point bottom = preciseRect.getBottom();
assertTrue(preciseRect.contains(bottom));
assertTrue(preciseRect.contains(bottom.x, bottom.y));
assertFalse(preciseRect
.contains(bottom.getTranslated(0, RECOGNIZABLE_FRACTION)));
Point bottomRight = preciseRect.getBottomRight();
assertTrue(preciseRect.contains(bottomRight));
assertTrue(preciseRect.contains(bottomRight.x, bottomRight.y));
assertFalse(preciseRect.contains(bottomRight
.getTranslated(RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION)));
}
@Test
public void test_contains_Rectangle() {
Rectangle preciseRect = new Rectangle(-9.486614173228347,
-34.431496062992125, 41.99055118110236, 25.92755905511811);
// test self containment
assertTrue(preciseRect.contains(preciseRect));
assertFalse(preciseRect.contains(preciseRect
.getExpanded(RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION)));
// test precision tolerance, therefore increment by an amount not
// 'recognizable'
Rectangle unrecognizableExpanded = preciseRect.getExpanded(
UNRECOGNIZABLE_FRACTION, UNRECOGNIZABLE_FRACTION, 0, 0);
Rectangle unrecognizableShrinked = preciseRect.getShrinked(0, 0,
UNRECOGNIZABLE_FRACTION, UNRECOGNIZABLE_FRACTION);
// contains should not recognized the changes
assertTrue(preciseRect.contains(unrecognizableExpanded));
assertTrue(preciseRect.contains(unrecognizableShrinked));
assertTrue(unrecognizableExpanded.contains(preciseRect));
assertTrue(unrecognizableShrinked.contains(preciseRect));
assertTrue(unrecognizableExpanded.contains(unrecognizableShrinked));
// now increment by an amount 'recognizable'
Rectangle recognizableExpanded = preciseRect.getExpanded(
RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION, 0, 0);
Rectangle recognizableShrinked = preciseRect.getShrinked(0, 0,
RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION);
// contains should now recognized the changes
assertFalse(preciseRect.contains(recognizableExpanded));
assertTrue(recognizableExpanded.contains(preciseRect));
assertFalse(recognizableShrinked.contains(preciseRect));
assertFalse(recognizableShrinked.contains(recognizableExpanded));
// Regression test for a contains() bug that caused false positives for
// a "containing" Rectangle with smaller x and y coordinates and greater
// width and height as the "contained" one.
assertFalse(new Rectangle(0, 0, 100, 100)
.contains(new Rectangle(200, 200, 1, 1)));
}
@Test
public void test_equals() {
Rectangle preciseRect = new Rectangle(-9.486614173228347,
-34.431496062992125, 41.99055118110236, 25.92755905511811);
assertTrue(preciseRect.equals(preciseRect));
assertTrue(preciseRect.equals(preciseRect.getCopy()));
assertTrue(preciseRect.equals(preciseRect.clone()));
assertFalse(preciseRect.equals(null));
assertFalse(preciseRect.equals(new Object()));
// test precision tolerance, therefore increment by an amount not
// 'recognizable'
Rectangle unrecognizableExpanded = preciseRect.getExpanded(
UNRECOGNIZABLE_FRACTION, UNRECOGNIZABLE_FRACTION, 0, 0);
Rectangle unrecognizableShrinked = preciseRect.getShrinked(0, 0,
UNRECOGNIZABLE_FRACTION, UNRECOGNIZABLE_FRACTION);
// equals should not recognize the changes
assertTrue(preciseRect.equals(unrecognizableExpanded));
assertTrue(preciseRect.equals(unrecognizableShrinked));
// increment by an amount 'recognizable'
Rectangle recognizableExpanded = preciseRect.getExpanded(
RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION, 0, 0);
Rectangle recognizableShrinked = preciseRect.getShrinked(0, 0,
RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION);
// equals should now recognize the changes
assertFalse(preciseRect.equals(recognizableExpanded));
assertFalse(preciseRect.equals(recognizableShrinked));
assertFalse(recognizableExpanded.equals(recognizableShrinked));
}
@Test
public void test_getBounds() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
assertEquals(rect, rect.getBounds());
}
});
}
@Test
public void test_getCopy() {
Rectangle preciseRect = new Rectangle(-9.486614173228347,
-34.431496062992125, 41.99055118110236, 25.92755905511811);
Rectangle copy = preciseRect.getCopy();
assertTrue(preciseRect.equals(copy));
assertFalse(preciseRect == copy);
}
@Test
public void test_getIntersected() {
Rectangle r1 = new Rectangle(0, 0, 10, 10);
// check no intersection, containment, partial intersection and identity
assertEquals(new Rectangle(),
r1.getIntersected(new Rectangle(-20, -20, 5, 5)));
assertEquals(new Rectangle(5, 5, 5, 5),
r1.getIntersected(new Rectangle(5, 5, 10, 10)));
assertEquals(new Rectangle(2, 2, 6, 6),
r1.getIntersected(new Rectangle(2, 2, 6, 6)));
assertEquals(r1, r1.getIntersected(r1));
}
@Test
public void test_getLocation() {
Rectangle r1 = new Rectangle(5, 10, 1, 2);
assertEquals(new Point(5, 10), r1.getLocation());
}
@Test
public void test_getRotatedCCW() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
assertEquals(
fromRectangle(tl.x, tl.y - rect.getWidth(),
rect.getHeight(), rect.getWidth()),
rect.getRotatedCCW(Angle.fromDeg(90),
rect.getLocation()));
}
});
}
@Test
public void test_getRotatedCW() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
Polygon expected = fromRectangle(tl.x - rect.getHeight(), tl.y,
rect.getHeight(), rect.getWidth());
Polygon rotatedCW = rect.getRotatedCW(Angle.fromDeg(90),
rect.getLocation());
// DEBUG
// if (!expected.equals(rotatedCW))
// throw new IllegalStateException("");
assertEquals(expected, rotatedCW);
}
});
}
@Test
public void test_getScaled() {
Rectangle rect = new Rectangle(-9.486614173228347, -34.431496062992125,
41.99055118110236, 25.92755905511811)
.getScaled(26.458333333333332)
.getScaled(1.0 / 26.458333333333332);
assertTrue(PrecisionUtils.equal(-9.486614173228347, rect.getX()));
assertTrue(PrecisionUtils.equal(-34.431496062992125, rect.getY()));
assertTrue(PrecisionUtils.equal(41.99055118110236, rect.getWidth()));
assertTrue(PrecisionUtils.equal(25.92755905511811, rect.getHeight()));
rect = new Rectangle(-9.486614173228347, -34.431496062992125,
2 * 9.486614173228347, 34.431496062992125).getScaled(2, 0);
assertTrue(PrecisionUtils.equal(2 * -9.486614173228347, rect.getX()));
assertTrue(
PrecisionUtils.equal(0.5 * -34.431496062992125, rect.getY()));
assertTrue(
PrecisionUtils.equal(4 * 9.486614173228347, rect.getWidth()));
assertTrue(PrecisionUtils.equal(0, rect.getHeight()));
// TODO: is this the desired behavior?
// assertTrue(PrecisionUtils.equal(-9.486614173228347, rect.getX()));
// assertTrue(PrecisionUtils.equal(-34.431496062992125, rect.getY()));
// assertTrue(PrecisionUtils.equal(2 * 41.99055118110236,
// rect.getWidth()));
// assertTrue(PrecisionUtils.equal(0, rect.getHeight()));
}
@Test
public void test_getSegments() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
Line[] segments = rect.getOutlineSegments();
// segments are top, right, bottom, left. in order.
Point tr = tl.getTranslated(br.x - tl.x, 0);
Point bl = tl.getTranslated(0, br.y - tl.y);
assertEquals(new Line(tl, tr), segments[0]);
assertEquals(new Line(tr, br), segments[1]);
assertEquals(new Line(br, bl), segments[2]);
assertEquals(new Line(bl, tl), segments[3]);
}
});
}
@Test
public void test_getSize() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
assertEquals(new Dimension(br.x - tl.x, br.y - tl.y),
rect.getSize());
}
});
}
@Test
public void test_getTranslated() {
Rectangle r1 = new Rectangle(1, 2, 3, 4);
assertEquals(new Rectangle(0, 3, 3, 4),
r1.getTranslated(new Point(-1, 1)));
assertEquals(new Rectangle(0, 3, 3, 4), r1.getTranslated(-1, 1));
}
@Test
public void test_getTransposed() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
assertEquals(
new Rectangle(tl.y, tl.x, br.y - tl.y, br.x - tl.x),
rect.getTransposed());
}
});
}
@Test
public void test_getUnioned_with_Point() {
Rectangle r1 = new Rectangle(1, 2, 2, 2);
// check union with coordinates left, on-left, center, on-right, right
// and above, on-top, center, on-bottom, below, respectively
assertEquals(new Rectangle(0, 1, 3, 3), r1.getUnioned(new Point(0, 1)));
assertEquals(new Rectangle(0, 2, 3, 2), r1.getUnioned(new Point(0, 2)));
assertEquals(new Rectangle(0, 2, 3, 2), r1.getUnioned(new Point(0, 3)));
assertEquals(new Rectangle(0, 2, 3, 2), r1.getUnioned(new Point(0, 4)));
assertEquals(new Rectangle(0, 2, 3, 3), r1.getUnioned(new Point(0, 5)));
assertEquals(new Rectangle(1, 1, 2, 3), r1.getUnioned(new Point(1, 1)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(1, 2)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(1, 3)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(1, 4)));
assertEquals(new Rectangle(1, 2, 2, 3), r1.getUnioned(new Point(1, 5)));
assertEquals(new Rectangle(1, 1, 2, 3), r1.getUnioned(new Point(2, 1)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(2, 2)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(2, 3)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(2, 4)));
assertEquals(new Rectangle(1, 2, 2, 3), r1.getUnioned(new Point(2, 5)));
assertEquals(new Rectangle(1, 1, 2, 3), r1.getUnioned(new Point(3, 1)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(3, 2)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(3, 3)));
assertEquals(new Rectangle(1, 2, 2, 2), r1.getUnioned(new Point(3, 4)));
assertEquals(new Rectangle(1, 2, 2, 3), r1.getUnioned(new Point(3, 5)));
assertEquals(new Rectangle(1, 1, 3, 3), r1.getUnioned(new Point(4, 1)));
assertEquals(new Rectangle(1, 2, 3, 2), r1.getUnioned(new Point(4, 2)));
assertEquals(new Rectangle(1, 2, 3, 2), r1.getUnioned(new Point(4, 3)));
assertEquals(new Rectangle(1, 2, 3, 2), r1.getUnioned(new Point(4, 4)));
assertEquals(new Rectangle(1, 2, 3, 3), r1.getUnioned(new Point(4, 5)));
}
@Test
public void test_getUnioned_with_Rectangle() {
Rectangle r1 = new Rectangle(1, 2, 2, 2);
// containment
Rectangle contained = new Rectangle(1.5, 2.5, 1, 1);
assertEquals(r1, r1.getUnioned(contained));
Rectangle contains = new Rectangle(0, 1, 4, 4);
assertEquals(contains, r1.getUnioned(contains));
// corners
Rectangle tl = new Rectangle(0, 1, 2, 2);
assertEquals(new Rectangle(0, 1, 3, 3), r1.getUnioned(tl));
Rectangle tr = new Rectangle(2, 1, 2, 2);
assertEquals(new Rectangle(1, 1, 3, 3), r1.getUnioned(tr));
Rectangle bl = new Rectangle(0, 3, 2, 2);
assertEquals(new Rectangle(0, 2, 3, 3), r1.getUnioned(bl));
Rectangle br = new Rectangle(2, 3, 2, 2);
assertEquals(new Rectangle(1, 2, 3, 3), r1.getUnioned(br));
}
@Test
public void test_intersects_with_Line() {
Rectangle r1 = new Rectangle(-5, -5, 10, 10);
for (Line seg : r1.getOutlineSegments()) {
assertTrue(r1.touches(seg));
}
assertTrue(r1.touches(new Line(r1.getTopLeft(), r1.getBottomRight())));
assertTrue(r1.touches(new Line(r1.getTop(), r1.getBottom())));
assertTrue(r1.touches(new Line(-10, 0, 10, 0)));
assertFalse(r1.touches(new Line(-10, 0, -6, 0)));
assertFalse(r1.touches(new Line(0, -10, 0, -6)));
assertFalse(r1.touches(new Line(10, 0, 6, 0)));
assertFalse(r1.touches(new Line(0, 10, 0, 6)));
}
@Test
public void test_intersects_with_Rectangle() {
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(0, 0, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(50, 50, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(100, 100, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(-100, -100, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(-50, 0, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(-100, 0, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(50, 0, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(100, 0, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(0, -50, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(0, -100, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(0, 50, 100, 100)));
assertTrue(new Rectangle(0, 0, 100, 100)
.touches(new Rectangle(0, 100, 100, 100)));
}
@Test
public void test_isEmpty() {
assertFalse(new Rectangle(0, 0, 10, 10).isEmpty());
assertTrue(new Rectangle(0, 0, 0, 10).isEmpty());
assertTrue(new Rectangle(0, 0, 10, 0).isEmpty());
assertTrue(new Rectangle(0, 0, -10, 10).isEmpty());
assertTrue(new Rectangle(0, 0, 10, -10).isEmpty());
assertTrue(new Rectangle(0, 0, UNRECOGNIZABLE_FRACTION, 10).isEmpty());
assertTrue(new Rectangle(0, 0, 10, UNRECOGNIZABLE_FRACTION).isEmpty());
assertFalse(new Rectangle(0, 0, RECOGNIZABLE_FRACTION, 10).isEmpty());
assertFalse(new Rectangle(0, 0, 10, RECOGNIZABLE_FRACTION).isEmpty());
}
@Test
public void test_new() {
Point topLeft = new Point(0, 0);
Point topRight = new Point(10, 0);
Point bottomLeft = new Point(0, 10);
Point bottomRight = new Point(10, 10);
Rectangle rect1 = new Rectangle(topLeft, bottomRight);
Rectangle rect2 = new Rectangle(topRight, bottomLeft);
assertEquals(rect1, rect2);
Dimension size = new Dimension(10, 10);
Rectangle rect3 = new Rectangle(topLeft, size);
assertEquals(rect2, rect3);
Rectangle rect4 = new Rectangle(0, 0, 10, 10);
assertEquals(rect3, rect4);
// negative width/height?
assertEquals(new Rectangle(), new Rectangle(0, 0, -10, -10));
assertEquals(new Rectangle(5, 5, 0, 10), new Rectangle(5, 5, -10, 10));
assertEquals(new Rectangle(5, 5, 10, 0), new Rectangle(5, 5, 10, -10));
assertEquals(new Rectangle(),
new Rectangle(new Rectangle(0, 0, -10, -10)));
assertEquals(new Rectangle(5, 5, 0, 10),
new Rectangle(new Rectangle(5, 5, -10, 10)));
assertEquals(new Rectangle(5, 5, 10, 0),
new Rectangle(new Rectangle(5, 5, 10, -10)));
assertEquals(new Rectangle(),
new Rectangle(new Point(0, 0), new Dimension(-10, -10)));
assertEquals(new Rectangle(5, 5, 0, 10),
new Rectangle(new Point(5, 5), new Dimension(-10, 10)));
assertEquals(new Rectangle(5, 5, 10, 0),
new Rectangle(new Point(5, 5), new Dimension(10, -10)));
assertEquals(new Rectangle(-10, -10, 10, 10),
new Rectangle(new Point(0, 0), new Point(-10, -10)));
assertEquals(new Rectangle(-10, 5, 15, 5),
new Rectangle(new Point(5, 5), new Point(-10, 10)));
assertEquals(new Rectangle(5, -10, 5, 15),
new Rectangle(new Point(5, 5), new Point(10, -10)));
}
@Test
public void test_scale() {
Rectangle rect = new Rectangle(-9.486614173228347, -34.431496062992125,
41.99055118110236, 25.92755905511811);
rect.scale(26.458333333333332);
rect.scale(1.0 / 26.458333333333332);
assertTrue(PrecisionUtils.equal(-9.486614173228347, rect.getX()));
assertTrue(PrecisionUtils.equal(-34.431496062992125, rect.getY()));
assertTrue(PrecisionUtils.equal(41.99055118110236, rect.getWidth()));
assertTrue(PrecisionUtils.equal(25.92755905511811, rect.getHeight()));
}
@Test
public void test_setBounds() {
Rectangle r = new Rectangle();
r.setBounds(new Rectangle(10, 10, 10, 10));
assertEquals(new Point(10, 10), r.getTopLeft());
assertEquals(new Point(20, 20), r.getBottomRight());
r.setBounds(new Point(-5, -5), new Dimension(5, 5));
assertEquals(new Point(-5, -5), r.getTopLeft());
assertEquals(new Point(), r.getBottomRight());
r.setBounds(3, 2, 1, 0);
assertEquals(new Point(3, 2), r.getTopLeft());
assertEquals(new Point(4, 2), r.getBottomRight());
}
@Test
public void test_setSize() {
Rectangle r = new Rectangle();
r.setSize(new Dimension(10, 20));
assertEquals(new Point(), r.getTopLeft());
assertEquals(new Point(10, 20), r.getBottomRight());
r.setSize(5, -10);
assertEquals(new Point(), r.getTopLeft());
assertEquals(new Point(5, 0), r.getBottomRight());
r.setSize(-5, 10);
assertEquals(new Point(), r.getTopLeft());
assertEquals(new Point(0, 10), r.getBottomRight());
}
@Test
public void test_setters() {
Rectangle r = new Rectangle();
r.setX(10);
assertTrue(PrecisionUtils.equal(10, r.getX()));
r.setY(1);
assertTrue(PrecisionUtils.equal(1, r.getY()));
r.setWidth(5);
assertTrue(PrecisionUtils.equal(5, r.getWidth()));
r.setHeight(6);
assertTrue(PrecisionUtils.equal(6, r.getHeight()));
r.setWidth(-10);
assertTrue(PrecisionUtils.equal(0, r.getWidth()));
r.setHeight(-1);
assertTrue(PrecisionUtils.equal(0, r.getHeight()));
}
@Test
public void test_shrink() {
Rectangle prect = new Rectangle(new Rectangle(100, 100, 250, 250));
Rectangle copy = prect.getCopy();
prect.translate(30, 30);
prect.scale(2f);
prect.shrink(2, 2, 2, 2);
prect.scale(1 / 2f);
prect.translate(-30, -30);
prect = new Rectangle(new Rectangle(0, 0, 3, 3));
copy = prect.getCopy();
prect.translate(1, 1);
prect.scale(4f);
prect.shrink(1, 1, -1, -1);
prect.scale(1 / 4f);
prect.translate(-1, -1);
assertTrue(!prect.equals(copy));
}
@Test
public void test_shrink_AND_expand() {
Rectangle preciseRect = new Rectangle(-9.486614173228347,
-34.431496062992125, 41.99055118110236, 25.92755905511811);
Rectangle recognizableExpanded = preciseRect
.getExpanded(RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION);
Rectangle recognizableShrinked = preciseRect
.getShrinked(RECOGNIZABLE_FRACTION, RECOGNIZABLE_FRACTION);
assertFalse(preciseRect.equals(recognizableExpanded));
assertFalse(preciseRect.equals(recognizableShrinked));
assertFalse(recognizableExpanded.equals(recognizableShrinked));
recognizableExpanded.shrink(RECOGNIZABLE_FRACTION,
RECOGNIZABLE_FRACTION);
recognizableShrinked.expand(RECOGNIZABLE_FRACTION,
RECOGNIZABLE_FRACTION);
assertEquals(preciseRect, recognizableExpanded);
assertEquals(preciseRect, recognizableShrinked);
}
public void test_toPath() {
Rectangle r = new Rectangle(50, 100, 200, 300);
Segment[] segments = r.toPath().getSegments();
// check path is closed
assertTrue(segments[segments.length - 1].getType() == Segment.CLOSE);
}
@Test
public void test_toPolygon() {
Point[] points = new Point[] { new Point(10, 10),
new Point(10 + 25, 10), new Point(10 + 25, 10 + 50),
new Point(10, 10 + 50) };
Rectangle r = new Rectangle(points[0], points[2]);
Polygon pr = new Polygon(points);
assertTrue(pr.equals(r.toPolygon()));
}
@Test
public void test_toString() {
Rectangle r = new Rectangle();
assertEquals("Rectangle: (0.0, 0.0, 0.0, 0.0)", r.toString());
}
@Test
public void test_union() {
// check union behaves like constructor
Point p1 = new Point(0, 0);
Point p2 = new Point(10, 10);
Rectangle origRect = new Rectangle();
origRect.setLocation(p1);
origRect.union(p2);
assertEquals(origRect, new Rectangle(p1, p2));
Point p3 = new Point(5, 5);
assertEquals(origRect, new Rectangle(p1, p3).union(origRect));
}
@Test
public void testBorderPointsCalculation() {
forRectangles(new IAction() {
@Override
public void action(Rectangle rect, Point tl, Point br) {
Point to = new Point((tl.x + br.x) / 2, tl.y);
Point le = new Point(tl.x, (tl.y + br.y) / 2);
Point tr = new Point(br.x, tl.y);
Point ri = new Point(br.x, le.y);
Point bl = new Point(tl.x, br.y);
Point bo = new Point(to.x, br.y);
Point ce = new Point(to.x, le.y);
assertEquals(tl, rect.getTopLeft());
assertEquals(to, rect.getTop());
assertEquals(tr, rect.getTopRight());
assertEquals(le, rect.getLeft());
assertEquals(ri, rect.getRight());
assertEquals(bl, rect.getBottomLeft());
assertEquals(bo, rect.getBottom());
assertEquals(br, rect.getBottomRight());
assertEquals(ce, rect.getCenter());
}
});
}
}