| /******************************************************************************* |
| * Copyright (c) 2008, 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: |
| * Alexander Shatalin (Borland) - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.draw2d.test; |
| |
| import org.eclipse.draw2d.ColorConstants; |
| import org.eclipse.draw2d.SWTGraphics; |
| import org.eclipse.draw2d.ScalablePolygonShape; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.draw2d.geometry.PointList; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.ImageData; |
| import org.eclipse.swt.widgets.Display; |
| |
| public class ScalablePolygonShapeTest extends AbstractFixtureTestCase { |
| |
| private static final int RECTANGLE_START = 1; |
| |
| private static final int RECTANGLE_END = 5; |
| |
| private static final PointList RECTANGLE_POINTS = new PointList(new int[] { |
| RECTANGLE_START, RECTANGLE_START, RECTANGLE_END, RECTANGLE_START, |
| RECTANGLE_END, RECTANGLE_END, RECTANGLE_START, RECTANGLE_END }); |
| |
| private static final int LINE_WIDTH = 2; |
| |
| private static final Rectangle RECTANGLE_BOUNDS = new Rectangle(0, 0, |
| RECTANGLE_END + LINE_WIDTH, RECTANGLE_END + LINE_WIDTH); |
| |
| private static final Rectangle RECTANGLE_DOUBLED_BOUNDS = new Rectangle(0, |
| 0, RECTANGLE_END * 2 + LINE_WIDTH, RECTANGLE_END * 2 + LINE_WIDTH); |
| |
| public void testScaledPointsEquality() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setPoints(RECTANGLE_POINTS); |
| scalablePolygon.setBounds(RECTANGLE_BOUNDS); |
| scalablePolygon.setLineWidth(LINE_WIDTH); |
| PointList scaledPoints = scalablePolygon.getScaledPoints(); |
| checkScaledPointsNotChanged(scalablePolygon, scaledPoints); |
| } |
| |
| public void testPointsUnchangedOnScaling() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| PointList points = RECTANGLE_POINTS.getCopy(); |
| scalablePolygon.setPoints(points); |
| scalablePolygon.setBounds(RECTANGLE_BOUNDS); |
| scalablePolygon.getScaledPoints(); |
| scalablePolygon.setBounds(RECTANGLE_DOUBLED_BOUNDS); |
| scalablePolygon.getScaledPoints(); |
| assertEquals(points, scalablePolygon.getPoints()); |
| checkEquals(RECTANGLE_POINTS, points); |
| } |
| |
| public void testSmallBounds() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setPoints(RECTANGLE_POINTS); |
| scalablePolygon.setLineWidth(LINE_WIDTH); |
| scalablePolygon.setBounds(new Rectangle(0, 0, 0, 0)); |
| int[] scaledPoints = scalablePolygon.getScaledPoints().toIntArray(); |
| for (int i = 0; i < scaledPoints.length;) { |
| assertEquals(LINE_WIDTH / 2, scaledPoints[i++]); |
| } |
| |
| // width < lineWidth |
| scalablePolygon.setBounds(new Rectangle(0, 0, 1, 100)); |
| scaledPoints = scalablePolygon.getScaledPoints().toIntArray(); |
| for (int i = 0; i < scaledPoints.length; i++) { |
| assertEquals(LINE_WIDTH / 2, scaledPoints[i++]); |
| } |
| |
| // height < lineWidth |
| scalablePolygon.setBounds(new Rectangle(0, 0, 100, 1)); |
| scaledPoints = scalablePolygon.getScaledPoints().toIntArray(); |
| for (int i = 1; i < scaledPoints.length; i++) { |
| assertEquals(LINE_WIDTH / 2, scaledPoints[i++]); |
| } |
| } |
| |
| public void testScaledPointsUpdateOnPointsChanging() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setBounds(RECTANGLE_BOUNDS); |
| scalablePolygon.setLineWidth(LINE_WIDTH); |
| PointList scaledPoints = scalablePolygon.getScaledPoints(); |
| assertEquals(0, scaledPoints.size()); |
| |
| scalablePolygon.addPoint(new Point(0, 0)); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| 1); |
| |
| scalablePolygon.removeAllPoints(); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| 0); |
| |
| scalablePolygon.setPoints(RECTANGLE_POINTS.getCopy()); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| RECTANGLE_POINTS.size()); |
| |
| scalablePolygon.setStart(new Point(2, 2)); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size()); |
| |
| scalablePolygon.setEnd(new Point(2, 5)); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size()); |
| |
| scalablePolygon.setPoint(new Point(5, 2), 1); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size()); |
| |
| scalablePolygon.insertPoint(new Point(3, 4), 1); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size() + 1); |
| |
| scalablePolygon.removePoint(1); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size() - 1); |
| } |
| |
| public void testScaledPointsUpdateOnBoundsChanging() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setPoints(RECTANGLE_POINTS); |
| scalablePolygon.setBounds(RECTANGLE_BOUNDS); |
| PointList scaledPoints = scalablePolygon.getScaledPoints(); |
| |
| Rectangle bounds = RECTANGLE_BOUNDS.getCopy(); |
| scalablePolygon.setBounds(bounds.resize(10, 10)); |
| scaledPoints = checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size()); |
| |
| // Size of the figure is the same, so scaledPoints should not be |
| // changed. |
| scalablePolygon.setBounds(bounds.translate(10, 10)); |
| checkScaledPointsNotChanged(scalablePolygon, scaledPoints); |
| } |
| |
| public void testScaledPointsUpdateOnSetLineWidth() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setLineWidth(LINE_WIDTH); |
| scalablePolygon.setPoints(RECTANGLE_POINTS); |
| PointList scaledPoints = scalablePolygon.getScaledPoints(); |
| |
| scalablePolygon.setLineWidth(LINE_WIDTH * 2); |
| checkScaledPointsChanged(scalablePolygon, scaledPoints, |
| scaledPoints.size()); |
| } |
| |
| public void testScaling() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setPoints(RECTANGLE_POINTS); |
| scalablePolygon.setLineWidth(LINE_WIDTH); |
| scalablePolygon.setBounds(RECTANGLE_DOUBLED_BOUNDS); |
| checkScaledPointsNotChanged(scalablePolygon, new PointList(new int[] { |
| 3, 3, 11, 3, 11, 11, 3, 11 })); |
| } |
| |
| public void off_testContainsPoints() { |
| ScalablePolygonShape scalablePolygon = new ScalablePolygonShape(); |
| scalablePolygon.setPoints(RECTANGLE_POINTS); |
| scalablePolygon.setLineWidth(1); |
| scalablePolygon.setBounds(RECTANGLE_DOUBLED_BOUNDS); |
| scalablePolygon.setOutline(true); |
| scalablePolygon.setFill(true); |
| scalablePolygon.setBackgroundColor(ColorConstants.black()); |
| scalablePolygon.setForegroundColor(ColorConstants.black()); |
| |
| Display display = Display.getDefault(); |
| int imageSize = RECTANGLE_END * 3; |
| Image image = new Image(display, imageSize, imageSize); |
| GC gc = new GC(image.getDevice()); |
| // Filling initial image with white color |
| gc.setBackground(ColorConstants.white()); |
| gc.setForeground(ColorConstants.white()); |
| gc.fillRectangle(0, 0, imageSize, imageSize); |
| gc.drawRectangle(0, 0, imageSize, imageSize); |
| |
| gc.setBackground(ColorConstants.black()); |
| gc.setForeground(ColorConstants.black()); |
| SWTGraphics graphics = new SWTGraphics(gc); |
| scalablePolygon.paint(graphics); |
| graphics.dispose(); |
| gc.dispose(); |
| ImageData imageData = image.getImageData(); |
| for (int x = 0; x < imageSize; x++) { |
| for (int y = 0; y < imageSize; y++) { |
| boolean isPolygonPoint = imageData.getPixel(x, y) == 0; |
| assertTrue( |
| "Point (" + x + "," + y + ") is" |
| + (isPolygonPoint ? " " : " not ") |
| + "a point of polygon", |
| scalablePolygon.containsPoint(new Point(x, y)) == isPolygonPoint); |
| } |
| } |
| } |
| |
| private PointList checkScaledPointsChanged( |
| ScalablePolygonShape scalablePolygon, PointList oldScaledPoints, |
| int expectedSize) { |
| PointList newScaledPoints = scalablePolygon.getScaledPoints(); |
| checkNotEquals(oldScaledPoints, newScaledPoints); |
| assertEquals(expectedSize, newScaledPoints.size()); |
| return newScaledPoints; |
| } |
| |
| private void checkNotEquals(PointList original, PointList modified) { |
| if (original.size() != modified.size()) { |
| return; |
| } |
| int[] originalIntArray = original.toIntArray(); |
| int[] modifiedIntArray = modified.toIntArray(); |
| for (int i = 0; i < modifiedIntArray.length; i++) { |
| if (originalIntArray[i] != modifiedIntArray[i]) { |
| return; |
| } |
| } |
| fail("Passed point lists are equals"); |
| } |
| |
| private PointList checkScaledPointsNotChanged( |
| ScalablePolygonShape scalablePolygon, PointList oldScaledPoints) { |
| PointList newScaledPoints = scalablePolygon.getScaledPoints(); |
| checkEquals(oldScaledPoints, newScaledPoints); |
| return newScaledPoints; |
| } |
| |
| private void checkEquals(PointList original, PointList modified) { |
| if (original.size() != modified.size()) { |
| fail("Passed point lists are not equals"); |
| } |
| int[] originalIntArray = original.toIntArray(); |
| int[] modifiedIntArray = modified.toIntArray(); |
| for (int i = 0; i < modifiedIntArray.length; i++) { |
| if (originalIntArray[i] != modifiedIntArray[i]) { |
| fail("Passed point lists are not equals"); |
| } |
| } |
| } |
| |
| } |