package cucumber.runtime.android;
import cucumber.runtime.model.CucumberExamples;
import cucumber.runtime.model.CucumberFeature;
import cucumber.runtime.model.CucumberScenario;
import cucumber.runtime.model.CucumberScenarioOutline;
import cucumber.runtime.model.CucumberTagStatement;
import gherkin.formatter.model.Examples;
import gherkin.formatter.model.ExamplesTableRow;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class ScenarioCounterTest {
@Test
public void calculates_number_of_tests_for_regular_scenarios() {
// given
final List<CucumberFeature> cucumberFeatures = createCucumberFeaturesWithScenarios(1, 2);
// when
final int result = ScenarioCounter.countScenarios(cucumberFeatures);
// then
assertThat(result, is(2));
}
@Test
public void calculates_number_of_tests_for_scenarios_with_examples() {
// given 2 scenario outlines with 2 examples each and 2 rows (excluding the header row) each
final List<CucumberFeature> cucumberFeatures = createCucumberFeaturesWithScenarioOutlines(1, 2, 2, 2);
// when
final int result = ScenarioCounter.countScenarios(cucumberFeatures);
// then
assertThat(result, is(8));
}
private List<CucumberFeature> createCucumberFeaturesWithScenarios(
final int numberOfCucumberFeatures,
final int numberOfCucumberScenarios) {
final List<CucumberFeature> cucumberFeatures = new ArrayList<CucumberFeature>();
for (int f = 0; f < numberOfCucumberFeatures; f++) {
final CucumberFeature cucumberFeature = mock(CucumberFeature.class);
cucumberFeatures.add(cucumberFeature);
final List<CucumberTagStatement> cucumberTagStatements = new ArrayList<CucumberTagStatement>();
for (int s = 0; s < numberOfCucumberScenarios; s++) {
cucumberTagStatements.add(mock(CucumberScenario.class));
}
when(cucumberFeature.getFeatureElements()).thenReturn(cucumberTagStatements);
}
return cucumberFeatures;
}
private List<CucumberFeature> createCucumberFeaturesWithScenarioOutlines(
final int numberOfCucumberFeatures,
final int numberOfScenarioOutlines,
final int numberOfCucumberExamples,
final int numberOfExampleRows) {
final int numberOfExampleRowsIncludingHeaderRow = numberOfExampleRows + 1;
final List<CucumberFeature> cucumberFeatures = new ArrayList<CucumberFeature>();
for (int f = 0; f < numberOfCucumberFeatures; f++) {
final CucumberFeature cucumberFeature = mock(CucumberFeature.class);
cucumberFeatures.add(cucumberFeature);
// set up 2 scenarios outlines
final List<CucumberTagStatement> cucumberTagStatements = new ArrayList<CucumberTagStatement>();
for (int o = 0; o < numberOfScenarioOutlines; o++) {
cucumberTagStatements.add(mock(CucumberScenarioOutline.class));
}
when(cucumberFeature.getFeatureElements()).thenReturn(cucumberTagStatements);
// with 2 examples for each scenario outline
for (final CucumberTagStatement cucumberTagStatement : cucumberTagStatements) {
final CucumberScenarioOutline cucumberScenarioOutline = (CucumberScenarioOutline) cucumberTagStatement;
final List<CucumberExamples> cucumberExamplesList = createMockList(CucumberExamples.class, numberOfCucumberExamples);
when(cucumberScenarioOutline.getCucumberExamplesList()).thenReturn(cucumberExamplesList);
// each example should have two rows (excluding the header row)
for (final CucumberExamples cucumberExamples : cucumberExamplesList) {
final Examples examples = mock(Examples.class);
when(examples.getRows()).thenReturn(createMockList(ExamplesTableRow.class, numberOfExampleRowsIncludingHeaderRow));
when(cucumberExamples.getExamples()).thenReturn(examples);
}
}
}
return cucumberFeatures;
}
private static <T> List<T> createMockList(final Class<T> type, final int numberOfMocks) {
final List<T> list = new ArrayList<T>();
for (int i = 0; i < numberOfMocks; i++) {
list.add(mock(type));
}
return list;
}
}