1 package org.robolectric.shadows; 2 3 import static org.assertj.core.api.Assertions.assertThat; 4 import static org.mockito.Mockito.mock; 5 import static org.mockito.Mockito.times; 6 import static org.mockito.Mockito.verify; 7 8 import android.content.ContentResolver; 9 import android.database.CharArrayBuffer; 10 import android.database.ContentObserver; 11 import android.database.Cursor; 12 import android.database.CursorWrapper; 13 import android.database.DataSetObserver; 14 import android.net.Uri; 15 import android.os.Bundle; 16 import java.lang.reflect.Method; 17 import java.util.HashMap; 18 import org.junit.Test; 19 import org.junit.runner.RunWith; 20 import org.mockito.Mockito; 21 import org.robolectric.RobolectricTestRunner; 22 import org.robolectric.Shadows; 23 24 @RunWith(RobolectricTestRunner.class) 25 public class ShadowCursorWrapperTest { 26 27 private static class ForwardVerifier { 28 29 final Cursor mockCursor; 30 final CursorWrapper cursorWrapper; 31 final HashMap<String, Method> cursorMethod; 32 33 public ForwardVerifier() { 34 mockCursor = mock(Cursor.class); 35 cursorWrapper = new CursorWrapper(mockCursor); 36 cursorMethod = new HashMap<>(); 37 38 // This works because no two methods in the Cursor interface have the same name 39 for (Method m : Cursor.class.getMethods()) { 40 cursorMethod.put(m.getName(), m); 41 } 42 } 43 44 public void verifyForward(String methodName, Object... params) throws Exception { 45 assertThat(cursorMethod.keySet()).contains(methodName); 46 47 Method method = cursorMethod.get(methodName); 48 method.invoke(cursorWrapper, params); 49 method.invoke(verify(mockCursor, times(1)), params); 50 Mockito.verifyNoMoreInteractions(mockCursor); 51 } 52 53 } 54 55 @Test 56 public void testCursorMethodsAreForwarded() throws Exception { 57 ForwardVerifier v = new ForwardVerifier(); 58 59 v.verifyForward("close"); 60 v.verifyForward("copyStringToBuffer", 1, mock(CharArrayBuffer.class)); 61 v.verifyForward("deactivate"); 62 v.verifyForward("getBlob", 2); 63 v.verifyForward("getColumnCount"); 64 v.verifyForward("getColumnIndex", "foo"); 65 v.verifyForward("getColumnIndexOrThrow", "foo"); 66 v.verifyForward("getColumnName", 3); 67 v.verifyForward("getColumnNames"); 68 v.verifyForward("getCount"); 69 v.verifyForward("getDouble", 12); 70 v.verifyForward("getExtras"); 71 v.verifyForward("getFloat", 4); 72 v.verifyForward("getInt", 5); 73 v.verifyForward("getLong", 6); 74 v.verifyForward("getPosition"); 75 v.verifyForward("getShort", 7); 76 v.verifyForward("getString", 8); 77 v.verifyForward("getType", 9); 78 v.verifyForward("getWantsAllOnMoveCalls"); 79 v.verifyForward("isAfterLast"); 80 v.verifyForward("isBeforeFirst"); 81 v.verifyForward("isClosed"); 82 v.verifyForward("isFirst"); 83 v.verifyForward("isLast"); 84 v.verifyForward("isNull", 10); 85 v.verifyForward("move", 11); 86 v.verifyForward("moveToFirst"); 87 v.verifyForward("moveToLast"); 88 v.verifyForward("moveToNext"); 89 v.verifyForward("moveToPosition", 13); 90 v.verifyForward("moveToPrevious"); 91 v.verifyForward("registerContentObserver", mock(ContentObserver.class)); 92 v.verifyForward("registerDataSetObserver", mock(DataSetObserver.class)); 93 v.verifyForward("requery"); 94 v.verifyForward("respond", mock(Bundle.class)); 95 v.verifyForward("setNotificationUri", mock(ContentResolver.class), mock(Uri.class)); 96 v.verifyForward("unregisterContentObserver", mock(ContentObserver.class)); 97 v.verifyForward("unregisterDataSetObserver", mock(DataSetObserver.class)); 98 99 } 100 101 @Test 102 public void getWrappedCursor() { 103 Cursor mockCursor = mock(Cursor.class); 104 CursorWrapper cursorWrapper = new CursorWrapper(mockCursor); 105 ShadowCursorWrapper shadow = Shadows.shadowOf(cursorWrapper); 106 107 assertThat(shadow.getWrappedCursor()).isSameAs(mockCursor); 108 } 109 110 } 111