// 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.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.openstreetmap.josm.JOSMFixture;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.data.validation.TestError;
/**
* Unit test of {@link SimilarNamedWays}
*/
public class SimilarNamedWaysTest {
private final SimilarNamedWays test = new SimilarNamedWays();
/**
* Setup test
*/
@Before
public void setUp() {
JOSMFixture.createUnitTestFixture().init();
}
private static List<TestError> testWays(String namea, String nameb) {
DataSet ds = new DataSet();
Node n00 = new Node(LatLon.ZERO);
Node n10 = new Node(new LatLon(1, 0));
Node n20 = new Node(new LatLon(2, 0));
Node n30 = new Node(new LatLon(3, 0));
Node n40 = new Node(new LatLon(4, 0));
ds.addPrimitive(n00);
ds.addPrimitive(n10);
ds.addPrimitive(n20);
ds.addPrimitive(n30);
ds.addPrimitive(n40);
Way waya = new Way();
waya.addNode(n00);
waya.addNode(n10);
waya.addNode(n20);
waya.put("name", namea);
Way wayb = new Way();
wayb.addNode(n20);
wayb.addNode(n30);
wayb.addNode(n40);
wayb.put("name", nameb);
ds.addPrimitive(waya);
ds.addPrimitive(wayb);
assertTrue(waya.isUsable());
assertTrue(wayb.isUsable());
SimilarNamedWays t = new SimilarNamedWays();
t.startTest(null);
t.visit(waya);
t.visit(wayb);
return t.getErrors();
}
@Test
public void testCombinations() {
assertTrue(testWays("Church Street", "Water Street").isEmpty());
assertFalse(testWays("Main Street", "Maim Street").isEmpty());
assertFalse(testWays("First Street", "Frist Street").isEmpty());
assertTrue(testWays("1st Street", "2nd Street").isEmpty());
assertTrue(testWays("First Avenue", "Second Avenue").isEmpty());
assertTrue(testWays("West Main Street", "East Main Street").isEmpty());
assertTrue(testWays("A Street", "B Street").isEmpty());
}
private void checkSimilarity(String message, String name1, String name2, boolean expected) {
boolean actual = test.similaryName(name1, name2);
assertEquals(message, expected, actual);
}
@Test
public void testSimilarNames() {
checkSimilarity("same string", "Testname", "Testname", false);
checkSimilarity("different case", "Testname", "TestName", true);
checkSimilarity("typo", "Testname", "Testxame", true);
checkSimilarity("missing char", "Testname", "Testame", true);
checkSimilarity("additional char", "Testname", "Testxname", true);
checkSimilarity("2 changes", "Testname", "Tostxname", true);
checkSimilarity("3 changes", "Testname", "Tostxnam", false);
// regular expression rule
checkSimilarity("same number", "track 1", "track 1", false);
checkSimilarity("different number", "track 1", "track 2", false);
checkSimilarity("different number length", "track 9", "track 10", false);
checkSimilarity("multiple numbers", "track 8 - 9", "track 10 - 11", false);
checkSimilarity("1st and 2nd", "1st Street", "2nd Street", false);
checkSimilarity("1st case", "1St Street", "1st Street", true);
checkSimilarity("1st and 2nd case", "1St Street", "2nd Street", true);
checkSimilarity("3rd and 4th", "2rd Street", "4th Street", false);
// synonyms
checkSimilarity("east and west", "East Foothill Drive", "West Foothill Drive", false);
checkSimilarity("east and west case", "east Foothill Drive", "West Foothill Drive", true);
checkSimilarity("first and second", "First Street", "Second Street", false);
checkSimilarity("first and second case", "First Street", "second Street", true);
checkSimilarity("first and second typo", "Forst Street", "Second Street", true);
checkSimilarity("first and second typo2", "First Street", "Socond Street", true);
checkSimilarity("first and second 2 changes", "First Street", "Soconds Street", true);
checkSimilarity("first and second 3 changes", "First Street", "Soconds Stret", false);
}
}