package net.thucydides.junit.runners; import net.thucydides.core.annotations.TestAnnotations; import net.thucydides.core.model.DataTable; import net.thucydides.core.steps.BaseStepListener; import net.thucydides.core.steps.StepEventBus; import net.thucydides.core.steps.StepListener; import net.thucydides.junit.listeners.JUnitStepListener; import org.junit.runner.Description; import org.junit.runner.notification.Failure; public class ParameterizedJUnitStepListener extends JUnitStepListener { final int parameterSetNumber; private final DataTable parametersTable; public ParameterizedJUnitStepListener(final int parameterSetNumber, final DataTable parametersTable, final Class<?> testClass, BaseStepListener baseStepListener, StepListener... listeners) { super(testClass, baseStepListener, listeners); this.parameterSetNumber = parameterSetNumber; this.parametersTable = parametersTable; } @Override public void testRunStarted(Description description) throws Exception { super.testRunStarted(description); } @Override public void testStarted(final Description description) { if (testingThisDataSet(description)) { super.testStarted(description); StepEventBus.getEventBus().useExamplesFrom(dataTableRow()); //StepEventBus.getEventBus().useExamplesFrom(dataTable()); if (!ignoredOrPending(description)) StepEventBus.getEventBus().exampleStarted(parametersTable.row(parameterSetNumber).toStringMap()); } } private boolean isPending(Description description) { return TestAnnotations.forClass(description.getTestClass()).isPending(description.getMethodName()); } private boolean isIgnored(Description description) { return TestAnnotations.forClass(description.getTestClass()).isIgnored(description.getMethodName()); } private boolean ignoredOrPending(Description description) { return isIgnored(description) || isPending(description); } private DataTable dataTableRow() { return DataTable.withHeaders(parametersTable.getHeaders()).andCopyRowDataFrom(parametersTable.getRows().get(parameterSetNumber)).build(); } private DataTable dataTable() { return DataTable.withHeaders(parametersTable.getHeaders()).andRowData (parametersTable.getRows()).build(); } private boolean testingThisDataSet(Description description) { return ((description.getTestClass().equals(getTestClass())) && (description.getMethodName().endsWith("[" + parameterSetNumber + "]"))); } @Override public void testFinished(final Description description) throws Exception { if (testingThisDataSet(description)) { super.testFinished(description); StepEventBus.getEventBus().exampleFinished(); } } @Override public void testFailure(final Failure failure) throws Exception { if (testingThisDataSet(failure.getDescription())) { super.testFailure(failure); StepEventBus.getEventBus().exampleFinished(); } } @Override public void testIgnored(final Description description) throws Exception { if (testingThisDataSet(description)) { super.testIgnored(description); if (!ignoredOrPending(description)){ StepEventBus.getEventBus().exampleFinished(); } } } }