Ticket #21646: 21646.round.patch

File 21646.round.patch, 3.6 KB (added by taylor.smock, 4 years ago)

Round on coordinate add

  • src/org/openstreetmap/josm/data/imagery/Shape.java

    diff --git a/src/org/openstreetmap/josm/data/imagery/Shape.java b/src/org/openstreetmap/josm/data/imagery/Shape.java
    index 9e7fa16076..c55d371d61 100644
    a b  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.data.imagery;
    33
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
    46import java.awt.Polygon;
    57import java.text.MessageFormat;
    68import java.util.AbstractList;
    import org.openstreetmap.gui.jmapviewer.Coordinate;  
    1315import org.openstreetmap.josm.data.coor.LatLon;
    1416import org.openstreetmap.josm.tools.CheckParameterUtil;
    1517
    16 import static org.openstreetmap.josm.tools.I18n.tr;
    17 
    1818/**
    1919 * Data class to store the outline for background imagery coverage.
    2020 *
    public class Shape {  
    8585        };
    8686    }
    8787
     88    /**
     89     * Check if the coordinates are inside this shape.
     90     * @see Polygon#contains(int, int)
     91     * @param latlon The latlon to look for
     92     * @return {@code true} if the LatLon is inside the shape.
     93     */
    8894    public boolean contains(LatLon latlon) {
    8995        return coords.contains(
    9096                latlon.getX() * LatLon.MAX_SERVER_INV_PRECISION,
    public class Shape {  
    114120        }
    115121
    116122        coords.addPoint(
    117                 (int) (lon * LatLon.MAX_SERVER_INV_PRECISION),
    118                 (int) (lat * LatLon.MAX_SERVER_INV_PRECISION));
     123                (int) Math.round((lon * LatLon.MAX_SERVER_INV_PRECISION)),
     124                (int) Math.round((lat * LatLon.MAX_SERVER_INV_PRECISION)));
    119125    }
    120126
    121127    @Override
  • test/unit/org/openstreetmap/josm/data/imagery/ShapeTest.java

    diff --git a/test/unit/org/openstreetmap/josm/data/imagery/ShapeTest.java b/test/unit/org/openstreetmap/josm/data/imagery/ShapeTest.java
    index 4887ff3085..6ac3e4901b 100644
    a b  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.data.imagery;
    33
     4import static org.junit.jupiter.api.Assertions.assertAll;
    45import static org.junit.jupiter.api.Assertions.assertEquals;
    56
    67import java.util.Arrays;
    78
    89import org.junit.jupiter.api.Test;
     10import org.junit.jupiter.params.ParameterizedTest;
     11import org.junit.jupiter.params.provider.ValueSource;
    912
    1013/**
    1114 * Unit tests for class {@link Shape}.
    class ShapeTest {  
    2831        assertEquals("47.1//11.1//47.2//11.2//47.3//11.3", shape.encodeAsString("//"));
    2932        assertEquals("47.1,11.1,47.2,11.2,47.3,11.3;47.1,11.1,47.2,11.2,47.3,11.3", Shape.encodeAsString(Arrays.asList(shape, shape)));
    3033    }
     34
     35    /**
     36     * Check double edge cases
     37     * @param coordinate the coordinate to check
     38     */
     39    @ParameterizedTest
     40    @ValueSource(doubles = {
     41            // The double representation of 0.2575799 * 1e7 is 2575798.9999999995. Directly casting to int will round down.
     42            0.2575799,
     43            // Check that 2575798.0000000005 is rounded down
     44            0.2575798
     45    })
     46    void testDoubleEdgeCases(final double coordinate) {
     47        final Shape shape = new Shape();
     48        shape.addPoint(Double.toString(1), Double.toString(coordinate));
     49        shape.addPoint(Double.toString(coordinate), Double.toString(1));
     50        shape.addPoint(Double.toString(coordinate), Double.toString(coordinate));
     51        assertAll("Coordinates are not properly rounded on entry",
     52                () -> assertEquals(coordinate, shape.getPoints().get(0).getLon()),
     53                () -> assertEquals(coordinate, shape.getPoints().get(1).getLat()));
     54    }
    3155}