package org.commcare.android.mocks; import android.net.Uri; import org.robolectric.fakes.RoboCursor; import java.util.ArrayList; import java.util.List; public class ExtendedTestCursor extends RoboCursor { public Uri uri; public String[] projection; public String selection; public String[] selectionArgs; public String sortOrder; protected Object[][] results = new Object[0][0]; protected List<String> columnNames= new ArrayList<>(); int resultsIndex = -1; boolean closeWasCalled; @Override public void setQuery(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { this.uri = uri; this.projection = projection; this.selection = selection; this.selectionArgs = selectionArgs; this.sortOrder = sortOrder; } @Override public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException{ int col = getColumnIndex(columnName); if(col == -1){ throw new IllegalArgumentException("No column with name: "+columnName); } return col; } @Override public int getColumnIndex(String columnName) { return columnNames.indexOf(columnName); } @Override public int getColumnCount() { return columnNames.size(); } @Override public String getColumnName(int columnIndex) { return columnNames.get(columnIndex); } @Override public String getString(int columnIndex) { return (String) results[resultsIndex][columnIndex]; } @Override public int getInt(int columnIndex) { return (Integer) results[resultsIndex][columnIndex]; } @Override public long getLong(int columnIndex) { return (Long) results[resultsIndex][columnIndex]; } @Override public short getShort(int columnIndex) { return (Short) results[resultsIndex][columnIndex]; } @Override public float getFloat(int columnIndex) { return (Float) results[resultsIndex][columnIndex]; } @Override public double getDouble(int columnIndex) { return (Double) results[resultsIndex][columnIndex]; } @Override public byte[] getBlob(int columnIndex) { return (byte[]) results[resultsIndex][columnIndex]; } @Override public int getCount() { return results.length; } @Override public int getPosition() { return resultsIndex; } @Override public String[] getColumnNames() { return columnNames.toArray(new String[columnNames.size()]); } @Override public boolean moveToNext() { ++resultsIndex; return resultsIndex < results.length; } @Override public void close() { closeWasCalled = true; } /** * Use {@link #setResults(java.util.List, Object[][])} to set the column names and the data * in an atomic operation. * @param columnNames list of column names */ @Override @Deprecated public void setColumnNames(List<String> columnNames) { this.columnNames = columnNames; } /** * Use {@link #setResults(java.util.List, Object[][])} to set the column names and the data * in an atomic operation. * @param results matrix of results */ @Override @Deprecated public void setResults(Object[][] results) { this.results = results; } /** * Sets the results and column names in an atomic operation, verifies columns count * aligns with the data. * @param columnNames list of column names * @param results matrix of results */ public void setResults(List<String> columnNames, Object[][] results) { for (Object[] result : results) { if (columnNames.size() != result.length) { throw new IllegalArgumentException("Each row must have the correct number of columns"); } } this.columnNames = columnNames; this.results = results; } @Override public boolean getCloseWasCalled() { return closeWasCalled; } }