modules/graphics/src/test/java/javafx/scene/layout/RegionPickTest.java

Print this page

        

@@ -25,10 +25,11 @@
 
 package javafx.scene.layout;
 
 import javafx.geometry.Insets;
 import javafx.scene.paint.Color;
+import javafx.scene.shape.Circle;
 import org.junit.Before;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
 

@@ -510,7 +511,86 @@
      * positionShape / scaleShape variants to make sure we are always picking *
      * based on the perceived (rendered) shape                                *
      *                                                                        *
      *************************************************************************/
 
-    // TODO implement along with fix for RT-27775
+    @Test public void pickingSimpleShape() {
+        region.setPickOnBounds(false);
+        region.setScaleShape(false);
+        region.setCenterShape(false);
+        region.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
+        
+        region.setShape(new Circle(50, 50, 30));
+        
+        assertFalse(region.contains(X + 50, Y + 81));
+        assertFalse(region.contains(X + 50, Y + 19));
+        assertFalse(region.contains(X + 81, Y + 50));
+        assertFalse(region.contains(X + 19, Y + 50));
+        assertTrue(region.contains(X + 50, Y + 79));
+        assertTrue(region.contains(X + 50, Y + 21));
+        assertTrue(region.contains(X + 79, Y + 50));
+        assertTrue(region.contains(X + 21, Y + 50));
+        
+    }
+    
+    @Test public void pickingCenteredShape() {
+        region.setPickOnBounds(false);
+        region.setScaleShape(false);
+        region.setCenterShape(true);
+        region.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
+
+        region.setShape(new Circle(0, 0, 30));
+
+        assertFalse(region.contains(X + 50, Y + 81));
+        assertFalse(region.contains(X + 50, Y + 19));
+        assertFalse(region.contains(X + 81, Y + 50));
+        assertFalse(region.contains(X + 19, Y + 50));
+        assertTrue(region.contains(X + 50, Y + 79));
+        assertTrue(region.contains(X + 50, Y + 21));
+        assertTrue(region.contains(X + 79, Y + 50));
+        assertTrue(region.contains(X + 21, Y + 50));
+        
+    }
+    
+    @Test public void pickingScaledShape() {
+        region.setPickOnBounds(false);
+        region.setScaleShape(true);
+        region.setCenterShape(false);
+        region.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
+
+        region.setShape(new Circle(0, 0, 30));
+
+        assertFalse(region.contains(X, Y + HEIGHT / 2  + 1));
+        assertFalse(region.contains(X, Y - HEIGHT / 2  - 1));
+        assertFalse(region.contains(X + WIDTH / 2 + 1, Y));
+        assertFalse(region.contains(X - WIDTH / 2 - 1, Y));
+        
+        assertTrue(region.contains(X + 1, Y + HEIGHT / 2 - 1));
+        assertTrue(region.contains(X + WIDTH / 2 - 1, Y));
+        
+        // Even though the shape is there, these points are outside of region's bounds, so it wouldn't be really picked.
+        assertFalse(region.contains(X + 1, Y - HEIGHT / 2 + 1));
+        assertFalse(region.contains(X - WIDTH / 2 + 1, Y));
+        
+    }
+    
+    @Test public void pickingScaledAndCenteredShape() {
+        region.setPickOnBounds(false);
+        region.setScaleShape(true);
+        region.setCenterShape(true);
+        region.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
+
+        region.setShape(new Circle(0, 0, 30));
+
+        assertFalse(region.contains(X + WIDTH / 2, Y + HEIGHT + 1));
+        assertFalse(region.contains(X + WIDTH / 2, Y - 1));
+        assertFalse(region.contains(X + WIDTH + 1, Y + HEIGHT / 2));
+        assertFalse(region.contains(X - 1, Y + HEIGHT / 2));
+        
+        assertTrue(region.contains(X + WIDTH / 2, Y + HEIGHT - 1));
+        assertTrue(region.contains(X + WIDTH / 2, Y + 1));
+        assertTrue(region.contains(X + WIDTH - 1, Y + HEIGHT / 2));
+        assertTrue(region.contains(X + 1, Y + HEIGHT / 2));
+        
+    }
+    
 }