package cucumber.runtime.formatter;
import cucumber.runtime.StepDefinitionMatch;
import gherkin.formatter.model.Result;
import org.junit.Test;
import org.mockito.Mockito;
import java.io.Closeable;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
public class UsageFormatterTest {
@Test
public void close() throws IOException {
Appendable out = mock(Appendable.class, withSettings().extraInterfaces(Closeable.class));
UsageFormatter usageFormatter = new UsageFormatter(out);
usageFormatter.close();
verify((Closeable) out).close();
}
@Test
public void resultWithoutSkippedSteps() {
Appendable out = mock(Appendable.class);
UsageFormatter usageFormatter = new UsageFormatter(out);
Result result = mock(Result.class);
when(result.getStatus()).thenReturn(Result.SKIPPED.getStatus());
usageFormatter.result(result);
verifyZeroInteractions(out);
}
@Test
public void resultWithStep() {
Appendable out = mock(Appendable.class);
UsageFormatter usageFormatter = new UsageFormatter(out);
StepDefinitionMatch match = mockStepDefinitionMatch();
usageFormatter.match(match);
Result result = mock(Result.class);
when(result.getDuration()).thenReturn(12345L);
when(result.getStatus()).thenReturn(Result.PASSED);
usageFormatter.result(result);
Map<String, List<UsageFormatter.StepContainer>> usageMap = usageFormatter.usageMap;
assertEquals(usageMap.size(), 1);
List<UsageFormatter.StepContainer> durationEntries = usageMap.get("stepDef");
assertEquals(durationEntries.size(), 1);
assertEquals(durationEntries.get(0).name, "step");
assertEquals(durationEntries.get(0).durations.size(), 1);
assertEquals(durationEntries.get(0).durations.get(0).duration, BigDecimal.valueOf(12345));
}
private StepDefinitionMatch mockStepDefinitionMatch() {
StepDefinitionMatch match = mock(StepDefinitionMatch.class, Mockito.RETURNS_MOCKS);
when(match.getPattern()).thenReturn("stepDef");
when(match.getStepLocation()).thenReturn(new StackTraceElement("x", "y", "z", 3));
when(match.getStepName()).thenReturn("step");
return match;
}
@Test
public void resultWithZeroDuration() {
Appendable out = mock(Appendable.class);
UsageFormatter usageFormatter = new UsageFormatter(out);
StepDefinitionMatch match = mockStepDefinitionMatch();
usageFormatter.match(match);
Result result = mock(Result.class);
when(result.getDuration()).thenReturn(0L);
when(result.getStatus()).thenReturn(Result.PASSED);
usageFormatter.result(result);
Map<String, List<UsageFormatter.StepContainer>> usageMap = usageFormatter.usageMap;
assertEquals(usageMap.size(), 1);
List<UsageFormatter.StepContainer> durationEntries = usageMap.get("stepDef");
assertEquals(durationEntries.size(), 1);
assertEquals(durationEntries.get(0).name, "step");
assertEquals(durationEntries.get(0).durations.size(), 1);
assertEquals(durationEntries.get(0).durations.get(0).duration, BigDecimal.ZERO);
}
@Test
public void resultWithNullDuration() {
Appendable out = mock(Appendable.class);
UsageFormatter usageFormatter = new UsageFormatter(out);
StepDefinitionMatch match = mockStepDefinitionMatch();
usageFormatter.match(match);
Result result = mock(Result.class);
when(result.getDuration()).thenReturn(null);
when(result.getStatus()).thenReturn(Result.PASSED);
usageFormatter.result(result);
Map<String, List<UsageFormatter.StepContainer>> usageMap = usageFormatter.usageMap;
assertEquals(usageMap.size(), 1);
List<UsageFormatter.StepContainer> durationEntries = usageMap.get("stepDef");
assertEquals(durationEntries.size(), 1);
assertEquals(durationEntries.get(0).name, "step");
assertEquals(durationEntries.get(0).durations.size(), 1);
assertEquals(durationEntries.get(0).durations.get(0).duration, BigDecimal.ZERO);
}
@Test
public void doneWithoutUsageStatisticStrategies() throws IOException {
StringBuffer out = new StringBuffer();
UsageFormatter usageFormatter = new UsageFormatter(out);
UsageFormatter.StepContainer stepContainer = new UsageFormatter.StepContainer();
UsageFormatter.StepDuration stepDuration = new UsageFormatter.StepDuration();
stepDuration.duration = BigDecimal.valueOf(12345678L);
stepDuration.location = "location.feature";
stepContainer.durations = Arrays.asList(stepDuration);
usageFormatter.usageMap.put("aStep", Arrays.asList(stepContainer));
usageFormatter.done();
assertTrue(out.toString().contains("0.012345678"));
}
@Test
public void doneWithUsageStatisticStrategies() throws IOException {
StringBuffer out = new StringBuffer();
UsageFormatter usageFormatter = new UsageFormatter(out);
UsageFormatter.StepContainer stepContainer = new UsageFormatter.StepContainer();
UsageFormatter.StepDuration stepDuration = new UsageFormatter.StepDuration();
stepDuration.duration = BigDecimal.valueOf(12345678L);
stepDuration.location = "location.feature";
stepContainer.durations = Arrays.asList(stepDuration);
usageFormatter.usageMap.put("aStep", Arrays.asList(stepContainer));
UsageFormatter.UsageStatisticStrategy usageStatisticStrategy = mock(UsageFormatter.UsageStatisticStrategy.class);
when(usageStatisticStrategy.calculate(Arrays.asList(12345678L))).thenReturn(23456L);
usageFormatter.addUsageStatisticStrategy("average", usageStatisticStrategy);
usageFormatter.done();
assertTrue(out.toString().contains("0.000023456"));
assertTrue(out.toString().contains("0.012345678"));
}
}