1package com.xtremelabs.robolectric.shadows;
2
3import static org.hamcrest.CoreMatchers.equalTo;
4import static org.hamcrest.CoreMatchers.notNullValue;
5import static org.hamcrest.CoreMatchers.nullValue;
6import static org.hamcrest.CoreMatchers.sameInstance;
7import static org.junit.Assert.assertThat;
8
9import java.sql.Connection;
10import java.sql.ResultSet;
11import java.sql.Statement;
12import java.util.ArrayList;
13import java.util.List;
14
15import org.junit.Before;
16import org.junit.Test;
17import org.junit.runner.RunWith;
18
19import android.content.Context;
20import android.database.Cursor;
21import android.database.sqlite.SQLiteCursor;
22import android.view.View;
23import android.view.ViewGroup;
24import android.widget.CursorAdapter;
25
26import com.xtremelabs.robolectric.Robolectric;
27import com.xtremelabs.robolectric.WithTestDefaultsRunner;
28import com.xtremelabs.robolectric.util.DatabaseConfig;
29
30@RunWith(WithTestDefaultsRunner.class)
31public class CursorAdapterTest {
32
33	private Cursor curs;
34	private CursorAdapter adapter;
35
36	@Before
37	public void setUp() throws Exception {
38		Connection connection = DatabaseConfig.getMemoryConnection();
39
40        Statement statement = connection.createStatement();
41        statement.execute("CREATE TABLE table_name(_id INT PRIMARY KEY, name VARCHAR(255));" );
42        String[] inserts = {
43                "INSERT INTO table_name (_id, name) VALUES(1234, 'Chuck');",
44                "INSERT INTO table_name (_id, name) VALUES(1235, 'Julie');",
45                "INSERT INTO table_name (_id, name) VALUES(1236, 'Chris');",
46                "INSERT INTO table_name (_id, name) VALUES(1237, 'Brenda');",
47                "INSERT INTO table_name (_id, name) VALUES(1238, 'Jane');"
48        };
49
50        for (String insert : inserts) {
51            connection.createStatement().executeUpdate(insert);
52        }
53
54        statement = connection.createStatement(DatabaseConfig.getResultSetType(), ResultSet.CONCUR_READ_ONLY);
55        String sql = "SELECT * FROM table_name;";
56        ResultSet resultSet = statement.executeQuery(sql);
57        curs = new SQLiteCursor(null, null, null, null);
58        Robolectric.shadowOf((SQLiteCursor)curs).setResultSet(resultSet,sql);
59
60		adapter = new TestAdapter(curs);
61	}
62
63	@Test
64	public void testChangeCursor() {
65		assertThat(adapter.getCursor(), notNullValue());
66		assertThat(adapter.getCursor(), sameInstance(curs));
67
68		adapter.changeCursor( null );
69
70		assertThat(curs.isClosed(), equalTo( true ) );
71		assertThat(adapter.getCursor(), nullValue() );
72	}
73
74	@Test
75	public void testCount() {
76		assertThat(adapter.getCount(), equalTo(curs.getCount()));
77		adapter.changeCursor( null );
78		assertThat(adapter.getCount(), equalTo(0) );
79	}
80
81	@Test
82	public void testGetItemId() {
83		for ( int i = 0; i < 5; i++ ) {
84			assertThat(adapter.getItemId(i), equalTo((long) 1234 + i));
85		}
86	}
87
88	@Test
89	public void testGetView() {
90		List<View> views = new ArrayList<View>();
91		for (int i = 0; i < 5; i++) {
92			views.add(new View(Robolectric.application));
93		}
94
95		Robolectric.shadowOf(adapter).setViews( views );
96
97		for (int i = 0; i < 5; i++) {
98			assertThat(adapter.getView(i, null, null), sameInstance(views.get(i)));
99		}
100	}
101
102	private class TestAdapter extends CursorAdapter {
103
104		public TestAdapter( Cursor curs ) {
105			super( Robolectric.application, curs, false );
106		}
107
108		@Override
109		public void bindView(View view, Context context, Cursor cursor) { }
110
111		@Override
112		public View newView(Context context, Cursor cursor, ViewGroup parent) {
113			return null;
114		}
115	}
116}
117