blob: 8f4afa55ae83cc959b359a9fd7f8b4b154f22126 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.draw2d.test;
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.draw2d.graph.Path;
import org.eclipse.draw2d.graph.ShortestPathRouter;
public class ShortestPathRoutingTest extends TestCase {
private static final Point bend = new Point(620, 309);
private static final Point bendAEnd = new Point(264, 472);
private static final Point bendAStart = new Point(283, 98);
private static final Rectangle bendBottomRect = new Rectangle(426, 335, 92,
167);
private static final Rectangle bendRightRect = new Rectangle(588, 192, 101,
176);
private static final Rectangle bendTopRect = new Rectangle(428, 59, 99, 205);
private static final Point blockAEnd = new Point(696, 279);
private static final Point blockAStart = new Point(181, 306);
private static final Rectangle blockRect1 = new Rectangle(45, 163, 102, 373);
private static final Rectangle blockRect2 = new Rectangle(21, 403, 412, 109);
private static final Rectangle blockRect3 = new Rectangle(229, 214, 134,
259);
private static final Rectangle blockRect4 = new Rectangle(73, 174, 352, 96);
private static final Point corner2AEnd = new Point(865, 600);
private static final Point corner2AEndCross = new Point(829, 500);
private static final Point corner2AStart = new Point(212, 193);
private static final Point corner2BEnd = new Point(802, 585);
private static final Point corner2BStart = new Point(276, 238);
private static final Point corner2CEnd = new Point(749, 305);
private static final Point corner2CStart = new Point(305, 291);
private static final Rectangle bl = new Rectangle(374, 78, 189, 396);
private static final Rectangle br = new Rectangle(200, 132, 309, 263);
private static final Rectangle tl = new Rectangle(340, 257, 309, 263);
private static final Rectangle tr = new Rectangle(426, 255, 275, 436);
private static final Point cornerAEnd = new Point(605, 180);
private static final Point cornerAStart = new Point(179, 468);
private static final Point cornerBEnd = new Point(655, 214);
private static final Point cornerBStart = new Point(261, 463);
private static final Rectangle deformedLeft = new Rectangle(201, 151, 89,
127);
private static final Rectangle deformedLeftMid = new Rectangle(302, 151,
72, 118);
private static final Rectangle deformedRightMid = new Rectangle(381, 151,
79, 137);
private static final Point deltaAEnd = new Point(547, 96);
private static final Point deltaAStart = new Point(194, 400);
private static final Point deltaBEnd = new Point(469, 195);
private static final Point deltaBStart = new Point(262, 334);
private static final Rectangle deltaNewRect = new Rectangle(25, 83, 102, 74);
private static final Rectangle deltaNewRectIntersec = new Rectangle(224,
225, 87, 43);
private static final Rectangle deltaNewRectNewBounds = new Rectangle(83,
225, 56, 66);
private static final Rectangle deltaRect = new Rectangle(322, 220, 149, 249);
private static final Rectangle deltaRectNewBounds = new Rectangle(439, 373,
149, 249);
private static final Point offsetAEnd = new Point(755, 614);
private static final Point offsetAStart = new Point(163, 107);
private static final Point offsetBEnd = new Point(675, 592);
private static final Point offsetBStart = new Point(195, 145);
private static final Point offsetCEnd = new Point(796, 458);
private static final Point offsetCStart = new Point(529, 212);
private static final Point offsetDEnd = new Point(803, 419);
private static final Point offsetDStart = new Point(571, 241);
private static final Rectangle offsetRectBottom = new Rectangle(539, 345,
88, 161);
private static final Rectangle offsetRectLeft = new Rectangle(170, 168,
271, 306);
private static final Rectangle offsetRectRight = new Rectangle(630, 199,
178, 145);
private static final Rectangle offsetRectTop = new Rectangle(448, 102, 170,
84);
private static final Point ovalAEnd = new Point(717, 294);
private static final Point ovalAStart = new Point(68, 289);
private static final Rectangle ovalRect1 = new Rectangle(191, 206, 59, 146);
private static final Rectangle ovalRect2 = new Rectangle(303, 203, 62, 139);
private static final Rectangle ovalRect3 = new Rectangle(381, 333, 92, 103);
private static final Rectangle ovalRect4 = new Rectangle(409, 136, 83, 144);
private static final Rectangle ovalRect5 = new Rectangle(535, 221, 57, 174);
private static final Point quadBendAEnd = new Point(701, 368);
private static final Point quadBendAStart = new Point(249, 33);
private static final Point quadBendBEnd = new Point(708, 397);
private static final Rectangle quadBendBottom = new Rectangle(410, 294,
432, 24);
private static final Point quadBendBStart = new Point(309, 64);
private static final Point quadBendCEnd = new Point(725, 421);
private static final Point quadBendCStart = new Point(291, 82);
private static final Point quadBendDEnd = new Point(730, 445);
private static final Point quadBendDStart = new Point(255, 97);
private static final Rectangle quadBendMiddleHit = new Rectangle(385, 209,
49, 40);
private static final Rectangle quadBendMiddleHit2 = new Rectangle(491, 210,
60, 44);
private static final Rectangle quadBendMiddleMiss = new Rectangle(410, 184,
49, 40);
private static final Rectangle quadBendTop = new Rectangle(84, 131, 416, 47);
private static final Point sideAEnd = new Point(500, 100);
private static final Point sideAStart = new Point(100, 100);
private static final Point sideBEnd = new Point(500, 150);
private static final Rectangle sideBottom = new Rectangle(150, 0, 50, 153);
private static final Point sideBStart = new Point(100, 150);
private static final Rectangle sideTop = new Rectangle(150, 25, 50, 450);
private static final Point subpathAEnd = new Point(283, 237);
private static final Point subpathAStart = new Point(746, 335);
private static final Point subpathBEnd = new Point(426, 135);
private static final Point subpathBStart = new Point(386, 357);
private static final Point subpathCEnd = new Point(519, 231);
private static final Point subpathCStart = new Point(308, 194);
private static final Point subpathDEnd = new Point(461, 150);
private static final Point subpathDStart = new Point(666, 385);
private static final Rectangle subpathLeftRect = new Rectangle(328, 174,
187, 138);
private static final Rectangle subpathRightRect = new Rectangle(560, 94,
101, 308);
private static final Point tangentAEnd = new Point(778, 185);
private static final Point tangentAStart = new Point(73, 185);
private static final Point tangentBEnd = new Point(781, 201);
private static final Point tangentBStart = new Point(66, 203);
private static final Point tangentCEnd = new Point(459, 180);
private static final Point tangentCStart = new Point(364, 208);
private static final Rectangle tangentLeft = new Rectangle(156, 151, 200,
168);
private static final Rectangle tangentMiddle = new Rectangle(383, 151, 60,
95);
private static final Rectangle tangentRight = new Rectangle(473, 151, 251,
138);
// working vars
private PointList pathA, pathB, pathC, pathD;
private Rectangle rect;
private ShortestPathRouter routing;
private void doAssertAbove(Point pt1, Point pt2, Rectangle r) {
assertTrue("Both points " + pt1 + " " + pt2
+ " should bend above the rectangle. " + r, pt1.y < r.y
&& pt2.y < r.y);
}
private void doAssertBelow(Point pt1, Point pt2, Rectangle r) {
assertTrue("Both points " + pt1 + " " + pt2
+ " should bend below the rectangle. " + r, pt1.y > r.bottom()
&& pt2.y > r.bottom());
}
private void doAssertLeft(Point pt1, Point pt2, Rectangle r) {
assertTrue("Both points " + pt1 + " " + pt2
+ " should bend to the left of the rectangle. " + r,
pt1.x < r.x && pt2.x < r.x);
}
private void doAssertNoPathsSolved() {
// assertTrue("No paths should have been solved.", routing.solve() ==
// 0);
}
private void doAssertNumPoints(PointList path, int expectedBends) {
assertTrue(
"Path should have " + expectedBends + " but had "
+ (path.size() - 2), expectedBends == path.size() - 2);
}
private void doAssertOffsetShrink(Point pt1, Point pt2) {
assertTrue("Point : " + pt1 + " and " + pt2
+ " should be separated by less than the normal offset: " + 4,
Math.abs(pt2.x - pt1.x) < 4 && Math.abs(pt2.y - pt1.y) < 4);
}
private void doAssertPathAbove(PointList pathA, PointList pathB) {
assertEquals("Paths should have same number of bends " + pathA.size()
+ " " + pathB.size(), pathA.size(), pathB.size());
for (int i = 1; i < pathA.size() - 1; i++) {
Point a = pathA.getPoint(i);
Point b = pathB.getPoint(i);
assertTrue("Point " + a + " should have been above " + b, a.y < b.y);
}
}
private void doAssertPathRight(PointList pathA, PointList pathB) {
assertEquals("Paths should have same number of bends " + pathA.size()
+ " " + pathB.size(), pathA.size(), pathB.size());
for (int i = 1; i < pathA.size() - 1; i++) {
Point a = pathA.getPoint(i);
Point b = pathB.getPoint(i);
assertTrue("Point " + a + " should have been right of " + b,
a.x > b.x);
}
}
private void doAssertPointAbove(Point above, Point point) {
assertTrue("Point : " + above + " should be below " + point,
above.y < point.y);
}
private void doAssertPointBelow(Point below, Point point) {
assertTrue("Point : " + below + " should be below " + point,
below.y > point.y);
}
private void doAssertPointLeft(Point left, Point point) {
assertTrue("Point : " + left + " should be left of " + point,
left.x < point.x);
}
private void doAssertPointRight(Point right, Point point) {
assertTrue("Point : " + right + " should be right of " + point,
right.x > point.x);
}
private void doAssertRight(Point pt1, Point pt2, Rectangle r) {
assertTrue("Both points " + pt1 + " " + pt2
+ " should bend to the right of the rectangle. " + r,
pt1.x > r.right() && pt2.x > r.right());
}
private void doSetUp(Point aStartStatic, Point aEndStatic,
Point bStartStatic, Point bEndStatic, Point cStartStatic,
Point cEndStatic, Point dStartStatic, Point dEndStatic,
Rectangle rectStatic) {
Path d = new Path(dStartStatic.getCopy(), dEndStatic.getCopy());
routing.addPath(d);
doSetUp(aStartStatic, aEndStatic, bStartStatic, bEndStatic,
cStartStatic, cEndStatic, rectStatic);
pathD = d.getPoints();
}
private void doSetUp(Point aStartStatic, Point aEndStatic,
Point bStartStatic, Point bEndStatic, Point cStartStatic,
Point cEndStatic, Rectangle rectStatic) {
Path c = new Path(cStartStatic.getCopy(), cEndStatic.getCopy());
routing.addPath(c);
doSetUp(aStartStatic, aEndStatic, bStartStatic, bEndStatic, rectStatic);
pathC = c.getPoints();
}
private void doSetUp(Point aStartStatic, Point aEndStatic,
Point bStartStatic, Point bEndStatic, Rectangle rectStatic) {
Path b = new Path(bStartStatic.getCopy(), bEndStatic.getCopy());
routing.addPath(b);
doSetUp(aStartStatic, aEndStatic, rectStatic);
pathB = b.getPoints();
}
private void doSetUp(Point aStartStatic, Point aEndStatic,
Rectangle rectStatic) {
rect = rectStatic.getCopy();
Path a = new Path(aStartStatic.getCopy(), aEndStatic.getCopy());
routing.addObstacle(rect);
routing.addPath(a);
routing.solve();
pathA = a.getPoints();
}
private void doTestBottomLeftIntersection() {
doAssertBelow(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertLeft(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertPointBelow(pathA.getPoint(1), pathB.getPoint(1));
doAssertPointBelow(pathB.getPoint(1), pathC.getPoint(1));
doAssertPointLeft(pathA.getPoint(1), pathB.getPoint(1));
doAssertPointLeft(pathB.getPoint(1), pathC.getPoint(1));
}
private void doTestBottomRightIntersection() {
doAssertBelow(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertRight(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertPointBelow(pathB.getPoint(1), pathA.getPoint(1));
doAssertPointRight(pathB.getPoint(1), pathA.getPoint(1));
}
private void doTestDeformed() {
doAssertNumPoints(pathA, 8);
doAssertNumPoints(pathB, 8);
doAssertPathAbove(pathA, pathB);
}
private void doTestOffsetShrink() {
doAssertNumPoints(pathA, 3);
doAssertNumPoints(pathB, 3);
doAssertNumPoints(pathC, 1);
doAssertNumPoints(pathD, 1);
doAssertOffsetShrink(pathA.getPoint(1), pathB.getPoint(1));
doAssertOffsetShrink(pathA.getPoint(2), pathB.getPoint(2));
doAssertOffsetShrink(pathA.getPoint(3), pathB.getPoint(3));
doAssertOffsetShrink(pathC.getPoint(1), pathD.getPoint(1));
}
private void doTestQuadBendMiss(int numPoints) {
doAssertNumPoints(pathA, numPoints);
doAssertNumPoints(pathB, numPoints);
doAssertNumPoints(pathC, numPoints);
doAssertNumPoints(pathD, numPoints);
doAssertAbove(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertAbove(pathC.getPoint(1), pathD.getPoint(1), rect);
doAssertRight(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertRight(pathC.getPoint(1), pathD.getPoint(1), rect);
doAssertBelow(pathA.getPoint(2), pathB.getPoint(2), rect);
doAssertBelow(pathC.getPoint(2), pathD.getPoint(2), rect);
doAssertRight(pathA.getPoint(2), pathB.getPoint(2), rect);
doAssertRight(pathC.getPoint(2), pathD.getPoint(2), rect);
doAssertAbove(pathA.getPoint(numPoints - 1),
pathB.getPoint(numPoints - 1), quadBendBottom);
doAssertAbove(pathC.getPoint(numPoints - 1),
pathD.getPoint(numPoints - 1), quadBendBottom);
doAssertLeft(pathA.getPoint(numPoints - 1),
pathB.getPoint(numPoints - 1), quadBendBottom);
doAssertLeft(pathC.getPoint(numPoints - 1),
pathD.getPoint(numPoints - 1), quadBendBottom);
doAssertBelow(pathA.getPoint(numPoints), pathB.getPoint(numPoints),
quadBendBottom);
doAssertBelow(pathC.getPoint(numPoints), pathD.getPoint(numPoints),
quadBendBottom);
doAssertLeft(pathA.getPoint(numPoints), pathB.getPoint(numPoints),
quadBendBottom);
doAssertLeft(pathC.getPoint(numPoints), pathD.getPoint(numPoints),
quadBendBottom);
doAssertPathRight(pathA, pathB);
doAssertPathRight(pathB, pathC);
doAssertPathRight(pathC, pathD);
doAssertPointAbove(pathD.getPoint(3), pathC.getPoint(3));
doAssertPointAbove(pathC.getPoint(3), pathB.getPoint(3));
doAssertPointAbove(pathB.getPoint(3), pathA.getPoint(3));
}
private void doTestSideIntersectionBottom() {
doAssertBelow(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertBelow(pathA.getPoint(2), pathB.getPoint(2), rect);
doAssertPointBelow(pathB.getPoint(1), pathA.getPoint(1));
doAssertPointBelow(pathB.getPoint(2), pathA.getPoint(2));
}
private void doTestSideIntersectionTop() {
doAssertAbove(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertAbove(pathA.getPoint(2), pathB.getPoint(2), rect);
doAssertPointBelow(pathB.getPoint(1), pathA.getPoint(1));
doAssertPointBelow(pathB.getPoint(2), pathA.getPoint(2));
}
private void doTestTangent() {
doAssertNumPoints(pathA, 6);
doAssertNumPoints(pathB, 6);
doAssertNumPoints(pathC, 2);
doAssertAbove(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertPointAbove(pathB.getPoint(3), pathC.getPoint(1));
doAssertPointAbove(pathA.getPoint(3), pathC.getPoint(1));
doAssertPathAbove(pathA, pathB);
}
private void doTestTopLeftIntersection() {
doAssertAbove(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertLeft(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertPointAbove(pathA.getPoint(1), pathB.getPoint(1));
}
private void doTestTopLeftIntersectionCross() {
doAssertAbove(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertLeft(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertPointBelow(pathA.getPoint(1), pathB.getPoint(1));
}
private void doTestTopRightIntersection() {
doAssertAbove(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertRight(pathA.getPoint(1), pathB.getPoint(1), rect);
doAssertPointRight(pathA.getPoint(1), pathB.getPoint(1));
doAssertPointAbove(pathA.getPoint(1), pathB.getPoint(1));
}
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
routing = new ShortestPathRouter();
}
/*
* @see TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
routing = null;
pathA = null;
pathC = null;
pathB = null;
pathD = null;
rect = null;
}
public void testBendpoints() {
routing.addObstacle(bendTopRect.getCopy());
routing.addObstacle(bendBottomRect.getCopy());
routing.addObstacle(bendRightRect.getCopy());
Path a = new Path(bendAStart.getCopy(), bendAEnd.getCopy());
a.setBendPoints(new PointList(new int[] { bend.x, bend.y }));
routing.addPath(a);
assertTrue("Should have solved path", routing.solve().size() > 0);
pathA = a.getPoints();
doAssertNumPoints(pathA, 3);
}
public void testBlockedPath() {
routing.addObstacle(blockRect1.getCopy());
routing.addObstacle(blockRect2.getCopy());
routing.addObstacle(blockRect3.getCopy());
doSetUp(blockAStart, blockAEnd, blockRect4);
doAssertNumPoints(pathA, 0);
}
public void testBottomLeftIntersection() {
doSetUp(corner2AStart, corner2AEnd, corner2BStart, corner2BEnd,
corner2CStart, corner2CEnd, bl);
doTestBottomLeftIntersection();
}
public void testBottomLeftIntersectionCross() {
doSetUp(corner2BStart, corner2BEnd, corner2AStart, corner2AEndCross,
corner2CStart, corner2CEnd, bl);
doTestBottomLeftIntersection();
}
public void testBottomLeftIntersectionCrossInverted() {
doSetUp(corner2BStart, corner2BEnd, corner2AStart, corner2AEndCross,
corner2CEnd, corner2CStart, bl);
doTestBottomLeftIntersection();
}
public void testBottomLeftIntersectionInverted() {
doSetUp(corner2AStart, corner2AEnd, corner2BEnd, corner2BStart,
corner2CStart, corner2CEnd, bl);
doTestBottomLeftIntersection();
}
public void testBottomRightIntersection() {
doSetUp(cornerAStart, cornerAEnd, cornerBStart, cornerBEnd, br);
doTestBottomRightIntersection();
}
public void testBottomRightIntersectionInverted() {
doSetUp(cornerAStart, cornerAEnd, cornerBEnd, cornerBStart, br);
doTestBottomRightIntersection();
}
public void testDeformed() {
routing.addObstacle(deformedLeft.getCopy());
routing.addObstacle(deformedLeftMid.getCopy());
routing.addObstacle(deformedRightMid.getCopy());
doSetUp(tangentAEnd, tangentAStart, tangentBStart, tangentBEnd,
tangentRight);
doTestDeformed();
}
public void testDeformedInverted() {
routing.addObstacle(deformedLeft.getCopy());
routing.addObstacle(deformedLeftMid.getCopy());
routing.addObstacle(deformedRightMid.getCopy());
doSetUp(tangentAEnd, tangentAStart, tangentBEnd, tangentBStart,
tangentRight);
doTestDeformed();
}
public void testDeltasAddObstacleIntersection() {
doSetUp(deltaAStart, deltaAEnd, deltaBStart, deltaBEnd, deltaRect);
routing.addObstacle(deltaNewRectIntersec.getCopy());
assertTrue("Both paths should have been solved.", routing.solve()
.size() == 2);
}
public void testDeltasAddObstacleNoIntersection() {
doSetUp(deltaAStart, deltaAEnd, deltaBStart, deltaBEnd, deltaRect);
routing.addObstacle(deltaNewRect.getCopy());
doAssertNoPathsSolved();
}
public void testDeltasAddPath() {
doSetUp(corner2AStart, corner2AEnd, corner2BStart, corner2BEnd, bl);
// should be no change.
doAssertNoPathsSolved();
// only one path should have changed.
Path c = new Path(corner2CStart.getCopy(), corner2CEnd.getCopy());
routing.addPath(c);
assertTrue("Only the new path should have been solved.", routing
.solve().size() > 0);
pathC = c.getPoints();
// the new path, however, should have moved the other two paths.
doAssertPointAbove(pathC.getPoint(1), pathA.getPoint(1));
doAssertPointAbove(pathC.getPoint(1), pathB.getPoint(1));
}
public void testDeltasMoveObstacleIntersection() {
doSetUp(deltaAStart, deltaAEnd, deltaBStart, deltaBEnd, deltaRect);
routing.updateObstacle(deltaRect.getCopy(),
deltaRectNewBounds.getCopy());
assertTrue("Both paths should have been solved.", routing.solve()
.size() > 0);
}
public void testDeltasMoveObstacleNoIntersection() {
doSetUp(deltaAStart, deltaAEnd, deltaBStart, deltaBEnd, deltaRect);
routing.addObstacle(deltaNewRect.getCopy());
routing.updateObstacle(deltaNewRect.getCopy(),
deltaNewRectNewBounds.getCopy());
doAssertNoPathsSolved();
}
public void testDeltasRemoveObstacleIntersection() {
doSetUp(deltaAStart, deltaAEnd, deltaBStart, deltaBEnd, deltaRect);
routing.removeObstacle(deltaRect.getCopy());
assertTrue("Both paths should have been solved.", routing.solve()
.size() > 0);
}
public void testDeltasRemoveObstacleNoIntersection() {
doSetUp(deltaAStart, deltaAEnd, deltaBStart, deltaBEnd, deltaRect);
routing.addObstacle(deltaNewRect.getCopy());
routing.removeObstacle(deltaNewRect.getCopy());
doAssertNoPathsSolved();
}
public void testDeltasRemovePath() {
doSetUp(corner2AStart, corner2AEnd, corner2BStart, corner2BEnd, bl);
Path c = new Path(corner2CStart, corner2CEnd);
routing.removePath(c);
// should be no change.
doAssertNoPathsSolved();
}
public void testOffsetShrink() {
routing.addObstacle(offsetRectLeft.getCopy());
routing.addObstacle(offsetRectRight.getCopy());
routing.addObstacle(offsetRectBottom.getCopy());
doSetUp(offsetAStart, offsetAEnd, offsetBStart, offsetBEnd,
offsetCStart, offsetCEnd, offsetDStart, offsetDEnd,
offsetRectTop);
doTestOffsetShrink();
}
public void testQuadBendHit() {
routing.addObstacle(quadBendBottom.getCopy());
routing.addObstacle(quadBendMiddleHit.getCopy());
doSetUp(quadBendAStart, quadBendAEnd, quadBendBStart, quadBendBEnd,
quadBendCStart, quadBendCEnd, quadBendDStart, quadBendDEnd,
quadBendTop);
doTestQuadBendMiss(5);
}
public void testQuadBendHit2() {
routing.addObstacle(quadBendBottom.getCopy());
routing.addObstacle(quadBendMiddleHit2.getCopy());
doSetUp(quadBendAStart, quadBendAEnd, quadBendBStart, quadBendBEnd,
quadBendCStart, quadBendCEnd, quadBendDStart, quadBendDEnd,
quadBendTop);
doTestQuadBendMiss(5);
}
public void testQuadBendMiss() {
routing.addObstacle(quadBendBottom.getCopy());
routing.addObstacle(quadBendMiddleMiss.getCopy());
doSetUp(quadBendAStart, quadBendAEnd, quadBendBStart, quadBendBEnd,
quadBendCStart, quadBendCEnd, quadBendDStart, quadBendDEnd,
quadBendTop);
doTestQuadBendMiss(4);
}
public void testShortestPathOutsideOval() {
routing.addObstacle(ovalRect1.getCopy());
routing.addObstacle(ovalRect2.getCopy());
routing.addObstacle(ovalRect3.getCopy());
routing.addObstacle(ovalRect4.getCopy());
doSetUp(ovalAStart, ovalAEnd, ovalRect5);
doAssertNumPoints(pathA, 4);
}
public void testSideIntersectionBottom() {
doSetUp(sideAStart, sideAEnd, sideBStart, sideBEnd, sideBottom);
doTestSideIntersectionBottom();
}
public void testSideIntersectionBottomInverted() {
doSetUp(sideAStart, sideAEnd, sideBEnd, sideBStart, sideBottom);
doTestSideIntersectionBottom();
}
public void testSideIntersectionTop() {
doSetUp(sideAStart, sideAEnd, sideBStart, sideBEnd, sideTop);
doTestSideIntersectionTop();
}
public void testSideIntersectionTopInverted() {
doSetUp(sideAStart, sideAEnd, sideBEnd, sideBStart, sideTop);
doTestSideIntersectionTop();
}
public void testSubpath() {
routing.addObstacle(subpathLeftRect.getCopy());
doSetUp(subpathAStart, subpathAEnd, subpathBStart, subpathBEnd,
subpathCStart, subpathCEnd, subpathDStart, subpathDEnd,
subpathRightRect);
doAssertNumPoints(pathD, 3);
doAssertPointAbove(pathD.getPoint(1), pathA.getPoint(1));
doAssertPointAbove(pathD.getPoint(2), pathA.getPoint(2));
doAssertPointAbove(pathD.getPoint(3), pathC.getPoint(2));
}
public void testTangent() {
routing.addObstacle(tangentMiddle.getCopy());
routing.addObstacle(tangentRight.getCopy());
doSetUp(tangentAStart, tangentAEnd, tangentBStart, tangentBEnd,
tangentCStart, tangentCEnd, tangentLeft);
doTestTangent();
}
public void testTangentInverted() {
routing.addObstacle(tangentMiddle.getCopy());
routing.addObstacle(tangentRight.getCopy());
doSetUp(tangentAEnd, tangentAStart, tangentBStart, tangentBEnd,
tangentCEnd, tangentCStart, tangentLeft);
doTestTangent();
}
public void testTopLeftIntersection() {
doSetUp(cornerAStart, cornerAEnd, cornerBStart, cornerBEnd, tl);
doTestTopLeftIntersection();
}
public void testTopLeftIntersectionCross() {
doSetUp(cornerBStart, cornerAEnd, cornerAStart, cornerBEnd, tl);
doTestTopLeftIntersectionCross();
}
public void testTopLeftIntersectionCrossInverted() {
doSetUp(cornerBStart, cornerAEnd, cornerBEnd, cornerAStart, tl);
doTestTopLeftIntersectionCross();
}
public void testTopLeftIntersectionInverted() {
doSetUp(cornerAStart, cornerAEnd, cornerBEnd, cornerBStart, tl);
doTestTopLeftIntersection();
}
public void testTopRightIntersection() {
doSetUp(corner2AStart, corner2AEnd, corner2BStart, corner2BEnd, tr);
doTestTopRightIntersection();
}
public void testTopRightIntersectionInverted() {
doSetUp(corner2AStart, corner2AEnd, corner2BEnd, corner2BStart, tr);
doTestTopRightIntersection();
}
}