/******************************************************************************
* Copyright (c) 2003, 2006 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
****************************************************************************/
package org.eclipse.gmf.tests.runtime.draw2d.ui;
import junit.framework.TestCase;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gmf.runtime.draw2d.ui.geometry.LineSeg;
import org.eclipse.gmf.runtime.draw2d.ui.geometry.PointListUtilities;
/**
* @author jschofie
*
* This test case is intended to test the LineSeg Class functionality
*/
public class LineSegTest extends TestCase {
private LineSeg lineSeg;
private LineSeg verticalLine;
private LineSeg horizontalLine;
private Point origin;
private Point terminus;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
origin = new Point( 5, 5 );
terminus = new Point( 10, 10 );
lineSeg = new LineSeg( origin, terminus );
verticalLine = new LineSeg( new Point( 0, 5 ), new Point( 0, 105 ) );
horizontalLine = new LineSeg( new Point( 0, 5 ), new Point( 100, 5 ) );
}
/*
* test the equals method
*/
public void testEqualsObject() {
LineSeg seg1 = new LineSeg( new Point( 0, 0 ), new Point( 10, 10 ) );
LineSeg seg2 = new LineSeg( new Point( 1, 1 ), new Point( 9, 9 ) );
LineSeg seg3 = new LineSeg( new Point( 0, 0 ), new Point( 5, 5 ) );
LineSeg seg4 = new LineSeg( new Point( 0, 0 ), new Point( 10, 10 ) );
// Both line segment points are not equal
assertFalse( seg1.equals( seg2 ) );
// The origin points are equal but the ends are not
assertFalse( seg1.equals( seg3 ) );
// Both the origin and end points are equal
assertTrue( seg1.equals( seg4 ) );
}
public void testGetOrigin() {
assertEquals( origin, lineSeg.getOrigin() );
}
public void testGetTerminus() {
assertEquals( terminus, lineSeg.getTerminus() );
}
public void testSetOrigin() {
Point p1 = new Point( -5, -5 );
lineSeg.setOrigin( p1 );
assertEquals( p1, lineSeg.getOrigin() );
}
public void testSetTerminus() {
Point p1 = new Point( -5, -5 );
lineSeg.setTerminus( p1 );
assertEquals( p1, lineSeg.getTerminus() );
}
public void testGetSupremum() {
assertEquals( terminus.x, lineSeg.getSupremum().x );
assertEquals( terminus.y, lineSeg.getSupremum().y );
}
public void testGetInfimum() {
assertEquals( origin.x, lineSeg.getInfimum().x );
assertEquals( origin.y, lineSeg.getInfimum().y );
}
public void testIsHorizontal() {
assertFalse( "verticalLine shouldn't be horizontal", verticalLine.isHorizontal() ); //$NON-NLS-1$
assertTrue( "horizontalLine should be horizontal", horizontalLine.isHorizontal() ); //$NON-NLS-1$
}
public void testIsVertical() {
assertTrue( "verticalLine should be vertical", verticalLine.isVertical() ); //$NON-NLS-1$
assertFalse( "horizontalLine shouldn't be vertical", horizontalLine.isVertical() ); //$NON-NLS-1$
}
public void testSlope() {
// Line is vertical
assertTrue( "The line should be vertical", 9999 == verticalLine.slope() ); //$NON-NLS-1$
// Line is horizontal
assertTrue( "The line should be horizontal", 0.0 == horizontalLine.slope() ); //$NON-NLS-1$
}
public void testPerpSlope() {
// Line is vertical
assertEquals( "Perp Slope of a vertical line should be horizontal", 0, (int)verticalLine.perpSlope() ); //$NON-NLS-1$
// Line is horizontal
assertEquals( "Perp slope of a horizontal line should be vertical", 9999, (int)horizontalLine.perpSlope() ); //$NON-NLS-1$
}
public void testLength() {
// Compute length of the vertical line
assertEquals( "Vertical line seg length is not correct", 100, (int)verticalLine.length() ); //$NON-NLS-1$
// Compute the length of the horizontal line
assertEquals( "Horizontal line seg length is not correct", 100, (int)horizontalLine.length() ); //$NON-NLS-1$
}
public void testContainsPoint() {
Point isContained = new Point( 6, 6 );
Point notContained = new Point( 3, 3 );
assertTrue( lineSeg.containsPoint( isContained, 0 ) );
assertFalse( lineSeg.containsPoint( notContained, 0 ) );
}
public void testDistanceAlong() {
// Test nominal case
assertEquals( "The distance has been incorrectly computed", 0, (int)lineSeg.distanceAlong( new Point( 5, 5 ) ) ); //$NON-NLS-1$
// Test divide by zero
Point p2 = new Point( 10, 10 );
LineSeg seg2 = new LineSeg( p2, p2 );
assertEquals( -1, (int)seg2.distanceAlong( new Point( 2, 2 ) ) );
}
// public void testIntersect() {
// }
//
// public void testDistanceToPoint() {
// }
//
// public void testPerpIntersect() {
// }
//
// public void testProjection() {
// }
//
// public void testPositionRelativeTo() {
// }
//
// public void testLocatePoint() {
// }
//
// public void testPointOn() {
// }
//
// public void testGetTrigValues() {
// }
//
// public void testGetParallelLineSegThroughPoint() {
// }
public void testLineEquation() {
// Normal case
Point p1 = new Point(1, 0);
Point p2 = new Point(2, 1);
LineSeg line = new LineSeg(p1,p2);
double[] equation = line.getEquation();
assertTrue("Equation is incomplete", equation.length == 3); //$NON-NLS-1$
assertTrue("Coefficient 'a' is not correct", equation[0] == -1); //$NON-NLS-1$
assertTrue("Coefficient 'b' is not correct", equation[1] == 1); //$NON-NLS-1$
assertTrue("Coefficient 'c' is not correct", equation[2] == -1); //$NON-NLS-1$
}
public void testFindLineIntersections() {
final PointList points = new PointList();
points.addPoint(new Point(0, 10));
points.addPoint(new Point(10, 0));
points.addPoint(new Point(0, -10));
points.addPoint(new Point(-10, 0));
points.addPoint(new Point(0, 10));
// Nominal case, i.e. 2 intersection points
Point p1 = new Point(-20, 20);
Point p2 = new Point(30, -30);
LineSeg line = new LineSeg(p1,p2);
PointList intersections = line.getLineIntersectionsWithLineSegs(points);
assertTrue(
"Line passing through " + p1 + " and " + p2 + "must have exactly 2 intersections with the figure", intersections.size() == 2); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
Point first = PointListUtilities.pickClosestPoint(intersections, p2);
assertTrue(
"This is not the closest intersection to " + p2, first.x == 5 && first.y == -5); //$NON-NLS-1$
Point second = PointListUtilities.pickFarestPoint(intersections, p2);
assertTrue(
"This is not the farest intersection to " + p2, second.x == -5 && second.y == 5); //$NON-NLS-1$
// 1 intersection point
p1 = new Point(10, 10);
p2 = new Point(10, -10);
line = new LineSeg(p1,p2);
intersections = line.getLineIntersectionsWithLineSegs(points);
assertTrue(
"Line passing through " + p1 + " and " + p2 + "must have exactly 1 intersections with the figure", intersections.size() == 2); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
first = PointListUtilities.pickClosestPoint(intersections, p2);
second = PointListUtilities.pickFarestPoint(intersections, p2);
assertTrue(second.x == first.x && second.y == first.y);
assertTrue(
"Incorrect value for intersection point", first.x == 10 && first.y == 0); //$NON-NLS-1$
// 0 intersection points
p1 = new Point(20, 20);
p2 = new Point(-10, 10);
line = new LineSeg(p1,p2);
intersections = line.getLineIntersectionsWithLineSegs(points);
assertTrue(
"Line passing through " + p1 + " and " + p2 + "must have no intersections with the figure", intersections.size() == 0); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// Infinite number of intersections => must result in the two points
// (ends of the linesegment
// that lies on the line that passes through p1 and p2)
p1 = new Point(20, -10);
p2 = new Point(-10, 20);
line = new LineSeg(p1,p2);
intersections = line.getLineIntersectionsWithLineSegs(points);
assertTrue(
"Line passing through " + p1 + " and " + p2 + "must have exactly 2 intersections with the figure", intersections.size() == 4); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
first = PointListUtilities.pickClosestPoint(intersections, p2);
assertTrue(
"This is not the closest intersection to " + p2, first.x == 0 && first.y == 10); //$NON-NLS-1$
second = PointListUtilities.pickFarestPoint(intersections, p2);
assertTrue(
"This is not the farest intersection to " + p2, second.x == 10 && second.y == 0); //$NON-NLS-1$
}
public void testAllLineIntersectionsWithEllipse() {
Rectangle oval = new Rectangle(Rectangle.SINGLETON);
oval.setLocation(-2, -1);
oval.setSize(4, 2);
// 2 points intersection
Point p1 = new Point(0, 0);
Point p2 = new Point(3, 0);
LineSeg line = new LineSeg(p1,p2);
PointList intersections = line.getLineIntersectionsWithEllipse(oval);
assertTrue(
"Must have 2 intersections with line passing through points " + p1 + " and " + p2, intersections.size() == 2); //$NON-NLS-1$//$NON-NLS-2$
Point first = PointListUtilities.pickClosestPoint(intersections, p2);
assertTrue(
"This is not the closes intersection to " + p2, first.x == 2 && first.y == 0); //$NON-NLS-1$
Point second = PointListUtilities.pickFarestPoint(intersections, p2);
assertTrue(
"This is not the farest intersection to " + p2, second.x == -2 && second.y == 0); //$NON-NLS-1$
// 1 point intersection
p1 = new Point(2, -2);
p2 = new Point(2, 2);
line = new LineSeg(p1,p2);
intersections = line.getLineIntersectionsWithEllipse(oval);
assertTrue(
"Line passing through " + p1 + " and " + p2 + "must have exactly 1 intersections with the figure", intersections.size() == 2); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
first = PointListUtilities.pickClosestPoint(intersections, p2);
second = PointListUtilities.pickFarestPoint(intersections, p2);
assertTrue(second.x == first.x && second.y == first.y);
assertTrue(
"Incorrect value for intersection point", first.x == 2 && first.y == 0); //$NON-NLS-1$
// no intersections
p1 = new Point(3, 0);
p2 = new Point(0, 3);
line = new LineSeg(p1,p2);
intersections = line.getLineIntersectionsWithEllipse(oval);
assertTrue(
"Line passing through " + p1 + " and " + p2 + "must have no intersections with the figure", intersections.size() == 0); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}