/******************************************************************************* * Copyright (c) 2010, 2015 Research Group Software Construction, * RWTH Aachen University 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: * Alexander Nyßen (Research Group Software Construction, RWTH Aachen University) - 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.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.eclipse.gef.geometry.euclidean.Angle; import org.eclipse.gef.geometry.euclidean.Straight; import org.eclipse.gef.geometry.euclidean.Vector; import org.eclipse.gef.geometry.internal.utils.PrecisionUtils; import org.eclipse.gef.geometry.planar.Point; import org.junit.Test; /** * Unit tests for {@link Straight}. * * @author anyssen * @author mwienand * */ public class StraightTests { @Test public void test_constructors() { Straight s1 = new Straight(new Vector(0, 0), new Vector(3, 3)); Straight s2 = new Straight(new Point(0, 0), new Point(3, 3)); assertTrue(s1.equals(s2)); s1 = new Straight(new Vector(1, 2), new Vector(3, 4)); s2 = new Straight(new Point(1, 2), new Point(3, 4)); assertFalse(s1.equals(s2)); } @Test public void test_contains() { Straight s1 = new Straight(new Vector(0, 0), new Vector(3, 3)); assertTrue(s1.contains(new Vector(0, 0))); assertTrue(s1.contains(new Vector(1, 1))); assertTrue(s1.contains(new Vector(2, 2))); assertTrue(s1.contains(new Vector(-1, -1))); assertTrue(s1.contains(new Vector(-2, -2))); assertFalse(s1.contains(new Vector(0, 1))); assertFalse(s1.contains(new Vector(-1, 0))); } @Test public void test_containsWithinSegment() { Straight s1 = new Straight(new Point(), new Point(0, -1)); boolean thrown = false; try { s1.containsWithinSegment(new Vector(0, 0), new Vector(1, 2), new Vector(0, 1)); } catch (IllegalArgumentException x) { thrown = true; } assertTrue(thrown); thrown = false; try { s1.containsWithinSegment(new Vector(1, 2), new Vector(0, 0), new Vector(0, 1)); } catch (IllegalArgumentException x) { thrown = true; } assertTrue(thrown); assertTrue(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, 10), new Vector(0, 0))); assertTrue(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, -10), new Vector(0, 0))); assertTrue(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, 0), new Vector(0, 0))); assertTrue(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, 10), new Vector(0, 5))); assertTrue(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, -10), new Vector(0, -5))); assertFalse(s1.containsWithinSegment(new Vector(0, 1), new Vector(0, 10), new Vector(0, 0))); assertFalse(s1.containsWithinSegment(new Vector(0, -1), new Vector(0, -10), new Vector(0, 0))); assertFalse(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, 10), new Vector(0, -5))); assertFalse(s1.containsWithinSegment(new Vector(0, 0), new Vector(0, -10), new Vector(0, 5))); s1 = new Straight(new Point(), new Point(1, 0)); assertTrue(s1.containsWithinSegment(new Vector(0, 0), new Vector(3, 0), new Vector(2, 0))); assertFalse(s1.containsWithinSegment(new Vector(0, 0), new Vector(3, 0), new Vector(5, 0))); } @Test public void test_equals() { Straight s1 = new Straight(new Vector(0, 0), new Vector(3, 3)); Straight s2 = new Straight(new Vector(4, 4), new Vector(2, 2)); assertTrue(s1.equals(s2)); assertTrue(s2.equals(s1)); assertFalse(s1.equals(new Straight(new Vector(2, 0), s1.direction))); // wrong type assertFalse(s1.equals(new Point())); } @Test public void test_getAngle_withStraight() { Straight s1 = new Straight(new Vector(0, 0), new Vector(3, 3)); Straight s2 = new Straight(new Vector(0, 4), new Vector(2, 2)); assertTrue(s1.getAngle(s2).equals(Angle.fromDeg(0))); assertTrue(s1.getAngleCW(s2).equals(Angle.fromDeg(0))); assertTrue(s1.getAngleCCW(s2).equals(Angle.fromDeg(0))); s1 = new Straight(new Vector(0, 0), new Vector(5, 5)); s2 = new Straight(new Vector(0, 5), new Vector(0, 5)); assertTrue(s1.getAngle(s2).equals(Angle.fromDeg(45))); assertTrue(s1.getAngleCW(s2).equals(Angle.fromDeg(45))); assertTrue(s1.getAngleCCW(s2).equals(Angle.fromDeg(135))); } @Test public void test_getCopy() { Straight s1 = new Straight(new Vector(0, 0), new Vector(3, 3)); assertTrue(s1.getCopy().equals(s1)); assertTrue(s1.clone().equals(s1)); assertTrue(s1.getCopy().equals(s1.clone())); } @Test public void test_getDistance() { Straight s1 = new Straight(new Point(), new Point(0, 1)); for (int i = 0; i < 10; i++) { Vector v = new Vector(i + 1, i - 1); assertTrue(PrecisionUtils.equal(s1.getDistance(v), i + 1)); } // bug #482121 (NPE within getDistance()) Straight s2 = new Straight( new Vector(57.36146803551614, 1.8866002881313908E16), new Vector(0.0, 16.0)); Vector v = new Vector(51.15375383435782, 1.8866002881313916E16); s2.getDistance(v); } @Test public void test_getIntersection_with_Straight() { // test integer precision Vector p = new Vector(1, 1); Vector a = new Vector(2, 1); Vector q = new Vector(1, 4); Vector b = new Vector(1, -1); Straight s1 = new Straight(p, a); Straight s2 = new Straight(q, b); assertTrue(s1.intersects(s2)); Vector intersection = s1.getIntersection(s2); assertTrue(intersection.equals(new Vector(3, 2))); assertTrue(s1.contains(intersection)); assertTrue(s2.contains(intersection)); // check straight does not intersect itself assertFalse(s1.intersects(s1)); assertFalse(s2.intersects(s2)); assertNull(new Straight(p, a).getIntersection(new Straight(p, a))); // test double precision p = new Vector(0, 0); a = new Vector(new Point(0, 0), new Point(5, 5)); q = new Vector(0, 5); b = new Vector(new Point(0, 5), new Point(5, 0)); s1 = new Straight(p, a); s2 = new Straight(q, b); assertTrue(s1.intersects(s2)); intersection = s1.getIntersection(s2); assertTrue(intersection.equals(new Vector(2.5, 2.5))); assertTrue(s1.contains(intersection)); assertTrue(s2.contains(intersection)); Point p1 = new Point(-2, 1); Point p2 = new Point(1, 1); Point p3 = new Point(0, 0); Point p4 = new Point(0, 3); s1 = new Straight(p1, p2); s2 = new Straight(p3, p4); assertTrue(s1.intersects(s2)); intersection = s1.getIntersection(s2); assertTrue(intersection.equals(new Vector(0, 1))); assertTrue(s1.contains(intersection)); assertTrue(s2.contains(intersection)); // check four rounding effects p1 = new Point(-50, 5); p2 = new Point(7, 104); p3 = new Point(0, 0); p4 = new Point(0, 3); s1 = new Straight(p1, p2); s2 = new Straight(p3, p4); assertTrue(s1.intersects(s2)); intersection = s1.getIntersection(s2); assertNotNull(intersection); assertTrue(s1.contains(intersection)); assertTrue(s2.contains(intersection)); // test no intersection p1 = new Point(0, 10); p2 = new Point(10, 10); p3 = new Point(0, 5); p4 = new Point(10, 5); s1 = new Straight(p1, p2); s2 = new Straight(p3, p4); assertFalse(s1.intersects(s2)); assertFalse(s2.intersects(s1)); intersection = s1.getIntersection(s2); assertNull(intersection); } @Test public void test_getProjection() { Straight s1 = new Straight(new Point(), new Point(0, 1)); for (int i = 0; i < 10; i++) { Vector v = new Vector(i + 1, i - 1); assertTrue(s1.getProjection(v).equals(new Vector(0, i - 1))); } // bug #482121 Straight s3 = new Straight( new Vector(57.36146803551614, 1.8866002881313908E16), new Vector(0.0, 16.0)); Vector v2 = new Vector(51.15375383435782, 1.8866002881313908E16); Vector projection = s3.getProjection(v2); assertNotNull(projection); } @Test public void test_getSignedDistance() { Straight s1 = new Straight(new Point(), new Point(0, -1)); for (int i = -5; i <= 0; i++) { Vector v = new Vector(i, 0); assertTrue(PrecisionUtils.equal(s1.getSignedDistanceCW(v), i)); assertTrue(PrecisionUtils.equal(s1.getSignedDistanceCCW(v), -i)); } for (int i = 0; i <= 5; i++) { Vector v = new Vector(i, 0); assertTrue(PrecisionUtils.equal(s1.getSignedDistanceCW(v), i)); assertTrue(PrecisionUtils.equal(s1.getSignedDistanceCCW(v), -i)); } } @Test public void test_intersectsWithinSegment() { Straight s1 = new Straight(new Point(), new Point(10, 10)); Straight s2 = new Straight(new Point(), new Point(-10, 10)); boolean thrown = false; try { s1.intersectsWithinSegment(new Vector(0, 0), new Vector(0, 1), s2); } catch (IllegalArgumentException x) { thrown = true; } assertTrue(thrown); thrown = false; try { s1.intersectsWithinSegment(new Vector(1, 0), new Vector(0, 0), s2); } catch (IllegalArgumentException x) { thrown = true; } assertTrue(thrown); assertTrue("fallthrough", s1.intersectsWithinSegment(new Vector(0, 0), new Vector(0, 0), s2)); assertTrue(s1.intersectsWithinSegment(new Vector(-1, -1), new Vector(0, 0), s2)); assertTrue(s1.intersectsWithinSegment(new Vector(1, 1), new Vector(0, 0), s2)); assertTrue(s1.intersectsWithinSegment(new Vector(-1, -1), new Vector(1, 1), s2)); assertFalse(s1.intersectsWithinSegment(new Vector(-1, -1), new Vector(-20, -20), s2)); assertFalse(s1.intersectsWithinSegment(new Vector(1, 1), new Vector(20, 20), s2)); assertFalse(s1.intersectsWithinSegment(new Vector(-20, -20), new Vector(20, 20), new Straight(new Vector(10, 0), new Vector(10, 10)))); } @Test public void test_isParallelTo_with_Straight() { Straight s1 = new Straight(new Vector(0, 0), new Vector(3, 3)); Straight s2 = new Straight(new Vector(0, 4), new Vector(2, 2)); assertTrue(s1.isParallelTo(s2)); s1 = new Straight(new Vector(0, 0), new Vector(5, 5)); s2 = new Straight(new Vector(0, 5), new Vector(0, 5)); assertFalse(s1.isParallelTo(s2)); } @Test public void test_parameter_point() { // normalized direction vector, so that one can comprehend the // parameter's value Straight s1 = new Straight(new Point(), new Point(0, -1)); assertTrue( PrecisionUtils.equal(s1.getParameterAt(new Vector(0, 0)), 0)); assertTrue( PrecisionUtils.equal(s1.getParameterAt(new Vector(0, -1)), 1)); assertTrue( PrecisionUtils.equal(s1.getParameterAt(new Vector(0, 1)), -1)); assertTrue(s1.getPositionVectorAt(0).equals(new Vector(0, 0))); assertTrue(s1.getPositionVectorAt(2).equals(new Vector(0, -2))); assertTrue(s1.getPositionVectorAt(-2).equals(new Vector(0, 2))); s1 = new Straight(new Point(), new Point(1, 0)); assertTrue( PrecisionUtils.equal(s1.getParameterAt(new Vector(0, 0)), 0)); assertTrue( PrecisionUtils.equal(s1.getParameterAt(new Vector(2, 0)), 2)); assertTrue( PrecisionUtils.equal(s1.getParameterAt(new Vector(-2, 0)), -2)); assertTrue(s1.getPositionVectorAt(0).equals(new Vector(0, 0))); assertTrue(s1.getPositionVectorAt(1).equals(new Vector(1, 0))); assertTrue(s1.getPositionVectorAt(-1).equals(new Vector(-1, 0))); // test 0/0 straight (not a straight anymore) s1 = new Straight(new Point(), new Point()); boolean thrown = false; try { s1.getParameterAt(new Vector(0, 0)); } catch (IllegalArgumentException x) { thrown = true; } catch (IllegalStateException x) { thrown = true; } assertTrue(thrown); } @Test public void test_toString() { Straight s1 = new Straight(new Point(), new Point(0, -1)); assertEquals("Straight: Vector: [0.0,0.0] + s * Vector: [0.0,-1.0]", s1.toString()); } }