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}