1b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipackage com.xtremelabs.robolectric.shadows; 2b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 3b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 4b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport android.database.sqlite.SQLiteCursor; 5b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport com.xtremelabs.robolectric.Robolectric; 6b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport com.xtremelabs.robolectric.WithTestDefaultsRunner; 7b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport com.xtremelabs.robolectric.util.DatabaseConfig; 8b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesiimport org.junit.After; 9b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesiimport org.junit.Before; 10b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesiimport org.junit.Test; 11b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesiimport org.junit.runner.RunWith; 12b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 13b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport java.sql.Connection; 14b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport java.sql.PreparedStatement; 15b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport java.sql.ResultSet; 16b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport java.sql.Statement; 17b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 18b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport static org.hamcrest.CoreMatchers.equalTo; 19b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport static org.hamcrest.CoreMatchers.notNullValue; 20b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport static org.junit.Assert.assertThat; 21b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 22b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi@RunWith(WithTestDefaultsRunner.class) 23b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipublic class SQLiteCursorTest { 243f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 253f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private Connection connection; 263f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private ResultSet resultSet; 273f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private SQLiteCursor cursor; 283f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Before 303f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void setUp() throws Exception { 31b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken connection = DatabaseConfig.getMemoryConnection(); 323f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 333f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz Statement statement = connection.createStatement(); 343f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz statement.execute("CREATE TABLE table_name(" + 35b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken "id INTEGER PRIMARY KEY, name VARCHAR(255), long_value BIGINT," + 36b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala "float_value REAL, double_value DOUBLE, blob_value BINARY, clob_value CLOB );"); 373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz addPeople(); 393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupCursor(); 403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 413f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 423f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @After 433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void tearDown() throws Exception { 443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz connection.close(); 453f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnNames() throws Exception { 493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz String[] columnNames = cursor.getColumnNames(); 503f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 513f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertColumnNames(columnNames); 523f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnNamesEmpty() throws Exception { 563f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupEmptyResult(); 573f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz String[] columnNames = cursor.getColumnNames(); 583f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz // Column names are present even with an empty result. 603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(columnNames, notNullValue()); 613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertColumnNames(columnNames); 623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndex() throws Exception { 663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndex("id"), equalTo(0)); 673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndex("name"), equalTo(1)); 683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 713f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndexNotFound() throws Exception { 723f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndex("Fred"), equalTo(-1)); 733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 763f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndexEmpty() throws Exception { 773f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupEmptyResult(); 783f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndex("id"), equalTo(0)); 803f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndex("name"), equalTo(1)); 813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 823f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 833f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 843f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndexOrThrow() throws Exception { 853f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndexOrThrow("id"), equalTo(0)); 863f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndexOrThrow("name"), equalTo(1)); 873f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 883f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test(expected = IllegalArgumentException.class) 903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndexOrThrowNotFound() throws Exception { 913f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.getColumnIndexOrThrow("Fred"); 923f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 933f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndexOrThrowEmpty() throws Exception { 963f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupEmptyResult(); 973f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 983f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getColumnIndexOrThrow("name"), equalTo(1)); 993f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1013f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test(expected = IllegalArgumentException.class) 1023f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetColumnIndexOrThrowNotFoundEmpty() throws Exception { 1033f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupEmptyResult(); 1043f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1053f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.getColumnIndexOrThrow("Fred"); 1063f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1073f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1083f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 1093f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testMoveToFirst() throws Exception { 1103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.moveToFirst(), equalTo(true)); 1113f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getInt(0), equalTo(1234)); 1123f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getString(1), equalTo("Chuck")); 1133f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1143f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1153f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 1163f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testMoveToFirstEmpty() throws Exception { 1173f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupEmptyResult(); 1183f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1193f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.moveToFirst(), equalTo(false)); 1203f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1213f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 1233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testMoveToNext() throws Exception { 1243f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 1253f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1263f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.moveToNext(), equalTo(true)); 1273f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getInt(0), equalTo(1235)); 1283f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getString(1), equalTo("Julie")); 1293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1303f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1313f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 1323f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testMoveToNextPastEnd() throws Exception { 1333f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 1343f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1353f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToNext(); 1363f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToNext(); 1377bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi cursor.moveToNext(); 1383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.moveToNext(), equalTo(false)); 1403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 141b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 142b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken @Test 143b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken public void testMoveBackwards() throws Exception { 144b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(-1)); 145b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 146b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToFirst(); 147b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(0)); 148b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToNext(); 149b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(1)); 150b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToNext(); 151b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(2)); 152b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 153b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToFirst(); 154b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(0)); 155b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToNext(); 156b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(1)); 157b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToNext(); 158b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(2)); 159b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 160b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken cursor.moveToPosition(1); 161b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken assertThat(cursor.getPosition(), equalTo(1)); 162b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 1633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 1653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testMoveToNextEmpty() throws Exception { 1663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupEmptyResult(); 1673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 1693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.moveToNext(), equalTo(false)); 1703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 171415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 172415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi @Test 173415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi public void testMoveToPrevious() throws Exception { 174415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi cursor.moveToFirst(); 175415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi cursor.moveToNext(); 176415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 177415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi assertThat(cursor.moveToPrevious(), equalTo(true)); 178415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi assertThat(cursor.getInt(0), equalTo(1234)); 179415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi assertThat(cursor.getString(1), equalTo("Chuck")); 180415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi } 181415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 182415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi @Test 183415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi public void testMoveToPreviousPastStart() throws Exception { 184415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi cursor.moveToFirst(); 185415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 186415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi // Possible to move cursor before the first item 187415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi assertThat(cursor.moveToPrevious(), equalTo(true)); 188415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi // After that, attempts to move cursor back return false 189415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi assertThat(cursor.moveToPrevious(), equalTo(false)); 190415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi } 191415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 192415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi @Test 193415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi public void testMoveToPreviousEmpty() throws Exception { 194415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi setupEmptyResult(); 195415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi cursor.moveToFirst(); 196415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 197415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi assertThat(cursor.moveToPrevious(), equalTo(false)); 198415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi } 1993f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2013f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetPosition() throws Exception { 2023f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2033f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getPosition(), equalTo(0)); 2043f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2053f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToNext(); 2063f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getPosition(), equalTo(1)); 2073f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2083f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2093f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetBlob() throws Exception { 2113f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz String sql = "UPDATE table_name set blob_value=? where id=1234"; 2123f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz byte[] byteData = sql.getBytes(); 2133f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2143f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz PreparedStatement statement = connection.prepareStatement(sql); 2153f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz statement.setObject(1, byteData); 2163f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz statement.executeUpdate(); 2173f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2183f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupCursor(); 2193f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2203f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2213f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz byte[] retrievedByteData = cursor.getBlob(5); 2223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(byteData.length, equalTo(retrievedByteData.length)); 2233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2243f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz for (int i = 0; i < byteData.length; i++) { 2253f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(byteData[i], equalTo(retrievedByteData[i])); 2263f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2273f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2283f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 230b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala public void testGetClob() throws Exception { 231b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala String sql = "UPDATE table_name set clob_value=? where id=1234"; 232b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala String s = "Don't CLOBber my data, please. Thank you."; 233b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala 234b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala PreparedStatement statement = connection.prepareStatement(sql); 235b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala statement.setObject(1, s); 236b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala statement.executeUpdate(); 237b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala 238b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala setupCursor(); 239b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala cursor.moveToFirst(); 240b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala 241b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala String actual = cursor.getString(6); 242b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala assertThat(s, equalTo(actual)); 243b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala } 244b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala 245b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala @Test 2463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetString() throws Exception { 2473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz String[] data = {"Chuck", "Julie", "Chris"}; 2503f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2513f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz for (String aData : data) { 2523f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getString(1), equalTo(aData)); 2533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToNext(); 2543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2563f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2573f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2583f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetInt() throws Exception { 2593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz int[] data = {1234, 1235, 1236}; 2623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz for (int aData : data) { 2643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getInt(0), equalTo(aData)); 2653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToNext(); 2663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetLong() throws Exception { 2713f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2723f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getLong(2), equalTo(3463L)); 2743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2763f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2773f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetFloat() throws Exception { 2783f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2803f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getFloat(3), equalTo((float) 1.5)); 2813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2823f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2833f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2843f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testGetDouble() throws Exception { 2853f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 2863f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2873f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.getDouble(4), equalTo(3.14159)); 2883f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2913f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testClose() throws Exception { 2923f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isClosed(), equalTo(false)); 2933f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.close(); 2943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isClosed(), equalTo(true)); 2953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2963f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 2973f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 2983f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testIsNullWhenNull() throws Exception { 2993f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 3003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.moveToNext(), equalTo(true)); 3013f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3023f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(cursor.getColumnIndex("id")), equalTo(false)); 3033f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(cursor.getColumnIndex("name")), equalTo(false)); 3043f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3053f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(cursor.getColumnIndex("long_value")), equalTo(true)); 3063f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(cursor.getColumnIndex("float_value")), equalTo(true)); 3073f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(cursor.getColumnIndex("double_value")), equalTo(true)); 3083f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3093f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 3113f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testIsNullWhenNotNull() throws Exception { 3123f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 3133f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3143f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz for (int i = 0; i < 5; i++) { 3153f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(i), equalTo(false)); 3163f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3173f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3183f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3193f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Test 3203f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void testIsNullWhenIndexOutOfBounds() throws Exception { 3213f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor.moveToFirst(); 3223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz // column index 5 is out-of-bounds 3243f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz assertThat(cursor.isNull(5), equalTo(true)); 3253f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3263f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3273f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private void addPeople() throws Exception { 3283f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz String[] inserts = { 3293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz "INSERT INTO table_name (id, name, long_value, float_value, double_value) VALUES(1234, 'Chuck', 3463, 1.5, 3.14159);", 3303f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz "INSERT INTO table_name (id, name) VALUES(1235, 'Julie');", 3313f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz "INSERT INTO table_name (id, name) VALUES(1236, 'Chris');" 3323f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz }; 3333f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3343f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz for (String insert : inserts) { 3353f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz connection.createStatement().executeUpdate(insert); 3363f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private void setupCursor() throws Exception { 340b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken Statement statement = connection.createStatement(DatabaseConfig.getResultSetType(), ResultSet.CONCUR_READ_ONLY); 341bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken String sql ="SELECT * FROM table_name;"; 3423f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz resultSet = statement.executeQuery("SELECT * FROM table_name;"); 3433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz cursor = new SQLiteCursor(null, null, null, null); 3443c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken Robolectric.shadowOf(cursor).setResultSet(resultSet, sql); 3453f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private void setupEmptyResult() throws Exception { 3483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz Statement statement = connection.createStatement(); 3493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz statement.executeUpdate("DELETE FROM table_name;"); 3503f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3513f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz setupCursor(); 3523f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 3533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 3543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private void assertColumnNames(String[] columnNames) { 355b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala assertThat(columnNames.length, equalTo(7)); 3561a9369183084796a080ab7920cf840961a31abd2Chris Van Vranken assertThat(columnNames[0], equalTo("id")); 3571a9369183084796a080ab7920cf840961a31abd2Chris Van Vranken assertThat(columnNames[1], equalTo("name")); 3581a9369183084796a080ab7920cf840961a31abd2Chris Van Vranken assertThat(columnNames[2], equalTo("long_value")); 3591a9369183084796a080ab7920cf840961a31abd2Chris Van Vranken assertThat(columnNames[3], equalTo("float_value")); 3601a9369183084796a080ab7920cf840961a31abd2Chris Van Vranken assertThat(columnNames[4], equalTo("double_value")); 3611a9369183084796a080ab7920cf840961a31abd2Chris Van Vranken assertThat(columnNames[5], equalTo("blob_value")); 362b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala assertThat(columnNames[6], equalTo("clob_value")); 3633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 364b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 365b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi} 366