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.apache.commons.text.TextStringBuilder;
23 import org.junit.jupiter.api.Test;
24 import org.junit.jupiter.params.ParameterizedTest;
25 import org.junit.jupiter.params.provider.MethodSource;
26
27 class LevenshteinDetailedDistanceTest {
28
29 private static final LevenshteinDetailedDistance UNLIMITED_DISTANCE = LevenshteinDetailedDistance.getDefaultInstance();
30
31 @Test
32 void testApplyThrowsIllegalArgumentExceptionAndCreatesLevenshteinDetailedDistanceTakingInteger() {
33 assertThrows(IllegalArgumentException.class, () -> {
34 final LevenshteinDetailedDistance levenshteinDetailedDistance = new LevenshteinDetailedDistance(0);
35 final CharSequence charSequence = new TextStringBuilder();
36 levenshteinDetailedDistance.apply(charSequence, null);
37 });
38 }
39
40 @Test
41 void testApplyWithNullSimilarityInput() {
42 assertThrows(IllegalArgumentException.class,
43 () -> new LevenshteinDetailedDistance(0).apply((SimilarityInput<Object>) null, (SimilarityInput<Object>) null));
44 assertThrows(IllegalArgumentException.class,
45 () -> new LevenshteinDetailedDistance(0).apply(new SimilarityCharacterInput("asdf"), (SimilarityCharacterInput) null));
46 assertThrows(IllegalArgumentException.class,
47 () -> new LevenshteinDetailedDistance(0).apply((SimilarityCharacterInput) null, new SimilarityCharacterInput("asdf")));
48 assertThrows(IllegalArgumentException.class,
49 () -> new LevenshteinDetailedDistance(null).apply(new SimilarityCharacterInput("asdf"), (SimilarityCharacterInput) null));
50 assertThrows(IllegalArgumentException.class,
51 () -> new LevenshteinDetailedDistance(null).apply((SimilarityCharacterInput) null, new SimilarityCharacterInput("asdf")));
52 }
53
54 @Test
55 void testApplyWithNullString() {
56 assertThrows(IllegalArgumentException.class, () -> new LevenshteinDetailedDistance(0).apply((String) null, (String) null));
57 }
58
59 @Test
60 void testConstructorWithNegativeThreshold() {
61 assertThrows(IllegalArgumentException.class, () -> new LevenshteinDetailedDistance(-1));
62 }
63
64 @ParameterizedTest
65 @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputs()")
66 void testCreatesLevenshteinDetailedDistanceTakingInteger6(final Class<?> cls) {
67 final LevenshteinDetailedDistance levenshteinDetailedDistance = new LevenshteinDetailedDistance(0);
68 final LevenshteinResults levenshteinResults = levenshteinDetailedDistance.apply("", "Distance: 38, Insert: 0, Delete: 0, Substitute: 0");
69 assertEquals(0, levenshteinResults.getSubstituteCount());
70 assertEquals(0, levenshteinResults.getDeleteCount());
71 assertEquals(0, levenshteinResults.getInsertCount());
72 assertEquals(-1, levenshteinResults.getDistance());
73 assertEquals(levenshteinResults, levenshteinDetailedDistance.apply(SimilarityInputTest.build(cls, ""),
74 SimilarityInputTest.build(cls, "Distance: 38, Insert: 0, Delete: 0, Substitute: 0")));
75 }
76
77 @ParameterizedTest
78 @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputs()")
79 void testEquals(final Class<?> cls) {
80 final LevenshteinDetailedDistance classBeingTested = LevenshteinDetailedDistance.getDefaultInstance();
81 LevenshteinResults actualResult = classBeingTested.apply(SimilarityInputTest.build(cls, "hello"), SimilarityInputTest.build(cls, "hallo"));
82 LevenshteinResults expectedResult = new LevenshteinResults(1, 0, 0, 1);
83 assertEquals(expectedResult, actualResult);
84
85 assertEquals(classBeingTested.apply("zzzzzzzz", "hippo"),
86 classBeingTested.apply(SimilarityInputTest.build(cls, "zzzzzzzz"), SimilarityInputTest.build(cls, "hippo")));
87 actualResult = classBeingTested.apply(SimilarityInputTest.build(cls, "zzzzzzzz"), SimilarityInputTest.build(cls, "hippo"));
88 expectedResult = new LevenshteinResults(8, 0, 3, 5);
89 assertEquals(expectedResult, actualResult);
90 assertEquals(actualResult, actualResult);
91
92 actualResult = classBeingTested.apply(SimilarityInputTest.build(cls, ""), SimilarityInputTest.build(cls, ""));
93 expectedResult = new LevenshteinResults(0, 0, 0, 0);
94 assertEquals(expectedResult, actualResult);
95 }
96
97 @ParameterizedTest
98 @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputs()")
99 void testGetDefaultInstanceOne(final Class<?> cls) {
100 final LevenshteinDetailedDistance levenshteinDetailedDistance = LevenshteinDetailedDistance.getDefaultInstance();
101 final LevenshteinResults levenshteinResults = levenshteinDetailedDistance.apply(
102 SimilarityInputTest.build(cls, "Distance: -2147483643, Insert: 0, Delete: 0, Substitute: 0"),
103 SimilarityInputTest.build(cls, "Distance: 0, Insert: 2147483536, Delete: 0, Substitute: 0"));
104
105 assertEquals(21, levenshteinResults.getDistance());
106 }
107
108 @ParameterizedTest
109 @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputs()")
110 void testGetDefaultInstanceTwo(final Class<?> cls) {
111 final LevenshteinDetailedDistance levenshteinDetailedDistance = LevenshteinDetailedDistance.getDefaultInstance();
112 final LevenshteinResults levenshteinResults = levenshteinDetailedDistance.apply("Distance: 2147483647, Insert: 0, Delete: 0, Substitute: 0",
113 "Distance: 0, Insert: 2147483647, Delete: 0, Substitute: 0");
114 assertEquals(20, levenshteinResults.getDistance());
115 assertEquals(levenshteinResults,
116 levenshteinDetailedDistance.apply(SimilarityInputTest.build(cls, "Distance: 2147483647, Insert: 0, Delete: 0, Substitute: 0"),
117 SimilarityInputTest.build(cls, "Distance: 0, Insert: 2147483647, Delete: 0, Substitute: 0")));
118 }
119
120 @Test
121 void testGetLevenshteinDetailedDistance_NullString() {
122 assertThrows(IllegalArgumentException.class, () -> UNLIMITED_DISTANCE.apply("a", null));
123 }
124
125 @Test
126 void testGetLevenshteinDetailedDistance_NullStringInt() {
127 assertThrows(IllegalArgumentException.class, () -> UNLIMITED_DISTANCE.apply(null, "a"));
128 }
129
130 @Test
131 void testGetLevenshteinDetailedDistance_StringNull() {
132 assertThrows(IllegalArgumentException.class, () -> UNLIMITED_DISTANCE.apply(null, "a"));
133 }
134
135 @Test
136 void testGetLevenshteinDetailedDistance_StringNullInt() {
137 assertThrows(IllegalArgumentException.class, () -> UNLIMITED_DISTANCE.apply("a", null));
138 }
139
140 @ParameterizedTest
141 @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputs()")
142 void testGetLevenshteinDetailedDistance_StringString(final Class<?> cls) {
143 LevenshteinResults result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, ""), SimilarityInputTest.build(cls, ""));
144 assertEquals(0, result.getDistance());
145 assertEquals(0, result.getInsertCount());
146 assertEquals(0, result.getDeleteCount());
147 assertEquals(0, result.getSubstituteCount());
148
149 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, ""), SimilarityInputTest.build(cls, "a"));
150 assertEquals(1, result.getDistance());
151 assertEquals(1, result.getInsertCount());
152 assertEquals(0, result.getDeleteCount());
153 assertEquals(0, result.getSubstituteCount());
154
155 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "aaapppp"), SimilarityInputTest.build(cls, ""));
156 assertEquals(7, result.getDistance());
157 assertEquals(0, result.getInsertCount());
158 assertEquals(7, result.getDeleteCount());
159 assertEquals(0, result.getSubstituteCount());
160
161 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "frog"), SimilarityInputTest.build(cls, "fog"));
162 assertEquals(1, result.getDistance());
163 assertEquals(0, result.getInsertCount());
164 assertEquals(1, result.getDeleteCount());
165 assertEquals(0, result.getSubstituteCount());
166
167 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "fly"), SimilarityInputTest.build(cls, "ant"));
168 assertEquals(3, result.getDistance());
169 assertEquals(0, result.getInsertCount());
170 assertEquals(0, result.getDeleteCount());
171 assertEquals(3, result.getSubstituteCount());
172
173 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "elephant"), SimilarityInputTest.build(cls, "hippo"));
174 assertEquals(7, result.getDistance());
175 assertEquals(0, result.getInsertCount());
176 assertEquals(3, result.getDeleteCount());
177 assertEquals(4, result.getSubstituteCount());
178
179 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "hippo"), SimilarityInputTest.build(cls, "elephant"));
180 assertEquals(7, result.getDistance());
181 assertEquals(3, result.getInsertCount());
182 assertEquals(0, result.getDeleteCount());
183 assertEquals(4, result.getSubstituteCount());
184
185 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "hippo"), SimilarityInputTest.build(cls, "zzzzzzzz"));
186 assertEquals(8, result.getDistance());
187 assertEquals(3, result.getInsertCount());
188 assertEquals(0, result.getDeleteCount());
189 assertEquals(5, result.getSubstituteCount());
190
191 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "zzzzzzzz"), SimilarityInputTest.build(cls, "hippo"));
192 assertEquals(8, result.getDistance());
193 assertEquals(0, result.getInsertCount());
194 assertEquals(3, result.getDeleteCount());
195 assertEquals(5, result.getSubstituteCount());
196
197 result = UNLIMITED_DISTANCE.apply(SimilarityInputTest.build(cls, "hello"), SimilarityInputTest.build(cls, "hallo"));
198 assertEquals(1, result.getDistance());
199 assertEquals(0, result.getInsertCount());
200 assertEquals(0, result.getDeleteCount());
201 assertEquals(1, result.getSubstituteCount());
202 }
203
204 @Test
205 void testGetLevenshteinDetailedDistance_StringStringInt() {
206
207 LevenshteinResults result = new LevenshteinDetailedDistance(0).apply("", "");
208
209 assertEquals(0, result.getDistance());
210 assertEquals(0, result.getInsertCount());
211 assertEquals(0, result.getDeleteCount());
212 assertEquals(0, result.getSubstituteCount());
213
214 result = new LevenshteinDetailedDistance(8).apply("aaapppp", "");
215 assertEquals(7, result.getDistance());
216 assertEquals(0, result.getInsertCount());
217 assertEquals(7, result.getDeleteCount());
218 assertEquals(0, result.getSubstituteCount());
219
220 result = new LevenshteinDetailedDistance(7).apply("aaapppp", "");
221 assertEquals(7, result.getDistance());
222 assertEquals(0, result.getInsertCount());
223 assertEquals(7, result.getDeleteCount());
224 assertEquals(0, result.getSubstituteCount());
225
226 result = new LevenshteinDetailedDistance(6).apply("aaapppp", "");
227 assertEquals(-1, result.getDistance());
228 assertEquals(0, result.getInsertCount());
229 assertEquals(0, result.getDeleteCount());
230 assertEquals(0, result.getSubstituteCount());
231
232 result = new LevenshteinDetailedDistance(0).apply("b", "a");
233 assertEquals(-1, result.getDistance());
234 assertEquals(0, result.getInsertCount());
235 assertEquals(0, result.getDeleteCount());
236 assertEquals(0, result.getSubstituteCount());
237
238 result = new LevenshteinDetailedDistance(0).apply("a", "b");
239 assertEquals(-1, result.getDistance());
240 assertEquals(0, result.getInsertCount());
241 assertEquals(0, result.getDeleteCount());
242 assertEquals(0, result.getSubstituteCount());
243
244 result = new LevenshteinDetailedDistance(0).apply("aa", "aa");
245 assertEquals(0, result.getDistance());
246 assertEquals(0, result.getInsertCount());
247 assertEquals(0, result.getDeleteCount());
248 assertEquals(0, result.getSubstituteCount());
249
250 result = new LevenshteinDetailedDistance(2).apply("aa", "aa");
251 assertEquals(0, result.getDistance());
252 assertEquals(0, result.getInsertCount());
253 assertEquals(0, result.getDeleteCount());
254 assertEquals(0, result.getSubstituteCount());
255
256 result = new LevenshteinDetailedDistance(2).apply("aaa", "bbb");
257 assertEquals(-1, result.getDistance());
258 assertEquals(0, result.getInsertCount());
259 assertEquals(0, result.getDeleteCount());
260 assertEquals(0, result.getSubstituteCount());
261
262 result = new LevenshteinDetailedDistance(3).apply("aaa", "bbb");
263 assertEquals(3, result.getDistance());
264 assertEquals(0, result.getInsertCount());
265 assertEquals(0, result.getDeleteCount());
266 assertEquals(3, result.getSubstituteCount());
267
268 result = new LevenshteinDetailedDistance(10).apply("aaaaaa", "b");
269 assertEquals(6, result.getDistance());
270 assertEquals(0, result.getInsertCount());
271 assertEquals(5, result.getDeleteCount());
272 assertEquals(1, result.getSubstituteCount());
273
274 result = new LevenshteinDetailedDistance(8).apply("aaapppp", "b");
275 assertEquals(7, result.getDistance());
276 assertEquals(0, result.getInsertCount());
277 assertEquals(6, result.getDeleteCount());
278 assertEquals(1, result.getSubstituteCount());
279
280 result = new LevenshteinDetailedDistance(4).apply("a", "bbb");
281 assertEquals(3, result.getDistance());
282 assertEquals(2, result.getInsertCount());
283 assertEquals(0, result.getDeleteCount());
284 assertEquals(1, result.getSubstituteCount());
285
286 result = new LevenshteinDetailedDistance(7).apply("aaapppp", "b");
287 assertEquals(7, result.getDistance());
288 assertEquals(0, result.getInsertCount());
289 assertEquals(6, result.getDeleteCount());
290 assertEquals(1, result.getSubstituteCount());
291
292 result = new LevenshteinDetailedDistance(3).apply("a", "bbb");
293 assertEquals(3, result.getDistance());
294 assertEquals(2, result.getInsertCount());
295 assertEquals(0, result.getDeleteCount());
296 assertEquals(1, result.getSubstituteCount());
297
298 result = new LevenshteinDetailedDistance(2).apply("a", "bbb");
299 assertEquals(-1, result.getDistance());
300 assertEquals(0, result.getInsertCount());
301 assertEquals(0, result.getDeleteCount());
302 assertEquals(0, result.getSubstituteCount());
303
304 result = new LevenshteinDetailedDistance(2).apply("bbb", "a");
305 assertEquals(-1, result.getDistance());
306 assertEquals(0, result.getInsertCount());
307 assertEquals(0, result.getDeleteCount());
308 assertEquals(0, result.getSubstituteCount());
309
310 result = new LevenshteinDetailedDistance(6).apply("aaapppp", "b");
311 assertEquals(-1, result.getDistance());
312 assertEquals(0, result.getInsertCount());
313 assertEquals(0, result.getDeleteCount());
314 assertEquals(0, result.getSubstituteCount());
315
316 result = new LevenshteinDetailedDistance(1).apply("a", "bbb");
317 assertEquals(-1, result.getDistance());
318 assertEquals(0, result.getInsertCount());
319 assertEquals(0, result.getDeleteCount());
320 assertEquals(0, result.getSubstituteCount());
321
322 result = new LevenshteinDetailedDistance(1).apply("bbb", "a");
323 assertEquals(-1, result.getDistance());
324 assertEquals(0, result.getInsertCount());
325 assertEquals(0, result.getDeleteCount());
326 assertEquals(0, result.getSubstituteCount());
327
328 result = new LevenshteinDetailedDistance(1).apply("12345", "1234567");
329 assertEquals(-1, result.getDistance());
330 assertEquals(0, result.getInsertCount());
331 assertEquals(0, result.getDeleteCount());
332 assertEquals(0, result.getSubstituteCount());
333
334 result = new LevenshteinDetailedDistance(1).apply("1234567", "12345");
335 assertEquals(-1, result.getDistance());
336 assertEquals(0, result.getInsertCount());
337 assertEquals(0, result.getDeleteCount());
338 assertEquals(0, result.getSubstituteCount());
339
340 result = new LevenshteinDetailedDistance(1).apply("frog", "fog");
341 assertEquals(1, result.getDistance());
342 assertEquals(0, result.getInsertCount());
343 assertEquals(1, result.getDeleteCount());
344 assertEquals(0, result.getSubstituteCount());
345
346 result = new LevenshteinDetailedDistance(3).apply("fly", "ant");
347 assertEquals(3, result.getDistance());
348 assertEquals(0, result.getInsertCount());
349 assertEquals(0, result.getDeleteCount());
350 assertEquals(3, result.getSubstituteCount());
351
352 result = new LevenshteinDetailedDistance(7).apply("elephant", "hippo");
353 assertEquals(7, result.getDistance());
354 assertEquals(0, result.getInsertCount());
355 assertEquals(3, result.getDeleteCount());
356 assertEquals(4, result.getSubstituteCount());
357
358 result = new LevenshteinDetailedDistance(6).apply("elephant", "hippo");
359 assertEquals(-1, result.getDistance());
360 assertEquals(0, result.getInsertCount());
361 assertEquals(0, result.getDeleteCount());
362 assertEquals(0, result.getSubstituteCount());
363
364 result = new LevenshteinDetailedDistance(7).apply("hippo", "elephant");
365 assertEquals(7, result.getDistance());
366 assertEquals(3, result.getInsertCount());
367 assertEquals(0, result.getDeleteCount());
368 assertEquals(4, result.getSubstituteCount());
369
370 result = new LevenshteinDetailedDistance(7).apply("hippo", "elephant");
371 assertEquals(7, result.getDistance());
372 assertEquals(3, result.getInsertCount());
373 assertEquals(0, result.getDeleteCount());
374 assertEquals(4, result.getSubstituteCount());
375
376 result = new LevenshteinDetailedDistance(6).apply("hippo", "elephant");
377 assertEquals(-1, result.getDistance());
378 assertEquals(0, result.getInsertCount());
379 assertEquals(0, result.getDeleteCount());
380 assertEquals(0, result.getSubstituteCount());
381
382 result = new LevenshteinDetailedDistance(8).apply("hippo", "zzzzzzzz");
383 assertEquals(8, result.getDistance());
384 assertEquals(3, result.getInsertCount());
385 assertEquals(0, result.getDeleteCount());
386 assertEquals(5, result.getSubstituteCount());
387
388 result = new LevenshteinDetailedDistance(8).apply("zzzzzzzz", "hippo");
389 assertEquals(8, result.getDistance());
390 assertEquals(0, result.getInsertCount());
391 assertEquals(3, result.getDeleteCount());
392 assertEquals(5, result.getSubstituteCount());
393
394 result = new LevenshteinDetailedDistance(1).apply("hello", "hallo");
395 assertEquals(1, result.getDistance());
396 assertEquals(0, result.getInsertCount());
397 assertEquals(0, result.getDeleteCount());
398 assertEquals(1, result.getSubstituteCount());
399
400 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("frog", "fog");
401 assertEquals(1, result.getDistance());
402 assertEquals(0, result.getInsertCount());
403 assertEquals(1, result.getDeleteCount());
404 assertEquals(0, result.getSubstituteCount());
405
406 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("fly", "ant");
407 assertEquals(3, result.getDistance());
408 assertEquals(0, result.getInsertCount());
409 assertEquals(0, result.getDeleteCount());
410 assertEquals(3, result.getSubstituteCount());
411
412 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("elephant", "hippo");
413 assertEquals(7, result.getDistance());
414 assertEquals(0, result.getInsertCount());
415 assertEquals(3, result.getDeleteCount());
416 assertEquals(4, result.getSubstituteCount());
417
418 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("hippo", "elephant");
419 assertEquals(7, result.getDistance());
420 assertEquals(3, result.getInsertCount());
421 assertEquals(0, result.getDeleteCount());
422 assertEquals(4, result.getSubstituteCount());
423
424 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("hippo", "zzzzzzzz");
425 assertEquals(8, result.getDistance());
426 assertEquals(3, result.getInsertCount());
427 assertEquals(0, result.getDeleteCount());
428 assertEquals(5, result.getSubstituteCount());
429
430 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("zzzzzzzz", "hippo");
431 assertEquals(8, result.getDistance());
432 assertEquals(0, result.getInsertCount());
433 assertEquals(3, result.getDeleteCount());
434 assertEquals(5, result.getSubstituteCount());
435
436 result = new LevenshteinDetailedDistance(Integer.MAX_VALUE).apply("hello", "hallo");
437 assertEquals(1, result.getDistance());
438 assertEquals(0, result.getInsertCount());
439 assertEquals(0, result.getDeleteCount());
440 assertEquals(1, result.getSubstituteCount());
441 }
442
443 @Test
444 void testGetThreshold() {
445 final LevenshteinDetailedDistance levenshteinDetailedDistance = new LevenshteinDetailedDistance(0);
446
447 assertEquals(0, levenshteinDetailedDistance.getThreshold());
448 }
449
450 @Test
451 void testHashCode() {
452 final LevenshteinDetailedDistance classBeingTested = LevenshteinDetailedDistance.getDefaultInstance();
453 LevenshteinResults actualResult = classBeingTested.apply("aaapppp", "");
454 LevenshteinResults expectedResult = new LevenshteinResults(7, 0, 7, 0);
455 assertEquals(expectedResult.hashCode(), actualResult.hashCode());
456
457 actualResult = classBeingTested.apply("frog", "fog");
458 expectedResult = new LevenshteinResults(1, 0, 1, 0);
459 assertEquals(expectedResult.hashCode(), actualResult.hashCode());
460
461 actualResult = classBeingTested.apply("elephant", "hippo");
462 expectedResult = new LevenshteinResults(7, 0, 3, 4);
463 assertEquals(expectedResult.hashCode(), actualResult.hashCode());
464 }
465
466 @Test
467 void testToString() {
468 final LevenshteinDetailedDistance classBeingTested = LevenshteinDetailedDistance.getDefaultInstance();
469 LevenshteinResults actualResult = classBeingTested.apply("fly", "ant");
470 LevenshteinResults expectedResult = new LevenshteinResults(3, 0, 0, 3);
471 assertEquals(expectedResult.toString(), actualResult.toString());
472
473 actualResult = classBeingTested.apply("hippo", "elephant");
474 expectedResult = new LevenshteinResults(7, 3, 0, 4);
475 assertEquals(expectedResult.toString(), actualResult.toString());
476
477 actualResult = classBeingTested.apply("", "a");
478 expectedResult = new LevenshteinResults(1, 1, 0, 0);
479 assertEquals(expectedResult.toString(), actualResult.toString());
480 }
481
482 }