Home | History | Annotate | Download | only in latin
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.inputmethod.latin;
     18 
     19 import android.content.ContentResolver;
     20 import android.content.Context;
     21 import android.database.Cursor;
     22 import android.database.MatrixCursor;
     23 import android.net.Uri;
     24 import android.provider.ContactsContract;
     25 import android.provider.ContactsContract.Contacts;
     26 import android.test.AndroidTestCase;
     27 import android.test.RenamingDelegatingContext;
     28 import android.test.mock.MockContentProvider;
     29 import android.test.mock.MockContentResolver;
     30 import android.test.suitebuilder.annotation.SmallTest;
     31 
     32 import com.android.inputmethod.latin.ContactsDictionaryConstants;
     33 import com.android.inputmethod.latin.ContactsManager;
     34 
     35 import org.junit.Before;
     36 import org.junit.Test;
     37 
     38 import java.util.ArrayList;
     39 import java.util.HashMap;
     40 import java.util.concurrent.TimeUnit;
     41 
     42 /**
     43  * Tests for {@link ContactsManager}
     44  */
     45 @SmallTest
     46 public class ContactsManagerTest extends AndroidTestCase {
     47 
     48     private ContactsManager mManager;
     49     private FakeContactsContentProvider mFakeContactsContentProvider;
     50     private MatrixCursor mMatrixCursor;
     51 
     52     @Before
     53     @Override
     54     public void setUp() throws Exception {
     55         // Fake content provider
     56         mFakeContactsContentProvider = new FakeContactsContentProvider();
     57         mMatrixCursor = new MatrixCursor(ContactsDictionaryConstants.PROJECTION);
     58         // Add the fake content provider to fake content resolver.
     59         final MockContentResolver contentResolver = new MockContentResolver();
     60         contentResolver.addProvider(ContactsContract.AUTHORITY, mFakeContactsContentProvider);
     61         // Add the fake content resolver to a fake context.
     62         final ContextWithMockContentResolver context = new ContextWithMockContentResolver(mContext);
     63         context.setContentResolver(contentResolver);
     64 
     65         mManager = new ContactsManager(context);
     66     }
     67 
     68     @Test
     69     public void testGetValidNames() {
     70         final String contactName1 = "firstname last-name";
     71         final String contactName2 = "larry";
     72         mMatrixCursor.addRow(new Object[] { 1, contactName1, 0, 0, 0 });
     73         mMatrixCursor.addRow(new Object[] { 2, null /* null name */, 0, 0, 0 });
     74         mMatrixCursor.addRow(new Object[] { 3, contactName2, 0, 0, 0 });
     75         mMatrixCursor.addRow(new Object[] { 4, "floopy (at) example.com" /* invalid name */, 0, 0, 0 });
     76         mMatrixCursor.addRow(new Object[] { 5, "news-group" /* invalid name */, 0, 0, 0 });
     77         mFakeContactsContentProvider.addQueryResult(Contacts.CONTENT_URI, mMatrixCursor);
     78 
     79         final ArrayList<String> validNames = mManager.getValidNames(Contacts.CONTENT_URI);
     80         assertEquals(2, validNames.size());
     81         assertEquals(contactName1, validNames.get(0));
     82         assertEquals(contactName2, validNames.get(1));
     83     }
     84 
     85     @Test
     86     public void testGetValidNamesAffinity() {
     87         final long now = System.currentTimeMillis();
     88         final long month_ago = now - TimeUnit.MILLISECONDS.convert(31, TimeUnit.DAYS);
     89         for (int i = 0; i < ContactsManager.MAX_CONTACT_NAMES + 10; ++i) {
     90             mMatrixCursor.addRow(new Object[] { i, "name" + i, i, now, 1 });
     91         }
     92         mFakeContactsContentProvider.addQueryResult(Contacts.CONTENT_URI, mMatrixCursor);
     93 
     94         final ArrayList<String> validNames = mManager.getValidNames(Contacts.CONTENT_URI);
     95         assertEquals(ContactsManager.MAX_CONTACT_NAMES, validNames.size());
     96         for (int i = 0; i < 10; ++i) {
     97             assertFalse(validNames.contains("name" + i));
     98         }
     99         for (int i = 10; i < ContactsManager.MAX_CONTACT_NAMES + 10; ++i) {
    100             assertTrue(validNames.contains("name" + i));
    101         }
    102     }
    103 
    104     @Test
    105     public void testComputeAffinity() {
    106         final long now = System.currentTimeMillis();
    107         final long month_ago = now - TimeUnit.MILLISECONDS.convert(31, TimeUnit.DAYS);
    108         mMatrixCursor.addRow(new Object[] { 1, "name", 1, month_ago, 1 });
    109         mFakeContactsContentProvider.addQueryResult(Contacts.CONTENT_URI, mMatrixCursor);
    110 
    111         Cursor cursor = mFakeContactsContentProvider.query(Contacts.CONTENT_URI,
    112                 ContactsDictionaryConstants.PROJECTION_ID_ONLY, null, null, null);
    113         cursor.moveToFirst();
    114         ContactsManager.RankedContact contact = new ContactsManager.RankedContact(cursor);
    115         contact.computeAffinity(1, month_ago);
    116         assertEquals(contact.getAffinity(), 1.0f);
    117         contact.computeAffinity(2, now);
    118         assertEquals(contact.getAffinity(), (2.0f/3.0f + (float)Math.pow(0.5, 3) + 1.0f) / 3);
    119     }
    120 
    121     @Test
    122     public void testGetCount() {
    123         mMatrixCursor.addRow(new Object[] { 1, "firstname", 0, 0, 0 });
    124         mMatrixCursor.addRow(new Object[] { 2, null /* null name */, 0, 0, 0 });
    125         mMatrixCursor.addRow(new Object[] { 3, "larry", 0, 0, 0 });
    126         mMatrixCursor.addRow(new Object[] { 4, "floopy (at) example.com" /* invalid name */, 0, 0, 0 });
    127         mFakeContactsContentProvider.addQueryResult(Contacts.CONTENT_URI, mMatrixCursor);
    128         assertEquals(4, mManager.getContactCount());
    129     }
    130 
    131 
    132     static class ContextWithMockContentResolver extends RenamingDelegatingContext {
    133         private ContentResolver contentResolver;
    134 
    135         public void setContentResolver(final ContentResolver contentResolver) {
    136             this.contentResolver = contentResolver;
    137         }
    138 
    139         public ContextWithMockContentResolver(final Context targetContext) {
    140             super(targetContext, "test");
    141         }
    142 
    143         @Override
    144         public ContentResolver getContentResolver() {
    145             return contentResolver;
    146         }
    147     }
    148 
    149     static class FakeContactsContentProvider extends MockContentProvider {
    150         private final HashMap<String, MatrixCursor> mQueryCursorMapForTestExpectations =
    151                 new HashMap<>();
    152 
    153         @Override
    154         public Cursor query(final Uri uri, final String[] projection, final String selection,
    155                 final String[] selectionArgs, final String sortOrder) {
    156             return mQueryCursorMapForTestExpectations.get(uri.toString());
    157         }
    158 
    159         public void reset() {
    160             mQueryCursorMapForTestExpectations.clear();
    161         }
    162 
    163         public void addQueryResult(final Uri uri, final MatrixCursor cursor) {
    164             mQueryCursorMapForTestExpectations.put(uri.toString(), cursor);
    165         }
    166     }
    167 }
    168