package dbfit.diff; import dbfit.util.MatchResult; import dbfit.util.DiffHandler; import dbfit.util.DiffListenerAdapter; import dbfit.util.DataRow; import dbfit.util.MatchStatus; import static dbfit.util.MatchStatus.*; import static dbfit.util.DiffTestUtils.createDataRowBuilder; import static dbfit.test.matchers.HasMatchStatus.*; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.junit.Test; import org.junit.Before; import org.junit.runner.RunWith; import static org.junit.Assert.assertThat; import org.mockito.ArgumentCaptor; import static org.mockito.ArgumentCaptor.forClass; import static org.mockito.Mockito.*; import java.util.Collection; import java.util.List; import static java.util.Arrays.asList; @RunWith(Parameterized.class) public class DataRowDiffParameterizedIntTest { public static final List<String> allColumns = asList("n", "2n"); public static final String[] allColumnsArr = allColumns.toArray(new String[0]); private DataRowDiff diff; private DiffHandler handler; private ArgumentCaptor<MatchResult> rowResultCaptor = forClass(MatchResult.class); private ArgumentCaptor<MatchResult> cellResultCaptor = forClass(MatchResult.class); // parameterized tests arguments private DataRow row1; private DataRow row2; private List<String> colNames; private MatchStatus expectedRowStatus; private List<MatchStatus> expectedCellStatuses; public DataRowDiffParameterizedIntTest( List<List<Integer>> rows, List<String> colNames, MatchStatus expectedRowStatus, List<MatchStatus> expectedCellStatuses) { this.row1 = createDataRowBuilder(allColumnsArr).createRow(rows.get(0)); this.row2 = createDataRowBuilder(allColumnsArr).createRow(rows.get(1)); this.colNames = colNames; this.expectedRowStatus = expectedRowStatus; this.expectedCellStatuses = expectedCellStatuses; } @Before public void prepare() { diff = new DataRowDiff(colNames.toArray(new String[0])); handler = mock(DiffHandler.class); diff.addListener(new DiffListenerAdapter(handler)); } @Parameters(name = "({index}): rows {0}/{1} -> expecting {2} -- {3}") public static Collection<Object[]> data() throws Exception { return java.util.Arrays.asList(new Object[][] { {asList(r(2, 4), r(2, 4)), allColumns, SUCCESS, asList(SUCCESS, SUCCESS)}, {asList(r(2, 4), r(2, 5)), allColumns, WRONG, asList(SUCCESS, WRONG)}, {asList(r(2, 4), r(3, 4)), allColumns, WRONG, asList(WRONG, SUCCESS)}, {asList(r(2, 4), null), allColumns, MISSING, asList(MISSING, MISSING)}, {asList( null, r(2, 4)), allColumns, SURPLUS, asList(SURPLUS, SURPLUS)}, {asList(r(2, 4), r(2, 9)), cols("n"), SUCCESS, asList(SUCCESS)}, }); } @Test @SuppressWarnings("unchecked") public void testRowDiffStatus() { diff.diff(row1, row2); verify(handler).endRow(rowResultCaptor.capture()); verifyResults(rowResultCaptor, asList(expectedRowStatus)); } @Test @SuppressWarnings("unchecked") public void testCellDiffStatuses() { diff.diff(row1, row2); verify(handler, times(colNames.size())).endCell(cellResultCaptor.capture()); verifyResults(cellResultCaptor, expectedCellStatuses); } private void verifyResults(ArgumentCaptor<MatchResult> captor, List<MatchStatus> expectedStatuses) { assertThat(captor.getAllValues(), haveItemsStatuses(expectedStatuses)); } private static List<Integer> r(Integer... items) { return asList(items); } private static List<String> cols(String... colNames) { return asList(colNames); } }