package org.activityinfo.ui.client.importer; import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.gwt.core.client.testing.StubScheduler; import com.google.gwt.junit.GWTMockUtilities; import org.activityinfo.core.client.form.tree.AsyncFormTreeBuilder; import org.activityinfo.core.shared.importing.model.ColumnAction; import org.activityinfo.core.shared.importing.model.MapExistingAction; import org.activityinfo.core.shared.importing.source.SourceColumn; import org.activityinfo.core.shared.importing.source.SourceRow; import org.activityinfo.core.shared.importing.model.ImportModel; import org.activityinfo.core.shared.importing.strategy.FieldImporterColumn; import org.activityinfo.core.shared.importing.strategy.ImportTarget; import org.activityinfo.core.shared.importing.validation.ValidatedRow; import org.activityinfo.core.shared.importing.validation.ValidatedRowTable; import org.activityinfo.core.shared.importing.validation.ValidationResult; import org.activityinfo.promise.Promise; import org.activityinfo.legacy.shared.adapter.ResourceLocatorAdaptor; import org.activityinfo.server.command.CommandTestCase2; import org.activityinfo.ui.client.component.importDialog.Importer; import org.junit.Before; import java.util.List; import static org.activityinfo.core.client.PromiseMatchers.assertResolves; public class AbstractImporterTest extends CommandTestCase2 { public static final int COLUMN_WIDTH = 30; protected ResourceLocatorAdaptor resourceLocator; protected AsyncFormTreeBuilder formTreeBuilder; protected ImportModel importModel; protected StubScheduler scheduler; protected List<ImportTarget> targets; protected Importer importer; @Before public void setupAdapters() { resourceLocator = new ResourceLocatorAdaptor(getDispatcher()); formTreeBuilder = new AsyncFormTreeBuilder(resourceLocator); scheduler = new StubScheduler(); // disable GWT.create so that references in static initializers // don't sink our test GWTMockUtilities.disarm(); } protected <T> T runScheduledAndAssertResolves(Promise<T> promise) { runAll(); return assertResolves(promise); } private void runAll() { while(scheduler.executeCommands()) {} } protected void dumpHeaders(List<FieldImporterColumn> importColumns) { System.out.print(" "); for(FieldImporterColumn col : importColumns) { System.out.print(" " + cell(col.getAccessor().getHeading())); } System.out.println(); System.out.println(Strings.repeat("-", COLUMN_WIDTH * importColumns.size())); } private String cell(String text) { int width = COLUMN_WIDTH - 2; if(text.length() < width) { return Strings.padEnd(text, width, ' '); } else { return text.substring(0, width); } } protected void dumpRows(ValidatedRowTable table) { int numRows = table.getRows().size(); int numColumns = table.getColumns().size(); for(int i=0;i!=numRows;++i) { SourceRow sourceRow = importModel.getSource().getRows().get(i); ValidatedRow resultRow = table.getRows().get(i); for(int j=0;j!=numColumns;++j) { FieldImporterColumn column = table.getColumns().get(j); String importedValue = Strings.nullToEmpty(column.getAccessor().getValue(sourceRow)); ValidationResult result = resultRow.getResult(j); String cell = ""; if(result.wasConverted()) { cell = importedValue + " [" + result.getConvertedValue() + "]"; } else { cell = importedValue; } System.out.print(" " + icon(result) + Strings.padEnd(cell, COLUMN_WIDTH - 2, ' ')); } System.out.println(); } } private String rowIcon(SourceRow instance) { // if(!instance.isValid()) { // return "x"; // } else { // return " "; // } return " "; } private String icon(ValidationResult status) { if(status.hasTypeConversionError()) { return "x"; } else if(status.wasConverted() && status.getConfidence() < 0.9) { return "!"; } else { return " "; } } protected ColumnAction target(String debugFieldPath) { if(targets == null) { targets = importer.getImportTargets(); } List<String> options = Lists.newArrayList(); for(ImportTarget target : targets) { if(target.getLabel().equals(debugFieldPath)) { return new MapExistingAction(target); } options.add(target.getLabel()); } throw new RuntimeException(String.format("No field matching '%s', we have: %s", debugFieldPath, options)); } protected int columnIndex(String header) { for(SourceColumn column : importModel.getSource().getColumns()) { if(column.getHeader().trim().equals(header)) { return column.getIndex(); } } throw new RuntimeException("No imported column with header " + header); } protected void dumpList(final String title, Iterable<?> items) { System.out.println(title + ":"); System.out.println("-----------------------"); System.out.println(Joiner.on("\n").join(items)); System.out.println("-----------------------"); System.out.println(); } protected void showValidationGrid(ValidatedRowTable rowTable) { dumpHeaders(rowTable.getColumns()); dumpRows(rowTable); } protected void validateRows() { // Integer validCount = runScheduledAndAssertResolves(importer.countValidRows()); // System.out.println("VALID ROWS: " + validCount); } protected void matchReferences() { // importer = new Importer2(importModel.getFormTree(), resourceLocator); // runScheduledAndAssertResolves(importer.matchReferences()); } }