package net.thucydides.core.reports.adaptors.lettuce; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.thucydides.core.PendingStepException; import net.thucydides.core.model.Story; import net.thucydides.core.model.TestOutcome; import net.thucydides.core.model.TestResult; import net.thucydides.core.model.TestStep; import net.thucydides.core.reports.adaptors.common.FilebasedOutcomeAdaptor; import net.thucydides.core.reports.adaptors.xunit.BasicXUnitLoader; import net.thucydides.core.reports.adaptors.xunit.io.XUnitFiles; import net.thucydides.core.reports.adaptors.xunit.model.TestCase; import net.thucydides.core.reports.adaptors.xunit.model.TestSuite; import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; public class LettuceXUnitAdaptor extends FilebasedOutcomeAdaptor { BasicXUnitLoader loader = new BasicXUnitLoader(); public List<TestOutcome> loadOutcomesFrom(final File source) throws IOException { List<TestOutcome> loadedOutcomes = Lists.newArrayList(); for(File xunitFile : XUnitFiles.in(source)) { loadedOutcomes.addAll(testOutcomesIn(xunitFile)); } return ImmutableList.copyOf(loadedOutcomes); } private Collection<? extends TestOutcome> testOutcomesIn(File xunitFile) throws IOException { List<TestSuite> rawTestSuites = loader.loadFrom(xunitFile); return ImmutableList.copyOf(groupTestCasesByClassname(rawTestSuites)); } private List<TestOutcome> groupTestCasesByClassname(List<TestSuite> testSuites) { List<TestOutcome> groupedOutcomes = Lists.newArrayList(); for(TestSuite suite : testSuites) { groupedOutcomes.addAll(testOutcomesWithGroupedTestCases(suite)); } return groupedOutcomes; } private List<TestOutcome> testOutcomesWithGroupedTestCases(TestSuite testSuite) { List<TestCase> rawTestCases = testSuite.getTestCases(); List<TestOutcome> groupedTestOutcomes = Lists.newArrayList(); Map<String, TestOutcome> testOutcomesIndex = Maps.newHashMap(); for(TestCase testCase : rawTestCases) { TestOutcome testOutcome = testOutcomeForTestClass(testOutcomesIndex, testCase.getClassname()); addIfNotPresent(groupedTestOutcomes, testOutcome); TestStep nextStep = TestStep.forStepCalled(testCase.getName()).withResult(resultOf(testCase)); Optional<Throwable> testFailure = testFailureFrom(testCase); if (testFailure.isPresent()) { nextStep.failedWith(testFailure.get()); } testOutcome.recordStep(nextStep); } return ImmutableList.copyOf(groupedTestOutcomes); } private void addIfNotPresent(List<TestOutcome> groupedTestOutcomes, final TestOutcome testOutcome) { if (!groupedTestOutcomes.contains(testOutcome)) { groupedTestOutcomes.add(testOutcome); } } private Optional<Throwable> testFailureFrom(TestCase testCase) { Throwable testFailure = null; if (testCase.getFailure().isPresent()) { testFailure = testCase.getFailure().get().asAssertionFailure(); } else if (testCase.getSkipped().isPresent()) { testFailure = new PendingStepException(testCase.getSkipped().get().getType()); } else if (testCase.getError().isPresent()) { testFailure = testCase.getError().get().asException(); } return Optional.fromNullable(testFailure); } private TestResult resultOf(TestCase testCase) { if (testCase.getError().isPresent()) { return TestResult.ERROR; } else if (testCase.getFailure().isPresent()) { return TestResult.FAILURE; } else if (testCase.getSkipped().isPresent()) { return TestResult.SKIPPED; } else { return TestResult.SUCCESS; } } private TestOutcome testOutcomeForTestClass(Map<String, TestOutcome> groupedTestOutcomes, String testClassName) { if (groupedTestOutcomes.containsKey(testClassName)) { return groupedTestOutcomes.get(testClassName); } TestOutcome newTestOutcome = TestOutcome.forTestInStory(testClassName, Story.called(testClassName)); groupedTestOutcomes.put(testClassName, newTestOutcome); return newTestOutcome; } }