1 | // License: GPL. See LICENSE file for details. |
---|
2 | package org.openstreetmap.josm.data.validation.tests |
---|
3 | |
---|
4 | import static org.junit.Assert.assertEquals |
---|
5 | |
---|
6 | import org.openstreetmap.josm.JOSMFixture |
---|
7 | import org.openstreetmap.josm.data.coor.LatLon |
---|
8 | import org.openstreetmap.josm.data.osm.DataSet |
---|
9 | import org.openstreetmap.josm.data.osm.Node |
---|
10 | import org.openstreetmap.josm.data.osm.Way |
---|
11 | import org.openstreetmap.josm.data.validation.TestError |
---|
12 | |
---|
13 | class SimilarNamedWaysTest extends GroovyTestCase { |
---|
14 | |
---|
15 | SimilarNamedWays test = new SimilarNamedWays() |
---|
16 | |
---|
17 | @Override |
---|
18 | void setUp() { |
---|
19 | JOSMFixture.createUnitTestFixture().init(); |
---|
20 | } |
---|
21 | |
---|
22 | public static List<TestError> testWays(String namea, String nameb) { |
---|
23 | def ds = new DataSet() |
---|
24 | |
---|
25 | def n00 = new Node(new LatLon(0, 0)) |
---|
26 | def n10 = new Node(new LatLon(1, 0)) |
---|
27 | def n20 = new Node(new LatLon(2, 0)) |
---|
28 | def n30 = new Node(new LatLon(3, 0)) |
---|
29 | def n40 = new Node(new LatLon(4, 0)) |
---|
30 | |
---|
31 | ds.addPrimitive(n00) |
---|
32 | ds.addPrimitive(n10) |
---|
33 | ds.addPrimitive(n20) |
---|
34 | ds.addPrimitive(n30) |
---|
35 | ds.addPrimitive(n40) |
---|
36 | |
---|
37 | def waya = new Way() |
---|
38 | waya.addNode(n00) |
---|
39 | waya.addNode(n10) |
---|
40 | waya.addNode(n20) |
---|
41 | waya.put("name", namea) |
---|
42 | def wayb = new Way() |
---|
43 | wayb.addNode(n20) |
---|
44 | wayb.addNode(n30) |
---|
45 | wayb.addNode(n40) |
---|
46 | wayb.put("name", nameb) |
---|
47 | |
---|
48 | ds.addPrimitive(waya) |
---|
49 | ds.addPrimitive(wayb) |
---|
50 | |
---|
51 | assert waya.isUsable() |
---|
52 | assert wayb.isUsable() |
---|
53 | |
---|
54 | def t = new SimilarNamedWays() |
---|
55 | t.startTest(null) |
---|
56 | t.visit(waya) |
---|
57 | t.visit(wayb) |
---|
58 | return t.errors |
---|
59 | } |
---|
60 | |
---|
61 | void testCombinations() { |
---|
62 | assert testWays("Church Street", "Water Street").isEmpty() |
---|
63 | assert !testWays("Main Street", "Maim Street").isEmpty() |
---|
64 | assert !testWays("First Street", "Frist Street").isEmpty() |
---|
65 | |
---|
66 | assert testWays("1st Street", "2nd Street").isEmpty() |
---|
67 | assert testWays("First Avenue", "Second Avenue").isEmpty() |
---|
68 | assert testWays("West Main Street", "East Main Street").isEmpty() |
---|
69 | assert testWays("A Street", "B Street").isEmpty() |
---|
70 | } |
---|
71 | |
---|
72 | void checkSimilarity(String message, String name1, String name2, boolean expected) { |
---|
73 | boolean actual = test.similaryName(name1, name2); |
---|
74 | assertEquals(message, expected, actual); |
---|
75 | } |
---|
76 | |
---|
77 | void testSimilarNames() { |
---|
78 | checkSimilarity("same string", "Testname", "Testname", false); |
---|
79 | checkSimilarity("different case", "Testname", "TestName", true); |
---|
80 | checkSimilarity("typo", "Testname", "Testxame", true); |
---|
81 | checkSimilarity("missing char", "Testname", "Testame", true); |
---|
82 | checkSimilarity("additional char", "Testname", "Testxname", true); |
---|
83 | checkSimilarity("2 changes", "Testname", "Tostxname", true); |
---|
84 | checkSimilarity("3 changes", "Testname", "Tostxnam", false); |
---|
85 | |
---|
86 | // regular expression rule |
---|
87 | checkSimilarity("same number", "track 1", "track 1", false); |
---|
88 | checkSimilarity("different number", "track 1", "track 2", false); |
---|
89 | checkSimilarity("different number length", "track 9", "track 10", false); |
---|
90 | checkSimilarity("multiple numbers", "track 8 - 9", "track 10 - 11", false); |
---|
91 | |
---|
92 | checkSimilarity("1st and 2nd", "1st Street", "2nd Street", false); |
---|
93 | checkSimilarity("1st case", "1St Street", "1st Street", true); |
---|
94 | checkSimilarity("1st and 2nd case", "1St Street", "2nd Street", true); |
---|
95 | checkSimilarity("3rd and 4th", "2rd Street", "4th Street", false); |
---|
96 | |
---|
97 | // synonyms |
---|
98 | checkSimilarity("east and west", "East Foothill Drive", "West Foothill Drive", false); |
---|
99 | checkSimilarity("east and west case", "east Foothill Drive", "West Foothill Drive", true); |
---|
100 | checkSimilarity("first and second", "First Street", "Second Street", false); |
---|
101 | checkSimilarity("first and second case", "First Street", "second Street", true); |
---|
102 | checkSimilarity("first and second typo", "Forst Street", "Second Street", true); |
---|
103 | checkSimilarity("first and second typo2", "First Street", "Socond Street", true); |
---|
104 | checkSimilarity("first and second 2 changes", "First Street", "Soconds Street", true); |
---|
105 | checkSimilarity("first and second 3 changes", "First Street", "Soconds Stret", false); |
---|
106 | } |
---|
107 | } |
---|