Author: allain.lalonde Date: Sun Jul 19 16:56:41 2009 New Revision: 520 Added: piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/util/PObjectOutputStreamTest.java Modified: piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/nodes/PPath.java piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/util/PUtil.java piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PImageTest.java piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PPathTest.java piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PTextTest.java piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java
Log: Unit tests Modified: piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/nodes/PPath.java ============================================================================== --- piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/nodes/PPath.java (original) +++ piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/nodes/PPath.java Sun Jul 19 16:56:41 2009 @@ -102,7 +102,7 @@ private static final BasicStroke DEFAULT_STROKE = new BasicStroke(1.0f); private static final Color DEFAULT_STROKE_PAINT = Color.black; - private transient GeneralPath path; + protected transient GeneralPath path; private transient GeneralPath resizePath; private transient Stroke stroke; private transient boolean updatingBoundsFromPath; @@ -152,6 +152,7 @@ return result; } + public PPath() { strokePaint = DEFAULT_STROKE_PAINT; stroke = DEFAULT_STROKE; @@ -225,10 +226,9 @@ * need to take this into consideration. */ protected void internalUpdateBounds(double x, double y, double width, double height) { - if (updatingBoundsFromPath) - return; - if (path == null) + if (updatingBoundsFromPath || path == null) { return; + } if (resizePath != null) { path.reset(); Modified: piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/util/PUtil.java ============================================================================== --- piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/util/PUtil.java (original) +++ piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/util/PUtil.java Sun Jul 19 16:56:41 2009 @@ -96,70 +96,74 @@ return c; } - public static void writeStroke(Stroke aStroke, ObjectOutputStream out) throws IOException { - if (aStroke instanceof Serializable) { + public static void writeStroke(Stroke stroke, ObjectOutputStream out) throws IOException { + if (stroke instanceof Serializable) { out.writeBoolean(true); out.writeBoolean(true); - out.writeObject(aStroke); + out.writeObject(stroke); } - else if (aStroke instanceof BasicStroke) { + else if (stroke instanceof BasicStroke) { out.writeBoolean(true); out.writeBoolean(false); - BasicStroke s = (BasicStroke) aStroke; + writeBasicStroke((BasicStroke) stroke, out); + } + else { + out.writeBoolean(false); + } + } - float[] dash = s.getDashArray(); + private static void writeBasicStroke(BasicStroke basicStroke, ObjectOutputStream out) throws IOException { + float[] dash = basicStroke.getDashArray(); - if (dash == null) { - out.write(0); - } - else { - out.write(dash.length); - for (int i = 0; i < dash.length; i++) { - out.writeFloat(dash[i]); - } - } - - out.writeFloat(s.getLineWidth()); - out.writeInt(s.getEndCap()); - out.writeInt(s.getLineJoin()); - out.writeFloat(s.getMiterLimit()); - out.writeFloat(s.getDashPhase()); + if (dash == null) { + out.write(0); } else { - out.writeBoolean(false); + out.write(dash.length); + for (int i = 0; i < dash.length; i++) { + out.writeFloat(dash[i]); + } } + + out.writeFloat(basicStroke.getLineWidth()); + out.writeInt(basicStroke.getEndCap()); + out.writeInt(basicStroke.getLineJoin()); + out.writeFloat(basicStroke.getMiterLimit()); + out.writeFloat(basicStroke.getDashPhase()); } public static Stroke readStroke(ObjectInputStream in) throws IOException, ClassNotFoundException { boolean wroteStroke = in.readBoolean(); - if (wroteStroke) { - boolean serializedStroke = in.readBoolean(); - if (serializedStroke) { - return (Stroke) in.readObject(); - } - else { - float[] dash = null; - int dashLength = in.read(); - - if (dashLength != 0) { - dash = new float[dashLength]; - for (int i = 0; i < dashLength; i++) { - dash[i] = in.readFloat(); - } - } - - float lineWidth = in.readFloat(); - int endCap = in.readInt(); - int lineJoin = in.readInt(); - float miterLimit = in.readFloat(); - float dashPhase = in.readFloat(); + if (!wroteStroke) { + return null; + } + + boolean serializedStroke = in.readBoolean(); + if (serializedStroke) { + return (Stroke) in.readObject(); + } + + return readBasicStroke(in); + } - return new BasicStroke(lineWidth, endCap, lineJoin, miterLimit, dash, dashPhase); + private static Stroke readBasicStroke(ObjectInputStream in) throws IOException { + float[] dash = null; + int dashLength = in.read(); + + if (dashLength != 0) { + dash = new float[dashLength]; + for (int i = 0; i < dashLength; i++) { + dash[i] = in.readFloat(); } } - else { - return null; - } + + float lineWidth = in.readFloat(); + int endCap = in.readInt(); + int lineJoin = in.readInt(); + float miterLimit = in.readFloat(); + float dashPhase = in.readFloat(); + + return new BasicStroke(lineWidth, endCap, lineJoin, miterLimit, dash, dashPhase); } private static final int PATH_IS_DONE = -1; Modified: piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PImageTest.java ============================================================================== --- piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PImageTest.java (original) +++ piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PImageTest.java Sun Jul 19 16:56:41 2009 @@ -28,8 +28,6 @@ */ package edu.umd.cs.piccolo.nodes; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -37,20 +35,19 @@ import javax.imageio.ImageIO; import junit.framework.TestCase; -import edu.umd.cs.piccolo.util.PBounds; import edu.umd.cs.piccolo.util.PPaintContext; public class PImageTest extends TestCase { - public PImageTest(String name) { - super(name); - } + public void testClone() { + final PImage srcNode = new PImage(new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB)); + final PImage clonedNode = (PImage) srcNode.clone(); + assertNotNull(clonedNode.getImage()); - public void testCopy() { - PImage aNode = new PImage(new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB)); - aNode = (PImage) aNode.clone(); - assertNotNull(aNode.getImage()); - assertEquals(aNode.getBounds(), new PBounds(0, 0, 100, 100)); + assertEquals(srcNode.getImage().getWidth(null), clonedNode.getImage().getWidth(null)); + assertEquals(srcNode.getImage().getHeight(null), clonedNode.getImage().getHeight(null)); + + assertEquals(srcNode.getBounds(), clonedNode.getBounds()); } public void testToString() { @@ -81,7 +78,7 @@ imgFile.deleteOnExit(); ImageIO.write(img, "JPEG", imgFile); - PImage imageNode = new PImage(imgFile.toURL()); + PImage imageNode = new PImage(imgFile.toURI().toURL()); assertEquals(100, imageNode.getImage().getWidth(null)); assertEquals(100, imageNode.getImage().getHeight(null)); } Modified: piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PPathTest.java ============================================================================== --- piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PPathTest.java (original) +++ piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PPathTest.java Sun Jul 19 16:56:41 2009 @@ -28,6 +28,9 @@ */ package edu.umd.cs.piccolo.nodes; +import java.awt.Color; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -36,48 +39,139 @@ import java.io.ObjectInputStream; import junit.framework.TestCase; -import edu.umd.cs.piccolo.nodes.PPath; +import edu.umd.cs.piccolo.MockPropertyChangeListener; +import edu.umd.cs.piccolo.PiccoloAsserts; import edu.umd.cs.piccolo.util.PBounds; import edu.umd.cs.piccolo.util.PObjectOutputStream; public class PPathTest extends TestCase { - public PPathTest(String name) { - super(name); + private MockPropertyChangeListener mockListener; + + public void setUp() { + mockListener = new MockPropertyChangeListener(); + } + + public void testStrokeIsNotNullByDefault() { + PPath path = new PPath(); + assertNotNull(path.getStroke()); + } + + public void testStrokePaintIsBlackByDefault() { + PPath path = new PPath(); + assertEquals(Color.BLACK, path.getStrokePaint()); + } + + public void testClone() { + PPath p = PPath.createEllipse(0, 0, 100, 100); + PBounds b = p.getBounds(); + p = (PPath) p.clone(); + assertEquals(p.getBounds(), b); + } + + public void testSerialization() throws IOException, ClassNotFoundException { + final PPath srcPath = PPath.createEllipse(0, 0, 100, 100); + final PBounds srcBounds = srcPath.getBounds(); + + File file = File.createTempFile("test", "ser"); + + serializeToFile(srcPath, file); + + PPath resultPath = deserializeFromFile(srcBounds, file); + + assertEquals(resultPath.getBounds(), srcBounds); + } + + private PPath deserializeFromFile(PBounds b, File file) + throws FileNotFoundException, IOException, ClassNotFoundException { + PPath path; + FileInputStream fin = new FileInputStream(file); + ObjectInputStream in = new ObjectInputStream(fin); + path = (PPath) in.readObject(); + file.delete(); + + return path; + } + + private void serializeToFile(PPath p, File file) + throws FileNotFoundException, IOException { + FileOutputStream fout = new FileOutputStream(file); + PObjectOutputStream out = new PObjectOutputStream(fout); + out.writeObjectTree(p); + out.flush(); + out.close(); + } + + public void testCreateRectangleReturnsValidPPath() { + PPath path = PPath.createRectangle(0, 0, 100, 50); + assertNotNull(path); + + // Seems like rounding is affecting the bounds greatly + PiccoloAsserts.assertEquals(new PBounds(0,0,100,50), path.getBounds(), 1); + } + + public void testCreateEllipseReturnsValidPPath() { + PPath path = PPath.createEllipse(0, 0, 100, 50); + assertNotNull(path); + + // Seems like rounding is affecting the bounds greatly + PiccoloAsserts.assertEquals(new PBounds(0,0,100,50), path.getBounds(), 1); + } + + public void testCreateRoundedRectReturnsValidPPath() { + PPath path = PPath.createRoundRectangle(0, 0, 100, 50, 10, 10); + assertNotNull(path); + + // Seems like rounding is affecting the bounds greatly + PiccoloAsserts.assertEquals(new PBounds(0,0,100,50), path.getBounds(), 1); } + + public void testCreateLineReturnsValidPPath() { + PPath path = PPath.createLine(0,0, 100,0); + assertNotNull(path); - public void testCopy() { - PPath p = PPath.createEllipse(0, 0, 100, 100); - PBounds b = p.getBounds(); - p = (PPath) p.clone(); - assertEquals(p.getBounds(), b); - } - - public void testSaveToFile() { - PPath p = PPath.createEllipse(0, 0, 100, 100); - PBounds b = p.getBounds(); - try { - File file = new File("myfile"); - FileOutputStream fout = new FileOutputStream(file); - PObjectOutputStream out = new PObjectOutputStream(fout); - out.writeObjectTree(p); - out.flush(); - out.close(); - - FileInputStream fin = new FileInputStream(file); - ObjectInputStream in = new ObjectInputStream(fin); - p = (PPath) in.readObject(); - assertEquals(p.getBounds(), b); - file.delete(); - } - catch (FileNotFoundException e) { - assertTrue(false); - } - catch (ClassNotFoundException e) { - assertTrue(false); - } - catch (IOException e) { - assertTrue(false); - } + // Seems like rounding is affecting the bounds greatly + PiccoloAsserts.assertEquals(new PBounds(0,0,100,0), path.getBounds(), 1); } + + public void testCreatePolyLinePoint2DReturnsValidPPath() { + PPath path = PPath.createPolyline(new Point2D[] { + new Point2D.Double(0, 0), + new Point2D.Double(100, 50), + new Point2D.Double(100, 0) + }); + assertNotNull(path); + + // Seems like rounding is affecting the bounds greatly + PiccoloAsserts.assertEquals(new PBounds(0,0,100,50), path.getBounds(), 2); + } + + public void testCreatePolyLineFloatsReturnsValidPPath() { + PPath path = PPath.createPolyline(new float[] { 0, 100, 100}, new float[] { 0, 50, 0 }); + assertNotNull(path); + + // Seems like rounding is affecting the bounds greatly + PiccoloAsserts.assertEquals(new PBounds(0,0,100,50), path.getBounds(), 2); + } + + public void testSetStrokePaintPersists() { + PPath path = new PPath(); + path.setStrokePaint(Color.RED); + assertEquals(Color.RED, path.getStrokePaint()); + } + + public void testSetStrokeFiresPropertyChangeEvent() { + PPath path = new PPath(); + path.addPropertyChangeListener(PPath.PROPERTY_STROKE_PAINT, mockListener); + path.setStrokePaint(Color.RED); + assertEquals(1, mockListener.getPropertyChangeCount()); + } + + public void testChangingPathFiresPropertyChangeEvent() { + PPath path = new PPath(); + path.addPropertyChangeListener(PPath.PROPERTY_PATH, mockListener); + path.append(new Rectangle2D.Double(0, 0, 100, 50), true); + assertEquals(1, mockListener.getPropertyChangeCount()); + } + } Modified: piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PTextTest.java ============================================================================== --- piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PTextTest.java (original) +++ piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/nodes/PTextTest.java Sun Jul 19 16:56:41 2009 @@ -30,13 +30,11 @@ import java.awt.Color; import java.awt.Font; -import java.beans.PropertyChangeListener; import javax.swing.JLabel; -import edu.umd.cs.piccolo.MockPropertyChangeListener; - import junit.framework.TestCase; +import edu.umd.cs.piccolo.MockPropertyChangeListener; public class PTextTest extends TestCase { @@ -73,7 +71,6 @@ textNode.setText(null); assertEquals("", textNode.getText()); } - public void testBoundsGrowWithTextByDefault() { PText text123 = new PText("123"); Added: piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/util/PObjectOutputStreamTest.java ============================================================================== --- (empty file) +++ piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/util/PObjectOutputStreamTest.java Sun Jul 19 16:56:41 2009 @@ -0,0 +1,36 @@ +package edu.umd.cs.piccolo.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import junit.framework.TestCase; + +public class PObjectOutputStreamTest extends TestCase { + private PObjectOutputStream outStream; + private ByteArrayOutputStream outByteStream; + + public void setUp() throws IOException { + outByteStream = new ByteArrayOutputStream(); + outStream = new PObjectOutputStream(outByteStream); + } + + public void testToByteArrayThrowsExceptionOnNull() throws IOException { + try { + PObjectOutputStream.toByteArray(null); + } catch (NullPointerException e) { + // expected + } + } + + public void testToByteArrayOnEmptyStreamWorks() throws IOException { + outStream.flush(); + byte[] outputBytes = outByteStream.toByteArray(); + assertNotNull(outputBytes); + assertTrue("Header not output", outputBytes.length > 0); + } + + public void testWriteConditionalObjectAcceptsNull() throws IOException { + outStream.writeConditionalObject("A"); + + } +} Modified: piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java ============================================================================== --- piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java (original) +++ piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java Sun Jul 19 16:56:41 2009 @@ -387,8 +387,8 @@ manager.lockRepaint(component); RenderingHints oldHints = g2.getRenderingHints(); - - g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); + + g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); component.paint(g2); g2.setRenderingHints(oldHints); --~--~---------~--~----~------------~-------~--~----~ Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en -~----------~----~----~----~------~----~------~--~---