NameDistanceTest.java revision a276d23a70bdb8fdc7c8340a12a64e90696da115
1cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov/*
2cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov *
4cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * you may not use this file except in compliance with the License.
6cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * You may obtain a copy of the License at
7cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov *
8cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov *
10cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * See the License for the specific language governing permissions and
14cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov * limitations under the License
15cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov */
1628f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts;
17cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
18cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikovimport android.test.suitebuilder.annotation.SmallTest;
19cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
20cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikovimport junit.framework.TestCase;
21cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
22cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov@SmallTest
23a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikovpublic class NameDistanceTest extends TestCase {
24cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
25a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    private NameDistance mNameDistance;
26cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
27cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    @Override
28cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    protected void setUp() throws Exception {
29cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        super.setUp();
30cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
31a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        mNameDistance = new NameDistance(30);
32cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
33cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
34cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    public void testExactMatch() {
35cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        assertFloat(1, "Dwayne", "Dwayne");
36cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
37cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
38a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    public void testMismatches() {
39a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.8f, "Abcdef", "Abcdex");
40a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.6f, "Abcdef", "Abcxex");
41a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.0f, "Abcdef", "Abxxex");
42cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
43cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
44a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    public void testTranspositions() {
45a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.8f, "Abcdef", "Cbadef");
46a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.6f, "Abcdef", "Abfdec");
47a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.6f, "Abcdef", "Cbafed");
48a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.0f, "Abcdef", "Fedcba");
49cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
50cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
51cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    public void testNoMatches() {
52cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        assertFloat(0, "Abcd", "Efgh");
53cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
54cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
55a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    public void testSimilarNames() {
56a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        assertFloat(0.3f, "SallyCarrera", "SallieCarerra");
57a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    }
58a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov
59cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    private void assertFloat(float expected, String name1, String name2) {
60cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        byte[] s1 = Hex.decodeHex(NameNormalizer.normalize(name1));
61cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        byte[] s2 = Hex.decodeHex(NameNormalizer.normalize(name2));
62cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
63a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        float actual = mNameDistance.getDistance(s1, s2);
64cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        assertTrue("Expected Jaro-Winkler distance: " + expected + ", actual: " + actual,
65cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov                Math.abs(actual - expected) < 0.001);
66cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
67cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov}
68