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 */
168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens
1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts;
18cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
19cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikovimport android.test.suitebuilder.annotation.SmallTest;
20cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
21cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikovimport junit.framework.TestCase;
22cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
238920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens/**
248920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * Unit tests for {@link NameDistance}.
258920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *
268920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * Run the test like this:
278920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * <code>
288920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.NameDistanceTest -w \
298920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
308920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * </code>
318920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens */
32cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov@SmallTest
33a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikovpublic class NameDistanceTest extends TestCase {
34cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
35a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    private NameDistance mNameDistance;
36cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
37cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    @Override
38cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    protected void setUp() throws Exception {
39cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        super.setUp();
40cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
41a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        mNameDistance = new NameDistance(30);
42cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
43cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
44cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    public void testExactMatch() {
45cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        assertFloat(1, "Dwayne", "Dwayne");
46cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
47cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
4828245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov    public void testWinklerBonus() {
4928245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov        assertFloat(0.961f, "Martha", "Marhta");
5028245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov        assertFloat(0.840f, "Dwayne", "Duane");
5128245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov        assertFloat(0.813f, "DIXON", "DICKSONX");
52cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
53cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
5428245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov    public void testJaroDistance() {
5528245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov        assertFloat(0.600f, "Donny", "Duane");
56cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
57cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
5828245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov    public void testPoorMatch() {
5928245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov        assertFloat(0.467f, "Johny", "Duane");
60cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
61cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
6228245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov    public void testNoMatches() {
6328245e1690abbab18b3224e4164a738f6e64d6c0Dmitri Plotnikov        assertFloat(0, "Abcd", "Efgh");
64a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov    }
65a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov
66cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    private void assertFloat(float expected, String name1, String name2) {
67cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        byte[] s1 = Hex.decodeHex(NameNormalizer.normalize(name1));
68cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        byte[] s2 = Hex.decodeHex(NameNormalizer.normalize(name2));
69cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov
70a276d23a70bdb8fdc7c8340a12a64e90696da115Dmitri Plotnikov        float actual = mNameDistance.getDistance(s1, s2);
71cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov        assertTrue("Expected Jaro-Winkler distance: " + expected + ", actual: " + actual,
72cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov                Math.abs(actual - expected) < 0.001);
73cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov    }
74cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov}
75