14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/* 24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project 34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); you may not 54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * use this file except in compliance with the License. You may obtain a copy of 64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the License at 74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * License for the specific language governing permissions and limitations under 144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the License. 154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 16677ef21613a9d35053ec098444832ce4125a847eDaisuke Miyakawapackage com.android.vcard.tests.testutils; 174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentResolver; 194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentValues; 204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.Entity; 214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.EntityIterator; 224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.database.Cursor; 234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.net.Uri; 244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.Contacts; 254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.Data; 264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.RawContacts; 275f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawaimport android.test.AndroidTestCase; 284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.test.mock.MockContentProvider; 294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.test.mock.MockCursor; 3056174dfd0654acbe828e4db38537ec5a3a04d466Daisuke Miyakawaimport android.util.Log; 314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport junit.framework.TestCase; 334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.ArrayList; 354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Iterator; 364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.List; 374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 381680191a2a208fd61123810a88ce9def83e222baDaisuke Miyakawapublic class ExportTestProvider extends MockContentProvider { 394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final private ArrayList<ContactEntry> mContactEntryList = new ArrayList<ContactEntry>(); 404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private static class MockEntityIterator implements EntityIterator { 427e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa private final List<Entity> mEntityList; 437e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa private Iterator<Entity> mIterator; 444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public MockEntityIterator(List<ContentValues> contentValuesList) { 464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mEntityList = new ArrayList<Entity>(); 474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa Entity entity = new Entity(new ContentValues()); 484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (ContentValues contentValues : contentValuesList) { 494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa entity.addSubValue(Data.CONTENT_URI, contentValues); 504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mEntityList.add(entity); 524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mIterator = mEntityList.iterator(); 534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 557e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa @Override 564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public boolean hasNext() { 574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return mIterator.hasNext(); 584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 607e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa @Override 614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public Entity next() { 624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return mIterator.next(); 634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 657e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa @Override 664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void remove() { 674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa throw new UnsupportedOperationException("remove not supported"); 684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 707e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa @Override 714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void reset() { 724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mIterator = mEntityList.iterator(); 734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 757e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa @Override 764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void close() { 774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 805f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa public ExportTestProvider(AndroidTestCase androidTestCase) { 814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public ContactEntry buildInputEntry() { 844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ContactEntry contactEntry = new ContactEntry(); 854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mContactEntryList.add(contactEntry); 864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return contactEntry; 874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa /** 904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p> 914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * An old method which had existed but was removed from ContentResolver. 924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p> 934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p> 944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * We still keep using this method since we don't have a propeer way to know 954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * which value in the ContentValue corresponds to the entry in Contacts database. 964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p> 974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public EntityIterator queryEntities(Uri uri, 994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String selection, String[] selectionArgs, String sortOrder) { 1005f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertTrue(uri != null); 1015f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertTrue(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())); 1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String authority = uri.getAuthority(); 1035f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertTrue(RawContacts.CONTENT_URI.getAuthority().equals(authority)); 1045f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertTrue((Data.CONTACT_ID + "=?").equals(selection)); 1055f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertEquals(1, selectionArgs.length); 1064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final int id = Integer.parseInt(selectionArgs[0]); 10756174dfd0654acbe828e4db38537ec5a3a04d466Daisuke Miyakawa TestCase.assertTrue(id >= 0); 10856174dfd0654acbe828e4db38537ec5a3a04d466Daisuke Miyakawa TestCase.assertTrue(id < mContactEntryList.size()); 1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return new MockEntityIterator(mContactEntryList.get(id).getList()); 1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public Cursor query(Uri uri,String[] projection, 1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String selection, String[] selectionArgs, String sortOrder) { 1167e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa TestCase.assertTrue(VCardVerifier.CONTACTS_TEST_CONTENT_URI.equals(uri)); 1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // In this test, following arguments are not supported. 1185f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertNull(selection); 1195f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertNull(selectionArgs); 1205f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertNull(sortOrder); 1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return new MockCursor() { 1234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa int mCurrentPosition = -1; 1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public int getCount() { 1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return mContactEntryList.size(); 1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public boolean moveToFirst() { 1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentPosition = 0; 1334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return true; 1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public boolean moveToNext() { 1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (mCurrentPosition < mContactEntryList.size()) { 1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentPosition++; 1404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return true; 1414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return false; 1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public boolean isBeforeFirst() { 1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return mCurrentPosition < 0; 1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public boolean isAfterLast() { 1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return mCurrentPosition >= mContactEntryList.size(); 1544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public int getColumnIndex(String columnName) { 15803bfa415fab150deb666b1b5aad5913511bd7d33Makoto Onuki TestCase.assertEquals(Data.CONTACT_ID, columnName); 1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return 0; 1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public int getInt(int columnIndex) { 1645f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertEquals(0, columnIndex); 1655f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.assertTrue(mCurrentPosition >= 0 1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa && mCurrentPosition < mContactEntryList.size()); 1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return mCurrentPosition; 1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 17103bfa415fab150deb666b1b5aad5913511bd7d33Makoto Onuki public long getLong(int columnIndex) { 17203bfa415fab150deb666b1b5aad5913511bd7d33Makoto Onuki return getInt(columnIndex); 17303bfa415fab150deb666b1b5aad5913511bd7d33Makoto Onuki } 17403bfa415fab150deb666b1b5aad5913511bd7d33Makoto Onuki 17503bfa415fab150deb666b1b5aad5913511bd7d33Makoto Onuki @Override 1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public String getString(int columnIndex) { 1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return String.valueOf(getInt(columnIndex)); 1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa @Override 1814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void close() { 1824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa }; 1844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}