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