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.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   * Tests {@link JaccardSimilarity}.
29   */
30  class JaccardSimilarityTest {
31  
32      private static JaccardSimilarity classBeingTested;
33  
34      @BeforeAll
35      public static void setUp() {
36          classBeingTested = new JaccardSimilarity();
37      }
38  
39      @ParameterizedTest
40      @MethodSource("org.apache.commons.text.similarity.SimilarityInputTest#similarityInputsEquals()")
41      void testGettingJaccardSimilarity(final Class<?> cls) {
42          // Expected Jaccard similarity = (intersect / union)
43          assertEquals(1.0, classBeingTested.apply(SimilarityInputTest.build(cls, ""), SimilarityInputTest.build(cls, "")));
44          assertEquals(0.0, classBeingTested.apply(SimilarityInputTest.build(cls, "left"), SimilarityInputTest.build(cls, "")));
45          assertEquals(0.0, classBeingTested.apply(SimilarityInputTest.build(cls, ""), SimilarityInputTest.build(cls, "right")));
46          assertEquals(3.0 / 4, classBeingTested.apply(SimilarityInputTest.build(cls, "frog"), SimilarityInputTest.build(cls, "fog")));
47          assertEquals(0.0, classBeingTested.apply(SimilarityInputTest.build(cls, "fly"), SimilarityInputTest.build(cls, "ant")));
48          assertEquals(2.0 / 9, classBeingTested.apply(SimilarityInputTest.build(cls, "elephant"), SimilarityInputTest.build(cls, "hippo")));
49          assertEquals(7.0 / 11, classBeingTested.apply(SimilarityInputTest.build(cls, "ABC Corporation"), SimilarityInputTest.build(cls, "ABC Corp")));
50          assertEquals(13.0 / 17,
51                  classBeingTested.apply(SimilarityInputTest.build(cls, "D N H Enterprises Inc"), SimilarityInputTest.build(cls, "D & H Enterprises, Inc.")));
52          assertEquals(16.0 / 18, classBeingTested.apply(SimilarityInputTest.build(cls, "My Gym Children's Fitness Center"),
53                  SimilarityInputTest.build(cls, "My Gym. Childrens Fitness")));
54          assertEquals(9.0 / 10, classBeingTested.apply(SimilarityInputTest.build(cls, "PENNSYLVANIA"), SimilarityInputTest.build(cls, "PENNCISYLVNIA")));
55          assertEquals(1.0 / 8, classBeingTested.apply(SimilarityInputTest.build(cls, "left"), SimilarityInputTest.build(cls, "right")));
56          assertEquals(1.0 / 8, classBeingTested.apply(SimilarityInputTest.build(cls, "leettteft"), SimilarityInputTest.build(cls, "ritttght")));
57          assertEquals(1.0, classBeingTested.apply(SimilarityInputTest.build(cls, "the same string"), SimilarityInputTest.build(cls, "the same string")));
58      }
59  
60      @Test
61      void testGettingJaccardSimilarityCharSequence() {
62          // Expected Jaccard similarity = (intersect / union)
63          assertEquals(1.0, classBeingTested.apply("", ""));
64          assertEquals(0.0, classBeingTested.apply("left", ""));
65          assertEquals(0.0, classBeingTested.apply("", "right"));
66          assertEquals(3.0 / 4, classBeingTested.apply("frog", "fog"));
67          assertEquals(0.0, classBeingTested.apply("fly", "ant"));
68          assertEquals(2.0 / 9, classBeingTested.apply("elephant", "hippo"));
69          assertEquals(7.0 / 11, classBeingTested.apply("ABC Corporation", "ABC Corp"));
70          assertEquals(13.0 / 17, classBeingTested.apply("D N H Enterprises Inc", "D & H Enterprises, Inc."));
71          assertEquals(16.0 / 18, classBeingTested.apply("My Gym Children's Fitness Center", "My Gym. Childrens Fitness"));
72          assertEquals(9.0 / 10, classBeingTested.apply("PENNSYLVANIA", "PENNCISYLVNIA"));
73          assertEquals(1.0 / 8, classBeingTested.apply("left", "right"));
74          assertEquals(1.0 / 8, classBeingTested.apply("leettteft", "ritttght"));
75          assertEquals(1.0, classBeingTested.apply("the same string", "the same string"));
76      }
77  
78      @Test
79      void testGettingJaccardSimilarityNullNull() {
80          assertThrows(IllegalArgumentException.class, () -> classBeingTested.apply((String) null, null));
81      }
82  
83      @Test
84      void testGettingJaccardSimilarityNullString() {
85          assertThrows(IllegalArgumentException.class, () -> classBeingTested.apply(null, "right"));
86      }
87  
88      @Test
89      void testGettingJaccardSimilarityStringNull() {
90          assertThrows(IllegalArgumentException.class, () -> classBeingTested.apply(" ", null));
91      }
92  }