// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.validation.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.function.Function; import java.util.function.Predicate; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.validation.Test; import org.openstreetmap.josm.data.validation.TestError; import org.openstreetmap.josm.gui.DefaultNameFormatter; import org.openstreetmap.josm.io.OsmReader; /** * Utilities for validator unit tests. */ public final class ValidatorTestUtils { private ValidatorTestUtils() { // Hide default constructor for utilities classes } static <T extends OsmPrimitive> void testSampleFile(String sampleFile, Function<DataSet, Iterable<T>> provider, Predicate<String> namePredicate, Test... tests) throws Exception { try (InputStream is = new FileInputStream(sampleFile)) { for (T t: provider.apply(OsmReader.parseDataSet(is, null))) { String name = DefaultNameFormatter.getInstance().format(t); String codes = t.get("josm_error_codes"); if (codes != null) { List<TestError> errors = new ArrayList<>(); for (Test test : tests) { test.initialize(); test.startTest(null); test.visit(Collections.singleton(t)); test.endTest(); errors.addAll(test.getErrors()); } Set<Integer> expectedCodes = new TreeSet<>(); if (!"none".equals(codes)) { for (String code : codes.split(",")) { expectedCodes.add(Integer.parseInt(code)); } } Set<Integer> actualCodes = new TreeSet<>(); for (TestError error : errors) { Integer code = error.getCode(); assertTrue(name + " does not expect JOSM error code " + code + ": " + error.getDescription(), expectedCodes.contains(code)); actualCodes.add(code); } assertEquals(name + " " + expectedCodes + " => " + actualCodes, expectedCodes.size(), actualCodes.size()); } else if (t.hasKey("name") && namePredicate != null && namePredicate.test(t.getName())) { fail(name + " lacks josm_error_codes tag"); } } } } }