1package com.xtremelabs.robolectric.shadows;
2
3import static org.hamcrest.CoreMatchers.equalTo;
4import static org.hamcrest.CoreMatchers.is;
5import static org.hamcrest.CoreMatchers.nullValue;
6import static org.junit.Assert.assertThat;
7
8import java.util.ArrayList;
9import java.util.List;
10
11import org.junit.Before;
12import org.junit.Test;
13import org.junit.runner.RunWith;
14
15import android.database.AbstractCursor;
16import android.net.Uri;
17
18import com.xtremelabs.robolectric.Robolectric;
19import com.xtremelabs.robolectric.WithTestDefaultsRunner;
20
21@RunWith(WithTestDefaultsRunner.class)
22public class AbstractCursorTest {
23
24    private TestCursor cursor;
25
26    @Before
27    public void setUp() throws Exception {
28        cursor = new TestCursor();
29    }
30
31    @Test
32    public void testMoveToFirst() {
33        cursor.theTable.add("Foobar");
34        assertThat(cursor.moveToFirst(), equalTo(true));
35        assertThat(cursor.getCount(), equalTo(1));
36    }
37
38    @Test
39    public void testMoveToFirstEmptyList() {
40        assertThat(cursor.moveToFirst(), equalTo(false));
41        assertThat(cursor.getCount(), equalTo(0));
42    }
43
44    @Test
45    public void testMoveToLast() {
46        cursor.theTable.add("Foobar");
47        cursor.theTable.add("Bletch");
48
49        assertThat(cursor.moveToLast(), equalTo(true));
50        assertThat(cursor.getCount(), equalTo(2));
51    }
52
53    @Test
54    public void testMoveToLastEmptyList() {
55        assertThat(cursor.moveToLast(), equalTo(false));
56        assertThat(cursor.getCount(), equalTo(0));
57    }
58
59    @Test
60    public void testGetPosition() {
61        cursor.theTable.add("Foobar");
62        cursor.theTable.add("Bletch");
63
64        assertThat(cursor.moveToFirst(), equalTo(true));
65        assertThat(cursor.getCount(), equalTo(2));
66        assertThat(cursor.getPosition(), equalTo(0));
67    }
68
69    @Test
70    public void testGetPositionSingleEntry() {
71        cursor.theTable.add("Foobar");
72
73        assertThat(cursor.moveToFirst(), equalTo(true));
74        assertThat(cursor.getCount(), equalTo(1));
75        assertThat(cursor.getPosition(), equalTo(0));
76    }
77
78    @Test
79    public void testGetPositionEmptyList() {
80        assertThat(cursor.moveToFirst(), equalTo(false));
81        assertThat(cursor.getCount(), equalTo(0));
82        assertThat(cursor.getPosition(), equalTo(0));
83    }
84
85    @Test
86    public void testMoveToNext() {
87        cursor.theTable.add("Foobar");
88        cursor.theTable.add("Bletch");
89
90        assertThat(cursor.moveToFirst(), equalTo(true));
91        assertThat(cursor.getCount(), equalTo(2));
92        assertThat(cursor.moveToNext(), equalTo(true));
93        assertThat(cursor.getPosition(), equalTo(1));
94    }
95
96    @Test
97    public void testAttemptToMovePastEnd() {
98        cursor.theTable.add("Foobar");
99        cursor.theTable.add("Bletch");
100
101        assertThat(cursor.moveToFirst(), equalTo(true));
102        assertThat(cursor.getCount(), equalTo(2));
103        assertThat(cursor.moveToNext(), equalTo(true));
104        assertThat(cursor.getPosition(), equalTo(1));
105        assertThat(cursor.isLast(), equalTo(true));
106        assertThat(cursor.moveToNext(), equalTo(false));
107        assertThat(cursor.isAfterLast(), equalTo(true));
108        assertThat(cursor.getPosition(), equalTo(2));
109    }
110
111    @Test
112    public void testAttemptToMovePastSingleEntry() {
113        cursor.theTable.add("Foobar");
114
115        assertThat(cursor.moveToFirst(), equalTo(true));
116        assertThat(cursor.getCount(), equalTo(1));
117        assertThat(cursor.moveToNext(), equalTo(false));
118        assertThat(cursor.getPosition(), equalTo(1));
119    }
120
121    @Test
122    public void testAttemptToMovePastEmptyList() {
123        assertThat(cursor.moveToFirst(), equalTo(false));
124        assertThat(cursor.getCount(), equalTo(0));
125        assertThat(cursor.moveToNext(), equalTo(false));
126        assertThat(cursor.getPosition(), equalTo(0));
127    }
128
129    @Test
130    public void testMoveToPrevious() {
131        cursor.theTable.add("Foobar");
132        cursor.theTable.add("Bletch");
133        assertThat(cursor.moveToFirst(), equalTo(true));
134        assertThat(cursor.moveToNext(), equalTo(true));
135        assertThat(cursor.getPosition(), equalTo(1));
136        assertThat(cursor.moveToPrevious(), equalTo(true));
137        assertThat(cursor.getPosition(), equalTo(0));
138    }
139
140    @Test
141    public void testAttemptToMovePastStart() {
142        cursor.theTable.add("Foobar");
143        cursor.theTable.add("Bletch");
144        assertThat(cursor.moveToFirst(), equalTo(true));
145        assertThat(cursor.moveToPrevious(), equalTo(true));
146        assertThat(cursor.getPosition(), equalTo(-1));
147        assertThat(cursor.moveToPrevious(), equalTo(false));
148        assertThat(cursor.getPosition(), equalTo(-1));
149    }
150
151    @Test
152    public void testIsFirst() {
153        cursor.theTable.add("Foobar");
154        cursor.theTable.add("Bletch");
155        assertThat(cursor.moveToFirst(), equalTo(true));
156        assertThat(cursor.isFirst(), equalTo(true));
157        cursor.moveToNext();
158        assertThat(cursor.isFirst(), equalTo(false));
159        cursor.moveToFirst();
160        cursor.moveToPrevious();
161        assertThat(cursor.isFirst(), equalTo(false));
162    }
163
164    @Test
165    public void testIsLast() {
166        cursor.theTable.add("Foobar");
167        cursor.theTable.add("Bletch");
168        assertThat(cursor.moveToFirst(), equalTo(true));
169        cursor.moveToNext();
170        assertThat(cursor.isLast(), equalTo(true));
171        cursor.moveToPrevious();
172        assertThat(cursor.isLast(), equalTo(false));
173        cursor.moveToFirst();
174        cursor.moveToNext();
175        assertThat(cursor.isLast(), equalTo(true));
176    }
177
178    @Test
179    public void testIsBeforeFirst() {
180        cursor.theTable.add("Foobar");
181        cursor.theTable.add("Bletch");
182        assertThat(cursor.moveToFirst(), equalTo(true));
183        cursor.moveToNext();
184        assertThat(cursor.isLast(), equalTo(true));
185        cursor.moveToPrevious();
186        assertThat(cursor.isLast(), equalTo(false));
187        cursor.moveToPrevious();
188        assertThat(cursor.isFirst(), equalTo(false));
189        cursor.moveToPrevious();
190        assertThat(cursor.isBeforeFirst(), equalTo(true));
191    }
192
193    @Test
194    public void testIsAfterLast() {
195        cursor.theTable.add("Foobar");
196        cursor.theTable.add("Bletch");
197        assertThat(cursor.moveToFirst(), equalTo(true));
198        cursor.moveToNext();
199        assertThat(cursor.isLast(), equalTo(true));
200        cursor.moveToNext();
201        assertThat(cursor.isAfterLast(), equalTo(true));
202        cursor.moveToPrevious();
203        assertThat(cursor.isLast(), equalTo(true));
204        cursor.moveToPrevious();
205        assertThat(cursor.isLast(), equalTo(false));
206        cursor.moveToFirst();
207        cursor.moveToNext();
208        assertThat(cursor.isAfterLast(), equalTo(false));
209        cursor.moveToNext();
210        assertThat(cursor.isAfterLast(), equalTo(true));
211    }
212
213    @Test
214    public void testGetNotificationUri() {
215        Uri uri = Uri.parse("content://foo.com");
216        ShadowAbstractCursor shadow = Robolectric.shadowOf_(cursor);
217        assertThat(shadow.getNotificationUri_Compatibility(), is(nullValue()));
218        cursor.setNotificationUri(null, uri);
219        assertThat(shadow.getNotificationUri_Compatibility(), is(uri));
220    }
221
222	@Test
223	public void testIsClosedWhenAfterCallingClose() {
224		assertThat(cursor.isClosed(), equalTo(false));
225		cursor.close();
226		assertThat(cursor.isClosed(), equalTo(true));
227	}
228
229    private class TestCursor extends AbstractCursor {
230
231        public List<Object> theTable = new ArrayList<Object>();
232
233        @Override
234        public int getCount() {
235            return theTable.size();
236        }
237
238        @Override
239        public String[] getColumnNames() {
240            throw new UnsupportedOperationException();
241        }
242
243        @Override
244        public double getDouble(int columnIndex) {
245            throw new UnsupportedOperationException();
246        }
247
248        @Override
249        public float getFloat(int columnIndex) {
250            throw new UnsupportedOperationException();
251        }
252
253        @Override
254        public int getInt(int columnIndex) {
255            throw new UnsupportedOperationException();
256        }
257
258        @Override
259        public long getLong(int columnIndex) {
260            throw new UnsupportedOperationException();
261        }
262
263        @Override
264        public short getShort(int columnIndex) {
265            throw new UnsupportedOperationException();
266        }
267
268        @Override
269        public String getString(int columnIndex) {
270            throw new UnsupportedOperationException();
271        }
272
273        @Override
274        public boolean isNull(int columnIndex) {
275            throw new UnsupportedOperationException();
276        }
277    }
278}