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