Changeset 18875 in josm for trunk/test/unit/org


Ignore:
Timestamp:
2023-10-23T21:06:35+02:00 (11 months ago)
Author:
taylor.smock
Message:

Fix #23238: Some MapCSS functions cause NPEs when part of fixAdd

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/FunctionsTest.java

    r18870 r18875  
    33
    44import static org.junit.jupiter.api.Assertions.assertAll;
     5import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
    56import static org.junit.jupiter.api.Assertions.assertEquals;
    67import static org.junit.jupiter.api.Assertions.assertFalse;
     
    910import static org.junit.jupiter.api.Assertions.assertSame;
    1011import static org.junit.jupiter.api.Assertions.assertTrue;
     12import static org.junit.jupiter.api.Assertions.fail;
    1113import static org.openstreetmap.josm.data.osm.OsmPrimitiveType.NODE;
    1214
     15import java.lang.reflect.Method;
     16import java.lang.reflect.Modifier;
    1317import java.util.Arrays;
    1418import java.util.Collections;
    1519import java.util.List;
    1620import java.util.Objects;
    17 
     21import java.util.stream.Stream;
     22
     23import org.junit.jupiter.api.AfterAll;
    1824import org.junit.jupiter.api.Test;
     25import org.junit.jupiter.params.ParameterizedTest;
     26import org.junit.jupiter.params.provider.MethodSource;
    1927import org.openstreetmap.josm.TestUtils;
    2028import org.openstreetmap.josm.data.coor.LatLon;
     
    3038import org.openstreetmap.josm.data.preferences.NamedColorProperty;
    3139import org.openstreetmap.josm.gui.mappaint.Environment;
     40import org.openstreetmap.josm.gui.mappaint.MultiCascade;
    3241import org.openstreetmap.josm.gui.util.GuiHelper;
    3342import org.openstreetmap.josm.spi.preferences.Config;
     
    3544import org.openstreetmap.josm.testutils.annotations.MapPaintStyles;
    3645import org.openstreetmap.josm.testutils.annotations.Projection;
     46import org.openstreetmap.josm.testutils.annotations.Territories;
    3747
    3848/**
     
    6272            return new Environment(osm);
    6373        }
     74    }
     75
     76    private static Method[] FUNCTIONS;
     77
     78    static Stream<Method> getFunctions() {
     79        if (FUNCTIONS == null) {
     80            FUNCTIONS = Stream.of(Functions.class.getDeclaredMethods())
     81                    .filter(m -> Modifier.isStatic(m.getModifiers()) && Modifier.isPublic(m.getModifiers()))
     82                    .toArray(Method[]::new);
     83        }
     84        return Stream.of(FUNCTIONS);
     85    }
     86
     87    @AfterAll
     88    static void tearDown() {
     89        FUNCTIONS = null;
    6490    }
    6591
     
    231257        assertTrue(Functions.parent_osm_primitives(env, "type2").isEmpty());
    232258    }
     259
     260    /**
     261     * Non-regression test for #23238: NPE when env.osm is null
     262     */
     263    @ParameterizedTest
     264    @MethodSource("getFunctions")
     265    @Territories // needed for inside, outside, is_right_hand_traffic
     266    void testNonRegression23238(Method function) {
     267        if (function.getParameterCount() >= 1 && function.getParameterTypes()[0].isAssignableFrom(Environment.class)
     268         && !function.getParameterTypes()[0].equals(Object.class)) {
     269            Environment nullOsmEnvironment = new Environment();
     270            nullOsmEnvironment.mc = new MultiCascade();
     271            Object[] args = new Object[function.getParameterCount()];
     272            args[0] = nullOsmEnvironment;
     273            for (int i = 1; i < function.getParameterCount(); i++) {
     274                final Class<?> type = function.getParameterTypes()[i];
     275                if (String.class.isAssignableFrom(type)) {
     276                    args[i] = "";
     277                } else if (String[].class.isAssignableFrom(type)) {
     278                    args[i] = new String[] {"{0}", ""}; // join and tr require at least 2 arguments
     279                } else if (Double.class.isAssignableFrom(type) || double.class.isAssignableFrom(type)) {
     280                    args[i] = 0d;
     281                } else if (Object.class.isAssignableFrom(type)) {
     282                    args[i] = new Object[0];
     283                } else {
     284                    fail(type.getCanonicalName());
     285                }
     286            }
     287            assertDoesNotThrow(() -> function.invoke(null, args));
     288        }
     289    }
    233290}
Note: See TracChangeset for help on using the changeset viewer.