Revision: 808
Author: heuermh
Date: Fri Oct 23 13:36:43 2009
Log: making PCamera internally consistent with regards to layer references,  
best we can do without making related methods final
http://code.google.com/p/piccolo2d/source/detail?r=808

Modified:
  /piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/PCamera.java
   
/piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/PCameraTest.java

=======================================
---  
/piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/PCamera.java        
 
Tue Oct 20 14:02:49 2009
+++  
/piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/PCamera.java        
 
Fri Oct 23 13:36:43 2009
@@ -336,12 +336,9 @@
       *    by this camera is empty
       */
      public PBounds getUnionOfLayerFullBounds() {
-        // todo:  this method is implemented inconsistently with regards  
to non-final methods
-        //   a subclass might override getLayerCount and/or getLayer, thus  
this method should either
-        //    use layers.size() and layers.get(index) or getLayerCount()  
and getLayer(index)
          final PBounds result = new PBounds();
-        final int count = getLayerCount();
-        for (int i = 0; i < count; i++) {
+        final int size = layers.size();
+        for (int i = 0; i < size; i++) {
              final PLayer each = (PLayer) layers.get(i);
              result.add(each.getFullBoundsReference());
          }
@@ -375,11 +372,8 @@
       * @param paintContext context in which painting occurs
       */
      protected void paintCameraView(final PPaintContext paintContext) {
-        // todo:  this method is implemented inconsistently with regards  
to non-final methods
-        //   a subclass might override getLayerCount and/or getLayer, thus  
this method should either
-        //    use layers.size() and layers.get(index) or getLayerCount()  
and getLayer(index)
-        final int count = getLayerCount();
-        for (int i = 0; i < count; i++) {
+        final int size = layers.size();
+        for (int i = 0; i < size; i++) {
              final PLayer each = (PLayer) layers.get(i);
              each.fullPaint(paintContext);
          }
@@ -402,8 +396,9 @@
              final Color boundsColor = Color.red;
              final Color fullBoundsColor = new Color(1.0f, 0f, 0f, 0.2f);

-            for (int i = 0; i < getLayerCount(); i++) {
-                getLayer(i).getAllNodes(null, nodes);
+            final int size = layers.size();
+            for (int i = 0; i < size; i++) {
+                ((PLayer) layers.get(i)).getAllNodes(null, nodes);
              }

              final Iterator i = getAllNodes(null, nodes).iterator();
@@ -521,11 +516,8 @@
       *    camera were picked
       */
      protected boolean pickCameraView(final PPickPath pickPath) {
-        // todo:  this method is implemented inconsistently with regards  
to non-final methods
-        //   a subclass might override getLayerCount and/or getLayer, thus  
this method should either
-        //    use layers.size() and layers.get(index) or getLayerCount()  
and getLayer(index)
-        final int count = getLayerCount();
-        for (int i = count - 1; i >= 0; i--) {
+        final int size = layers.size();
+        for (int i = size - 1; i >= 0; i--) {
              final PLayer each = (PLayer) layers.get(i);
              if (each.fullPick(pickPath)) {
                  return true;
=======================================
---  
/piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/PCameraTest.java    
 
Fri Oct 23 12:36:22 2009
+++  
/piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/PCameraTest.java    
 
Fri Oct 23 13:36:43 2009
@@ -35,6 +35,7 @@
  import java.awt.geom.AffineTransform;
  import java.awt.image.BufferedImage;
  import java.io.IOException;
+import java.util.Collection;

  import junit.framework.TestCase;
  import edu.umd.cs.piccolo.activities.PActivity;
@@ -42,6 +43,7 @@
  import edu.umd.cs.piccolo.util.PAffineTransform;
  import edu.umd.cs.piccolo.util.PBounds;
  import edu.umd.cs.piccolo.util.PDebug;
+import edu.umd.cs.piccolo.util.PNodeFilter;
  import edu.umd.cs.piccolo.util.PPaintContext;
  import edu.umd.cs.piccolo.util.PPickPath;

@@ -345,6 +347,90 @@
              // expected
          }
      }
+
+    public void testTooFewLayersCamera() {
+        PCamera tooFew = new TooFewLayersCamera();
+        MockPLayer layer0 = new MockPLayer();
+        MockPLayer layer1 = new MockPLayer();
+        tooFew.addLayer(layer0);
+        tooFew.addLayer(layer1);
+        assertEquals(layer0, tooFew.getLayer(0));
+        assertEquals(layer1, tooFew.getLayer(1));
+        assertEquals(layer0, tooFew.getLayersReference().get(0));
+        assertEquals(layer1, tooFew.getLayersReference().get(1));
+        assertEquals(0, tooFew.indexOfLayer(layer0));
+        assertEquals(0, tooFew.indexOfLayer(layer0));
+
+        // pickCameraView
+        PPickPath pickPath = new PPickPath(tooFew, new PBounds(0, 0, 400,  
400));
+        tooFew.pickCameraView(pickPath);
+        assertTrue(layer0.fullPickCalled());
+        assertTrue(layer1.fullPickCalled());
+
+        // paintCameraView
+        BufferedImage image = new BufferedImage(1, 1,  
BufferedImage.TYPE_INT_ARGB);
+        Graphics2D graphics = image.createGraphics();
+        PPaintContext paintContext = new PPaintContext(graphics);
+        tooFew.paintCameraView(paintContext);
+        assertTrue(layer0.fullPaintCalled());
+        assertTrue(layer1.fullPaintCalled());
+
+        // getUnionOfLayerFullBounds
+        tooFew.getUnionOfLayerFullBounds();
+        assertTrue(layer0.fullBoundsReferenceCalled());
+        assertTrue(layer1.fullBoundsReferenceCalled());
+
+        // paintDebugInfo
+        PDebug.debugBounds = true;
+        tooFew.paintDebugInfo(paintContext);
+        assertTrue(layer0.getAllNodesCalled());
+        assertTrue(layer1.getAllNodesCalled());
+        PDebug.debugBounds = false;
+
+        graphics.dispose();
+    }
+
+    public void testTooManyLayersCamera() {
+        PCamera tooMany = new TooManyLayersCamera();
+        MockPLayer layer0 = new MockPLayer();
+        MockPLayer layer1 = new MockPLayer();
+        tooMany.addLayer(layer0);
+        tooMany.addLayer(layer1);
+        assertEquals(layer0, tooMany.getLayer(0));
+        assertEquals(layer1, tooMany.getLayer(1));
+        assertEquals(layer0, tooMany.getLayersReference().get(0));
+        assertEquals(layer1, tooMany.getLayersReference().get(1));
+        assertEquals(0, tooMany.indexOfLayer(layer0));
+        assertEquals(0, tooMany.indexOfLayer(layer0));
+
+        // pickCameraView
+        PPickPath pickPath = new PPickPath(tooMany, new PBounds(0, 0, 400,  
400));
+        tooMany.pickCameraView(pickPath);
+        assertTrue(layer0.fullPickCalled());
+        assertTrue(layer1.fullPickCalled());
+
+        // paintCameraView
+        BufferedImage image = new BufferedImage(1, 1,  
BufferedImage.TYPE_INT_ARGB);
+        Graphics2D graphics = image.createGraphics();
+        PPaintContext paintContext = new PPaintContext(graphics);
+        tooMany.paintCameraView(paintContext);
+        assertTrue(layer0.fullPaintCalled());
+        assertTrue(layer1.fullPaintCalled());
+
+        // getUnionOfLayerFullBounds
+        tooMany.getUnionOfLayerFullBounds();
+        assertTrue(layer0.fullBoundsReferenceCalled());
+        assertTrue(layer1.fullBoundsReferenceCalled());
+
+        // paintDebugInfo
+        PDebug.debugBounds = true;
+        tooMany.paintDebugInfo(paintContext);
+        assertTrue(layer0.getAllNodesCalled());
+        assertTrue(layer1.getAllNodesCalled());
+        PDebug.debugBounds = false;
+
+        graphics.dispose();
+    }

      static class MockPComponent implements PComponent {

@@ -363,4 +449,79 @@
          public void setInteracting(final boolean interacting) {
          }
      }
-}
+
+    /**
+     * Mock PLayer.  Should consider using mock library in version 2.0.
+     */
+    private static final class MockPLayer extends PLayer {
+        private static final long serialVersionUID = 1L;
+        private boolean fullBoundsReferenceCalled = false;
+        private boolean fullPaintCalled = false;
+        private boolean getAllNodesCalled = false;
+        private boolean fullPickCalled = false;
+
+        /** {...@inheritdoc} */
+        public PBounds getFullBoundsReference() {
+            fullBoundsReferenceCalled = true;
+            return super.getFullBoundsReference();
+        }
+
+        /** {...@inheritdoc} */
+        public void fullPaint(final PPaintContext paintContext) {
+            fullPaintCalled = true;
+            super.fullPaint(paintContext);
+        }
+
+        /** {...@inheritdoc} */
+        public Collection getAllNodes(final PNodeFilter filter, final  
Collection nodes) {
+            getAllNodesCalled = true;
+            return super.getAllNodes(filter, nodes);
+        }
+
+        /** {...@inheritdoc} */
+        public boolean fullPick(final PPickPath pickPath) {
+            fullPickCalled = true;
+            return super.fullPick(pickPath);
+        }
+
+        private boolean fullBoundsReferenceCalled() {
+            return fullBoundsReferenceCalled;
+        }
+
+        private boolean fullPaintCalled() {
+            return fullPaintCalled;
+        }
+
+        private boolean getAllNodesCalled() {
+            return getAllNodesCalled;
+        }
+
+        private boolean fullPickCalled() {
+            return fullPickCalled;
+        }
+    }
+
+    /**
+     * Subclass of PCamera that advertises too few layers.
+     */
+    private static final class TooFewLayersCamera extends PCamera {
+        private static final long serialVersionUID = 1L;
+
+        /** {...@inheritdoc} */
+        public int getLayerCount() {
+            return Math.max(0, super.getLayerCount() - 1);
+        }
+    }
+
+    /**
+     * Subclass of PCamera that advertises too many layers.
+     */
+    private static final class TooManyLayersCamera extends PCamera {
+        private static final long serialVersionUID = 1L;
+
+        /** {...@inheritdoc} */
+        public int getLayerCount() {
+            return super.getLayerCount() + 1;
+        }
+    }
+}

--~--~---------~--~----~------------~-------~--~----~
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to