package by.istin.android.xcore.test.common; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.test.ApplicationTestCase; import java.io.InputStream; import java.util.HashMap; import by.istin.android.xcore.app.Application; import by.istin.android.xcore.model.CursorModel; import by.istin.android.xcore.processor.IProcessor; import by.istin.android.xcore.processor.impl.AbstractGsonProcessor; import by.istin.android.xcore.provider.ModelContract; import by.istin.android.xcore.source.DataSourceRequest; import by.istin.android.xcore.utils.AppUtils; import by.istin.android.xcore.utils.CursorUtils; import by.istin.android.xcore.utils.StringUtil; public abstract class AbstractTestProcessor<A extends Application> extends ApplicationTestCase<A> { private TestDataSource testDataSource; public AbstractTestProcessor(Class<A> applicationClass) { super(applicationClass); } @Override public void setUp() throws Exception { super.setUp(); createApplication(); testDataSource = new TestDataSource(); } public void clear(Class<?> ... entities) { for (Class<?> entity : entities) { getApplication().getContentResolver().delete(ModelContract.getUri(entity), null, null); } } protected void checkRequiredFields(Class<?> classEntity, String ... fields) { Uri uri = ModelContract.getUri(classEntity); String[] projection = null; String selection = null; String[] selectionArgs = null; String sortOrder = null; checkRequiredFields(uri, projection, selection, selectionArgs, sortOrder, fields); } protected void checkRequiredFields(Class<?> classEntity, int countRequiredValues, String ... fields) { Uri uri = ModelContract.getUri(classEntity); String[] projection = null; String selection = null; String[] selectionArgs = null; String sortOrder = null; checkRequiredFields(uri, projection, selection, selectionArgs, sortOrder, countRequiredValues, fields); } protected void checkRequiredFields(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, String... fields) { Cursor cursor = getApplication().getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); CursorModel cursorModel = new CursorModel(cursor); for (int i = 0; i < cursorModel.size(); i++) { CursorModel entity = cursorModel.get(i); for (int j = 0; j < fields.length; j++) { String field = fields[j]; String value = entity.getString(field); assertNotNull(field+ " is required",value); assertFalse(field+ " is required", StringUtil.isEmpty(value)); } } CursorUtils.close(cursor); } protected void checkRequiredFields(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, int count, String... fields) { Cursor cursor = getApplication().getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); CursorModel cursorModel = new CursorModel(cursor); HashMap<String, Integer> fieldsCount = new HashMap<String, Integer>(); for (int i = 0; i < fields.length; i++) { fieldsCount.put(fields[i], count); } for (int i = 0; i < cursorModel.size(); i++) { CursorModel entity = cursorModel.get(i); for (int j = 0; j < fields.length; j++) { String field = fields[j]; String value = entity.getString(field); if (value != null) { fieldsCount.put(field, fieldsCount.get(field)-1); } } } CursorUtils.close(cursor); for (int i = 0; i < fields.length; i++) { int value = fieldsCount.get(fields[i]); assertEquals(fields[i]+ " is required, " + value +" null values found", 0, value); } } protected void checkCount(Class<?> entity, int count) { Uri uri = ModelContract.getUri(entity); String[] projection = null; String selection = null; String[] selectionArgs = null; String sortOrder = null; checkCount(count, uri, projection, selection, selectionArgs, sortOrder); } protected void checkCount(int count, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cursor = getApplication().getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); if (CursorUtils.isEmpty(cursor)) { assertTrue(uri + " need to be " + count, count == 0); } else { assertEquals(count, cursor.getCount()); } CursorUtils.close(cursor); } public Object testExecute(String processorKey, String feedUri) throws Exception { return testExecute(getApplication(), processorKey, feedUri); } public Object testExecute(Context context, String processorKey, String feedUri) throws Exception { IProcessor processor = (IProcessor) AppUtils.get(context, processorKey); DataSourceRequest dataSourceRequest = new DataSourceRequest(feedUri); InputStream inputStream = testDataSource.getSource(dataSourceRequest); Object executeResult = processor.execute(dataSourceRequest, testDataSource, inputStream); processor.cache(context, dataSourceRequest, executeResult); return executeResult; } }