145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciapackage com.xtremelabs.robolectric.shadows;
245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport android.content.ContentResolver;
445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport android.database.*;
545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport android.net.Uri;
645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport android.os.Bundle;
745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport com.xtremelabs.robolectric.Robolectric;
845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport org.junit.Test;
1045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport org.junit.runner.RunWith;
1145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport org.mockito.Mockito;
1245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
1345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport java.lang.reflect.Method;
1445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport java.util.HashMap;
1545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
1645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport static org.hamcrest.CoreMatchers.*;
1745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport static org.junit.Assert.assertThat;
1845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciaimport static org.mockito.Mockito.*;
1945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
2045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia@RunWith(WithTestDefaultsRunner.class)
2145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garciapublic class CursorWrapperTest {
2245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
2345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    private class ForwardVerifier {
2445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
2545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        final Cursor mockCursor;
2645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        final CursorWrapper cursorWrapper;
2745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        final HashMap<String, Method> cursorMethod;
2845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
2945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        public ForwardVerifier() {
3045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            mockCursor = mock(Cursor.class);
3145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            cursorWrapper = new CursorWrapper(mockCursor);
3245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            cursorMethod = new HashMap<String, Method>();
3345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
3445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            // This works because no two methods in the Cursor interface have the same name
3545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            for (Method m : Cursor.class.getMethods()) {
3645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia                cursorMethod.put(m.getName(), m);
3745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            }
3845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        }
3945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
4045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        public void verifyForward(String methodName, Object... params) throws Exception {
4145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            assertThat(cursorMethod.keySet(), hasItem(methodName));
4245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
4345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            Method method = cursorMethod.get(methodName);
4445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            method.invoke(cursorWrapper, params);
4545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            method.invoke(verify(mockCursor, times(1)), params);
4645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia            Mockito.verifyNoMoreInteractions(mockCursor);
4745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        }
4845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
4945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    }
5045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
5145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    @Test
5245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    public void testCursorMethodsAreForwarded() throws Exception {
5345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        ForwardVerifier v = new ForwardVerifier();
5445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
5545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("close");
5645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("copyStringToBuffer", 1, mock(CharArrayBuffer.class));
5745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("deactivate");
5845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getBlob", 2);
5945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getColumnCount");
6045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getColumnIndex", "foo");
6145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getColumnIndexOrThrow", "foo");
6245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getColumnName", 3);
6345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getColumnNames");
6445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getCount");
6545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getDouble", 12);
6645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getExtras");
6745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getFloat", 4);
6845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getInt", 5);
6945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getLong", 6);
7045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getPosition");
7145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getShort", 7);
7245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getString", 8);
7345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("getWantsAllOnMoveCalls");
7445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("isAfterLast");
7545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("isBeforeFirst");
7645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("isClosed");
7745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("isFirst");
7845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("isLast");
7945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("isNull", 10);
8045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("move", 11);
8145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("moveToFirst");
8245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("moveToLast");
8345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("moveToNext");
8445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("moveToPosition", 13);
8545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("moveToPrevious");
8645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("registerContentObserver", mock(ContentObserver.class));
8745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("registerDataSetObserver", mock(DataSetObserver.class));
8845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("requery");
8945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("respond", mock(Bundle.class));
9045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("setNotificationUri", mock(ContentResolver.class), mock(Uri.class));
9145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("unregisterContentObserver", mock(ContentObserver.class));
9245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        v.verifyForward("unregisterDataSetObserver", mock(DataSetObserver.class));
9345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
9445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    }
9545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
9645416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    @Test
9745416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    public void getWrappedCursor() {
9845416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        Cursor mockCursor = mock(Cursor.class);
9945416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        CursorWrapper cursorWrapper = new CursorWrapper(mockCursor);
10045416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        ShadowCursorWrapper shadow = Robolectric.shadowOf(cursorWrapper);
10145416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
10245416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia        assertThat(shadow.getWrappedCursor(), is(sameInstance(mockCursor)));
10345416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia    }
10445416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia
10545416dcb93425cc62d7848c1afa55f68825ec6e4Diego Garcia}
106