package org.pitest.testng; import java.util.List; import org.pitest.functional.SideEffect2; import org.pitest.testapi.Description; import org.pitest.testapi.ResultCollector; import org.pitest.testapi.foreignclassloader.Fail; import org.pitest.testapi.foreignclassloader.Start; import org.pitest.testapi.foreignclassloader.Success; import org.pitest.util.IsolationUtils; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; public class ForeignClassLoaderAdaptingListener implements ITestListener, FailureTracker { private final List<String> events; private Throwable error; private boolean hasHadFailure; public ForeignClassLoaderAdaptingListener(List<String> events) { this.events = events; } @Override public void onFinish(ITestContext arg0) { if (this.error != null) { storeAsString(new Fail(this.error)); } else { storeAsString(new Success()); } } @Override public void onStart(ITestContext arg0) { hasHadFailure = false; storeAsString(new Start()); } @Override public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) { storeAsString(new TestSuccess(arg0.getMethod().getMethodName())); } @Override public void onTestFailure(ITestResult arg0) { this.hasHadFailure = true; this.error = arg0.getThrowable(); storeAsString(new TestFail(arg0.getMethod().getMethodName(), this.error)); } @Override public void onTestSkipped(ITestResult arg0) { storeAsString(new TestSkipped(arg0.getMethod().getMethodName())); } @Override public void onTestStart(ITestResult result) { storeAsString(new TestStart(result.getMethod().getMethodName())); } @Override public void onTestSuccess(ITestResult arg0) { storeAsString(new TestSuccess(arg0.getMethod().getMethodName())); } private void storeAsString( final SideEffect2<ResultCollector, org.pitest.testapi.Description> result) { this.events.add(IsolationUtils.toXml(result)); } @Override public boolean hasHadFailure() { return hasHadFailure; } } class TestStart implements SideEffect2<ResultCollector, org.pitest.testapi.Description> { private final String methodName; TestStart(String methodName) { this.methodName = methodName; } @Override public void apply(ResultCollector rc, Description d) { rc.notifyStart(new Description(this.methodName, d.getFirstTestClass())); } } class TestSuccess implements SideEffect2<ResultCollector, org.pitest.testapi.Description> { private final String methodName; TestSuccess(String methodName) { this.methodName = methodName; } @Override public void apply(ResultCollector rc, Description d) { rc.notifyEnd(new Description(this.methodName, d.getFirstTestClass())); } } class TestFail implements SideEffect2<ResultCollector, org.pitest.testapi.Description> { private final String methodName; private final Throwable throwable; TestFail(String methodName, Throwable throwable) { this.methodName = methodName; this.throwable = throwable; } @Override public void apply(ResultCollector rc, Description d) { rc.notifyEnd(new Description(this.methodName, d.getFirstTestClass()), this.throwable); } } class TestSkipped implements SideEffect2<ResultCollector, org.pitest.testapi.Description> { private final String methodName; TestSkipped(String methodName) { this.methodName = methodName; } @Override public void apply(ResultCollector rc, Description d) { rc.notifySkipped(new Description(this.methodName, d.getFirstTestClass())); } }