View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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); // intentionally added
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 }