1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.text.similarity;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertThrows;
21
22 import org.junit.jupiter.api.BeforeAll;
23 import org.junit.jupiter.api.Test;
24 import org.junit.jupiter.params.ParameterizedTest;
25 import org.junit.jupiter.params.provider.MethodSource;
26
27
28
29
30 class JaroWinklerSimilarityTest {
31
32 private static JaroWinklerSimilarity similarity;
33
34 @BeforeAll
35 public static void setUp() {
36 similarity = new JaroWinklerSimilarity();
37 }
38
39
40
41
42
43
44
45
46 private static CharSequence wrap(final String string) {
47 return new CharSequence() {
48
49 @Override
50 public char charAt(final int index) {
51 return string.charAt(index);
52 }
53
54 @Override
55 public boolean equals(final Object obj) {
56 return string.equals(obj);
57 }
58
59 @Override
60 public int hashCode() {
61 return string.hashCode();
62 }
63
64 @Override
65 public int length() {
66 return string.length();
67 }
68
69 @Override
70 public CharSequence subSequence(final int start, final int end) {
71 return string.subSequence(start, end);
72 }
73
74 @Override
75 public String toString() {
76 return string;
77 }
78 };
79 }
80
81 @ParameterizedTest
82 @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputsEquals()")
83 void testGetJaroWinklerSimilarity(final Class<?> cls) {
84 assertEquals(1d, similarity.apply(SimilarityInputTest.build(cls, ""), SimilarityInputTest.build(cls, "")), 0.00001d);
85 assertEquals(1d, similarity.apply(SimilarityInputTest.build(cls, "foo"), SimilarityInputTest.build(cls, "foo")), 0.00001d);
86 assertEquals(0.94166d, similarity.apply(SimilarityInputTest.build(cls, "foo"), SimilarityInputTest.build(cls, "foo ")), 0.00001d);
87 assertEquals(0.90666d, similarity.apply(SimilarityInputTest.build(cls, "foo"), SimilarityInputTest.build(cls, "foo ")), 0.00001d);
88 assertEquals(0.86666d, similarity.apply(SimilarityInputTest.build(cls, "foo"), SimilarityInputTest.build(cls, " foo ")), 0.00001d);
89 assertEquals(0.51111d, similarity.apply(SimilarityInputTest.build(cls, "foo"), SimilarityInputTest.build(cls, " foo")), 0.00001d);
90 assertEquals(0.92499d, similarity.apply(SimilarityInputTest.build(cls, "frog"), SimilarityInputTest.build(cls, "fog")), 0.00001d);
91 assertEquals(0.0d, similarity.apply(SimilarityInputTest.build(cls, "fly"), SimilarityInputTest.build(cls, "ant")), 0.00000000000000000001d);
92 assertEquals(0.44166d, similarity.apply(SimilarityInputTest.build(cls, "elephant"), SimilarityInputTest.build(cls, "hippo")), 0.00001d);
93 assertEquals(0.90666d, similarity.apply(SimilarityInputTest.build(cls, "ABC Corporation"), SimilarityInputTest.build(cls, "ABC Corp")), 0.00001d);
94 assertEquals(0.95251d,
95 similarity.apply(SimilarityInputTest.build(cls, "D N H Enterprises Inc"), SimilarityInputTest.build(cls, "D & H Enterprises, Inc.")), 0.00001d);
96 assertEquals(0.942d, similarity.apply(SimilarityInputTest.build(cls, "My Gym Children's Fitness Center"),
97 SimilarityInputTest.build(cls, "My Gym. Childrens Fitness")), 0.00001d);
98 assertEquals(0.898018d, similarity.apply(SimilarityInputTest.build(cls, "PENNSYLVANIA"), SimilarityInputTest.build(cls, "PENNCISYLVNIA")), 0.00001d);
99 assertEquals(0.971428d, similarity.apply(SimilarityInputTest.build(cls, "/opt/software1"), SimilarityInputTest.build(cls, "/opt/software2")), 0.00001d);
100 assertEquals(0.941666d, similarity.apply(SimilarityInputTest.build(cls, "aaabcd"), SimilarityInputTest.build(cls, "aaacdb")), 0.00001d);
101 assertEquals(0.911111d, similarity.apply(SimilarityInputTest.build(cls, "John Horn"), SimilarityInputTest.build(cls, "John Hopkins")), 0.00001d);
102 }
103
104 @Test
105 void testGetJaroWinklerSimilarity_NullNull() {
106 assertThrows(IllegalArgumentException.class, () -> similarity.apply((String) null, null));
107 }
108
109 @Test
110 void testGetJaroWinklerSimilarity_NullString() {
111 assertThrows(IllegalArgumentException.class, () -> similarity.apply(null, "clear"));
112 }
113
114 @Test
115 void testGetJaroWinklerSimilarity_StringNull() {
116 assertThrows(IllegalArgumentException.class, () -> similarity.apply(" ", null));
117 }
118
119 @Test
120 void testGetJaroWinklerSimilarity_StringString() {
121 assertEquals(1d, similarity.apply(wrap(""), ""), 0.00001d);
122 assertEquals(1d, similarity.apply(wrap("foo"), "foo"), 0.00001d);
123 assertEquals(0.94166d, similarity.apply(wrap("foo"), "foo "), 0.00001d);
124 assertEquals(0.90666d, similarity.apply(wrap("foo"), "foo "), 0.00001d);
125 assertEquals(0.86666d, similarity.apply(wrap("foo"), " foo "), 0.00001d);
126 assertEquals(0.51111d, similarity.apply(wrap("foo"), " foo"), 0.00001d);
127 assertEquals(0.92499d, similarity.apply(wrap("frog"), "fog"), 0.00001d);
128 assertEquals(0.0d, similarity.apply(wrap("fly"), "ant"), 0.00000000000000000001d);
129 assertEquals(0.44166d, similarity.apply(wrap("elephant"), "hippo"), 0.00001d);
130 assertEquals(0.90666d, similarity.apply(wrap("ABC Corporation"), "ABC Corp"), 0.00001d);
131 assertEquals(0.95251d, similarity.apply(wrap("D N H Enterprises Inc"), "D & H Enterprises, Inc."), 0.00001d);
132 assertEquals(0.942d, similarity.apply(wrap("My Gym Children's Fitness Center"), "My Gym. Childrens Fitness"), 0.00001d);
133 assertEquals(0.898018d, similarity.apply(wrap("PENNSYLVANIA"), "PENNCISYLVNIA"), 0.00001d);
134 assertEquals(0.971428d, similarity.apply(wrap("/opt/software1"), "/opt/software2"), 0.00001d);
135 assertEquals(0.941666d, similarity.apply(wrap("aaabcd"), "aaacdb"), 0.00001d);
136 assertEquals(0.911111d, similarity.apply(wrap("John Horn"), "John Hopkins"), 0.00001d);
137 }
138
139 }