/*******************************************************************************
* 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.internal.utils.PrecisionUtils;
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.Region;
import org.junit.Test;
public class RegionTests {
@Test
public void test_constructor() {
Region region = new Region();
assertEquals(0, region.getShapes().length);
region = new Region(new Rectangle(0, 0, 100, 100));
assertEquals(1, region.getShapes().length);
region = new Region(region);
assertEquals(1, region.getShapes().length);
}
@Test
public void test_copy_semantics() {
Rectangle r1 = new Rectangle(0, 0, 100, 100);
Region a1 = new Region(r1);
r1.setWidth(50);
// constructor copies Rectangles:
// changing r1 does not change a1
assertTrue(PrecisionUtils.equal(100, a1.getShapes()[0].getWidth()));
Region a2 = a1.getCopy();
a2.getShapes()[0].setWidth(50);
// getCopy() copies Rectangles:
// changing a2 does not change a1
assertTrue(PrecisionUtils.equal(100, a1.getShapes()[0].getWidth()));
a2 = new Region(a1);
a2.getShapes()[0].setWidth(50);
// constructor copies Rectangles:
// changing a2 does not change a1
assertTrue(PrecisionUtils.equal(100, a1.getShapes()[0].getWidth()));
}
@Test
public void test_cover_single_rectangle() {
Rectangle r1 = new Rectangle(100, 100, 100, 100);
Region region = new Region(r1);
assertTrue(region.contains(r1));
assertTrue(
"A Region of just a single Rectangle should use this Rectangle as its only internal shape.",
region.getShapes()[0].equals(r1));
assertFalse(region.contains(new Rectangle(0, 0, 50, 50)));
assertFalse(region.contains(new Rectangle(50, 50, 100, 100)));
}
@Test
public void test_cover_two_distinct_rectangles() {
Rectangle r1 = new Rectangle(100, 100, 100, 100);
Rectangle r2 = new Rectangle(500, 100, 100, 100);
Region region = new Region(r1, r2);
assertTrue(region.contains(r1));
assertTrue(region.contains(r2));
assertFalse(region.contains(new Rectangle(0, 0, 50, 50)));
assertFalse(region.contains(new Rectangle(50, 50, 100, 100)));
}
@Test
public void test_cover_two_intersecting_rectangles() {
Rectangle r1 = new Rectangle(50, 50, 50, 200);
Rectangle r2 = new Rectangle(50, 200, 200, 50);
Region region = new Region(r1, r2);
assertTrue(region.contains(r1));
assertTrue(region.contains(r2));
assertTrue(region.contains(r1.getIntersected(r2)));
assertFalse(region.contains(new Rectangle(0, 0, 10, 10)));
assertFalse(region.contains(new Rectangle(25, 25, 50, 50)));
}
@Test
public void test_equals() {
Region r0 = new Region(new Rectangle(0, 0, 100, 100));
Region r1 = new Region(new Rectangle(0, 0, 50, 100),
new Rectangle(50, 0, 50, 100));
assertEquals(r0, r1);
assertEquals(r1, r0);
r0 = new Region(new Rectangle(0, 0, 100, 50),
new Rectangle(0, 50, 100, 50));
assertEquals(r0, r1);
assertEquals(r1, r0);
r1 = new Region(new Rectangle(0, 0, 100, 100),
new Rectangle(50, 50, 100, 100));
assertFalse(r0.equals(r1));
assertFalse(r1.equals(r0));
}
@Test
public void test_toPath() {
// empty Region
Region region = new Region();
assertEquals(new Path(), region.toPath());
// one rectangle
region = new Region(new Rectangle(0, 0, 100, 50));
Path path = region.toPath();
Segment[] segs = path.getSegments();
assertEquals(6, segs.length);
assertEquals(Path.Segment.MOVE_TO, segs[0].getType());
assertEquals(Path.Segment.CLOSE, segs[5].getType());
// overlapping rectangles
region = new Region(new Rectangle(0, 0, 100, 100),
new Rectangle(50, 50, 100, 100));
path = region.toPath();
segs = path.getSegments();
assertEquals(12, segs.length);
assertEquals(Path.Segment.MOVE_TO, segs[0].getType());
assertEquals(Path.Segment.CLOSE, segs[11].getType());
// distinct rectangles
region = new Region(new Rectangle(0, 0, 50, 50),
new Rectangle(60, 60, 50, 50));
path = region.toPath();
segs = path.getSegments();
assertEquals(10, segs.length);
assertEquals(Path.Segment.MOVE_TO, segs[0].getType());
assertEquals(Path.Segment.CLOSE, segs[4].getType());
assertEquals(Path.Segment.MOVE_TO, segs[5].getType());
assertEquals(Path.Segment.CLOSE, segs[9].getType());
}
@Test
public void test_toPath_with_void() {
Region r = new Region(new Rectangle(0, 0, 200, 50),
new Rectangle(0, 0, 50, 150), new Rectangle(0, 100, 200, 50),
new Rectangle(150, 0, 50, 150));
Path p = r.toPath();
// obviously outside
assertFalse(p.contains(new Point(-10, -10)));
assertFalse(p.contains(new Point(-10, 75)));
assertFalse(p.contains(new Point(-10, 160)));
assertFalse(p.contains(new Point(100, -10)));
assertFalse(p.contains(new Point(100, 160)));
assertFalse(p.contains(new Point(210, -10)));
assertFalse(p.contains(new Point(210, 75)));
assertFalse(p.contains(new Point(210, 160)));
// obviously inside
assertTrue(p.contains(new Point(25, 25)));
assertTrue(p.contains(new Point(25, 125)));
assertTrue(p.contains(new Point(100, 25)));
assertTrue(p.contains(new Point(100, 125)));
assertTrue(p.contains(new Point(175, 25)));
assertTrue(p.contains(new Point(175, 125)));
// the void
assertFalse(p.contains(new Point(100, 75)));
}
}