/*******************************************************************************
* Copyright (c) 2012, 2015 itemis AG 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:
* Matthias Wienand (itemis AG) - initial API and implementation
*
*******************************************************************************/
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.Arc;
import org.eclipse.gef.geometry.planar.BezierCurve;
import org.eclipse.gef.geometry.planar.ICurve;
import org.eclipse.gef.geometry.planar.IGeometry;
import org.eclipse.gef.geometry.planar.Line;
import org.eclipse.gef.geometry.planar.Path;
import org.eclipse.gef.geometry.planar.Path.Segment;
import org.eclipse.gef.geometry.planar.Point;
import org.eclipse.gef.geometry.planar.Rectangle;
import org.eclipse.gef.geometry.planar.RoundedRectangle;
import org.junit.Before;
import org.junit.Test;
public class RoundedRectangleTests {
double x = 1, y = 2, w = 5, h = 6, aw = 1, ah = 2;
RoundedRectangle rr;
private void check_Point_containment(IGeometry g) {
assertTrue(g.contains(new Point(3.5, 5)));
assertTrue(g.contains(new Point(1.5, 5)));
assertTrue(g.contains(new Point(1, 5)));
assertTrue(g.contains(new Point(5.5, 5)));
// TODO: next test is commented out because the AWT Path does not
// recognize points on the right and bottom sides
// assertTrue(g.contains(new Point(6, 5)));
assertTrue(g.contains(new Point(3.5, 2.5)));
assertTrue(g.contains(new Point(3.5, 2)));
assertTrue(g.contains(new Point(3.5, 7.5)));
// TODO: next test is commented out because the AWT Path does not
// recognize points on the right and bottom sides
// assertTrue(g.contains(new Point(3.5, 8)));
assertTrue(g.contains(new Point(1.5, 3.5)));
assertTrue(g.contains(new Point(5.5, 3.5)));
assertTrue(g.contains(new Point(1.5, 6.5)));
assertTrue(g.contains(new Point(5.5, 6.5)));
assertFalse(g.contains(new Point(0, 0)));
assertFalse(g.contains(new Point(4, 0)));
assertFalse(g.contains(new Point(7, 0)));
assertFalse(g.contains(new Point(0, 5)));
assertFalse(g.contains(new Point(7, 5)));
assertFalse(g.contains(new Point(0, 9)));
assertFalse(g.contains(new Point(4, 9)));
assertFalse(g.contains(new Point(7, 9)));
assertFalse(g.contains(new Point(1, 2)));
assertFalse(g.contains(new Point(6, 2)));
assertFalse(g.contains(new Point(1, 8)));
assertFalse(g.contains(new Point(6, 8)));
}
private void check_values_with_getters(RoundedRectangle r, double px,
double py, double pw, double ph, double paw, double pah) {
// verify attributes
assertTrue(PrecisionUtils.equal(px, r.getX()));
assertTrue(PrecisionUtils.equal(py, r.getY()));
assertTrue(PrecisionUtils.equal(pw, r.getWidth()));
assertTrue(PrecisionUtils.equal(ph, r.getHeight()));
assertTrue(PrecisionUtils.equal(paw, r.getArcWidth()));
assertTrue(PrecisionUtils.equal(pah, r.getArcHeight()));
assertEquals(new Point(px, py), r.getLocation());
assertEquals(new Rectangle(px, py, pw, ph), r.getBounds());
// check arcs
assertEquals(new Arc(px + pw - paw, py, paw, pah, Angle.fromDeg(0),
Angle.fromDeg(90)), r.getTopRightArc());
assertEquals(
new Arc(px, py, paw, pah, Angle.fromDeg(90), Angle.fromDeg(90)),
r.getTopLeftArc());
assertEquals(new Arc(px, py + ph - pah, paw, pah, Angle.fromDeg(180),
Angle.fromDeg(90)), r.getBottomLeftArc());
assertEquals(
new Arc(px + pw - paw, py + ph - pah, paw, pah,
Angle.fromDeg(270), Angle.fromDeg(90)),
r.getBottomRightArc());
// check sides
assertEquals(new Line(px + paw / 2, py, px + pw - paw / 2, py),
r.getTop());
assertEquals(
new Line(px + paw / 2, py + ph, px + pw - paw / 2, py + ph),
r.getBottom());
assertEquals(new Line(px, py + pah / 2, px, py + ph - pah / 2),
r.getLeft());
assertEquals(
new Line(px + pw, py + pah / 2, px + pw, py + ph - pah / 2),
r.getRight());
}
@Before
public void setUp() {
rr = new RoundedRectangle(x, y, w, h, aw, ah);
}
@Test
public void test_contains_Point() {
check_Point_containment(rr);
}
@Test
public void test_contains_shape() {
// translate it by some values and test that the translated versions are
// not contained
for (double tx : new double[] { -1, 1 }) {
for (double ty : new double[] { -1, 1 }) {
assertFalse(rr.contains(rr.getTranslated(tx, ty)));
}
}
// scale it down by some values and test that the smaller versions are
// contained
for (double s = 1; s > 0; s -= 0.1) {
assertTrue(rr.contains(rr.getScaled(s)));
}
// scale it up by some values and test that the greater versions are not
// contained
for (double s = 1.1; s < 2; s += 0.1) {
assertFalse(rr.contains(rr.getScaled(s)));
}
}
@Test
public void test_equals() {
assertEquals(rr,
new RoundedRectangle(new Rectangle(x, y, w, h), aw, ah));
assertEquals(rr, rr.getCopy());
assertFalse(rr.equals(null));
assertFalse(rr.equals(new Point()));
assertFalse(rr.equals(new RoundedRectangle(x + 10, y, w, h, aw, ah)));
assertFalse(rr.equals(new RoundedRectangle(x, y + 10, w, h, aw, ah)));
assertFalse(rr.equals(new RoundedRectangle(x, y, w + 10, h, aw, ah)));
assertFalse(rr.equals(new RoundedRectangle(x, y, w, h + 10, aw, ah)));
assertFalse(rr.equals(new RoundedRectangle(x, y, w, h, aw + 10, ah)));
assertFalse(rr.equals(new RoundedRectangle(x, y, w, h, aw, ah + 10)));
}
@Test
public void test_getOutline() {
// coherence with getOutlineSegments
ICurve[] outlineSegments = rr.getOutlineSegments();
BezierCurve[] outlineBeziers = rr.getOutline().toBezier();
assertEquals(outlineSegments.length, outlineBeziers.length);
for (int i = 0; i < 8; i++) {
assertEquals(outlineSegments[i], outlineBeziers[i]);
}
}
@Test
public void test_getOutlineSegments() {
ICurve[] outlineSegments = rr.getOutlineSegments();
assertEquals(8, outlineSegments.length);
// consecutive
for (int i = 0; i < 7; i++) {
assertEquals(outlineSegments[i].getP2(),
outlineSegments[i + 1].getP1());
}
assertEquals(outlineSegments[7].getP2(), outlineSegments[0].getP1());
// position
assertEquals(new Point(x + w, y + ah / 2), outlineSegments[0].getP1());
assertEquals(new Point(x + w - aw / 2, y), outlineSegments[1].getP1());
assertEquals(new Point(x + aw / 2, y), outlineSegments[2].getP1());
assertEquals(new Point(x, y + ah / 2), outlineSegments[3].getP1());
assertEquals(new Point(x, y + h - ah / 2), outlineSegments[4].getP1());
assertEquals(new Point(x + aw / 2, y + h), outlineSegments[5].getP1());
assertEquals(new Point(x + w - aw / 2, y + h),
outlineSegments[6].getP1());
assertEquals(new Point(x + w, y + h - ah / 2),
outlineSegments[7].getP1());
}
@Test
public void test_getters() {
check_values_with_getters(rr, x, y, w, h, aw, ah);
}
@Test
public void test_setters() {
// TODO: change values and test if the changes are applied correctly
RoundedRectangle rrCopy = rr.getCopy();
double nx = 9, ny = 8, nw = 7, nh = 6, naw = 5, nah = 4;
rrCopy.setX(nx);
rrCopy.setY(ny);
rrCopy.setWidth(nw);
rrCopy.setHeight(nh);
rrCopy.setArcWidth(naw);
rrCopy.setArcHeight(nah);
check_values_with_getters(rrCopy, nx, ny, nw, nh, naw, nah);
check_values_with_getters(rr, x, y, w, h, aw, ah);
}
@Test
public void test_toPath() {
Path path = rr.toPath();
check_Point_containment(path);
Segment[] segments = path.toPath().getSegments();
// check path is closed
assertTrue(segments[segments.length - 1].getType() == Segment.CLOSE);
}
@Test
public void test_toString() {
assertEquals("RoundedRectangle(" + x + ", " + y + ", " + w + ", " + h
+ ", " + aw + ", " + ah + ")", rr.toString());
}
}