Ticket #21300: 21300.3.patch

File 21300.3.patch, 6.3 KB (added by taylor.smock, 5 years ago)

Message change to "Reference value for ''{0}'' expected", with code to determine the {0} placeholder. Otherwise, same as attachment:21300.patch

  • src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java

    diff --git a/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java b/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java
    index c5b17638f1..91b3ac67ab 100644
    a b public class SearchCompiler {  
    290290        public final boolean test(OsmPrimitive object) {
    291291            return match(object);
    292292        }
     293
     294        /**
     295         * Check if this is a valid match object
     296         * @return {@code this}, for easy chaining
     297         * @throws SearchParseError If the match is not valid
     298         */
     299        public Match validate() throws SearchParseError {
     300            // Default to no-op
     301            return this;
     302        }
    293303    }
    294304
    295305    public abstract static class TaggedMatch extends Match {
    public class SearchCompiler {  
    861871                return false;
    862872            return true;
    863873        }
     874
     875        @Override
     876        public Match validate() throws SearchParseError {
     877            if (this.referenceValue == null) {
     878                final String referenceType;
     879                if (this.compareMode == +1) {
     880                    referenceType = ">";
     881                } else if (this.compareMode == -1) {
     882                    referenceType = "<";
     883                } else {
     884                    referenceType = "<unknown>";
     885                }
     886                throw new SearchParseError(tr("Reference value for ''{0}'' expected", referenceType));
     887            }
     888            return this;
     889        }
    864890    }
    865891
    866892    /**
    public class SearchCompiler {  
    21082134            // factor consists of key:value or key=value
    21092135            String key = tokenizer.getText();
    21102136            if (tokenizer.readIfEqual(Token.EQUALS)) {
    2111                 return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber());
     2137                return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber()).validate();
    21122138            } else if (tokenizer.readIfEqual(Token.TILDE)) {
    2113                 return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber());
     2139                return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber()).validate();
    21142140            } else if (tokenizer.readIfEqual(Token.LESS_THAN)) {
    2115                 return new ValueComparison(key, tokenizer.readTextOrNumber(), -1);
     2141                return new ValueComparison(key, tokenizer.readTextOrNumber(), -1).validate();
    21162142            } else if (tokenizer.readIfEqual(Token.GREATER_THAN)) {
    2117                 return new ValueComparison(key, tokenizer.readTextOrNumber(), +1);
     2143                return new ValueComparison(key, tokenizer.readTextOrNumber(), +1).validate();
    21182144            } else if (tokenizer.readIfEqual(Token.COLON)) {
    21192145                // see if we have a Match that takes a data parameter
    21202146                SimpleMatchFactory factory = simpleMatchFactoryMap.get(key);
    public class SearchCompiler {  
    21232149
    21242150                UnaryMatchFactory unaryFactory = unaryMatchFactoryMap.get(key);
    21252151                if (unaryFactory != null)
    2126                     return unaryFactory.get(key, parseFactor(), tokenizer);
     2152                    return unaryFactory.get(key, parseFactor(), tokenizer).validate();
    21272153
    21282154                // key:value form where value is a string (may be OSM key search)
    21292155                final String value = tokenizer.readTextOrNumber();
    2130                 return new KeyValue(key, value != null ? value : "", regexSearch, caseSensitive);
     2156                return new KeyValue(key, value != null ? value : "", regexSearch, caseSensitive).validate();
    21312157            } else if (tokenizer.readIfEqual(Token.QUESTION_MARK))
    21322158                return new BooleanMatch(key, false);
    21332159            else {
    21342160                SimpleMatchFactory factory = simpleMatchFactoryMap.get(key);
    21352161                if (factory != null)
    2136                     return factory.get(key, caseSensitive, regexSearch, null);
     2162                    return factory.get(key, caseSensitive, regexSearch, null).validate();
    21372163
    21382164                UnaryMatchFactory unaryFactory = unaryMatchFactoryMap.get(key);
    21392165                if (unaryFactory != null)
    2140                     return unaryFactory.get(key, parseFactor(), null);
     2166                    return unaryFactory.get(key, parseFactor(), null).validate();
    21412167
    21422168                // match string in any key or value
    2143                 return new Any(key, regexSearch, caseSensitive);
     2169                return new Any(key, regexSearch, caseSensitive).validate();
    21442170            }
    21452171        } else
    21462172            return null;
  • test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java

    diff --git a/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java b/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java
    index 9545c88cd7..1e34009fb6 100644
    a b import java.util.Collection;  
    1818import java.util.Collections;
    1919import java.util.Set;
    2020
     21import nl.jqno.equalsverifier.EqualsVerifier;
     22import nl.jqno.equalsverifier.Warning;
     23import org.junit.Assert;
     24import org.junit.jupiter.api.Test;
     25import org.junit.jupiter.api.Timeout;
     26import org.junit.jupiter.params.ParameterizedTest;
     27import org.junit.jupiter.params.provider.ValueSource;
    2128import org.openstreetmap.josm.TestUtils;
    2229import org.openstreetmap.josm.data.coor.LatLon;
    2330import org.openstreetmap.josm.data.osm.DataSet;
    import org.openstreetmap.josm.gui.tagging.presets.items.Key;  
    4249import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
    4350import org.openstreetmap.josm.tools.Logging;
    4451
    45 import nl.jqno.equalsverifier.EqualsVerifier;
    46 import nl.jqno.equalsverifier.Warning;
    47 import org.junit.Assert;
    48 import org.junit.jupiter.api.Test;
    49 import org.junit.jupiter.api.Timeout;
    50 
    5152/**
    5253 * Unit tests for class {@link SearchCompiler}.
    5354 */
    class SearchCompilerTest {  
    828829        sc.match(sc.n1, true);
    829830        sc.match(sc.n2, false);
    830831    }
     832
     833    /**
     834     * Non-regression test for JOSM #21300
     835     */
     836    @ParameterizedTest
     837    @ValueSource(strings = {"maxweight<" /* #21300 */, "maxweight>"})
     838    void testNonRegression21300(final String searchString) {
     839        assertThrows(SearchParseError.class, () -> SearchCompiler.compile(searchString));
     840    }
    831841}