package bluej.pkgmgr;
import bluej.Config;
import bluej.collect.DataCollector;
import bluej.debugger.DebuggerTestResult;
import bluej.debugger.jdi.TestResultsWithRunTime;
import bluej.pkgmgr.target.ClassTarget;
import bluej.pkgmgr.target.role.UnitTestClassRole;
import bluej.testmgr.TestDisplayFrame;
import bluej.utility.Debug;
import javafx.application.Platform;
import threadchecker.OnThread;
import threadchecker.Tag;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
| Provide a thread class for running unit tests.
|
| Unit tests are user code so they must be executed on a seperate thread.
| This class provides the means to do this.
|
| There are two primary modes of operation: run a single test (methodname != null),
| and run all tests for a series of ClassTargets.
|
| @author Davin McCall
|
public class TestRunnerThread
extends Thread{
@OnThread(Tag.Worker)
private final Iterator<ClassTarget> testIterator;
private final PkgMgrFrame pmf;
private final String methodName;
private int state;
private final Project project;
| Construct a test runner thread for running multiple tests.
|
@OnThread(Tag.FXPlatform)
public TestRunnerThread(PkgMgrFrame pmf, Iterator<ClassTarget> i)
{
this.pmf = pmf;
this.project = pmf.getProject();
this.methodName = null;
testIterator = i;
state = 0;
}
| Construct a test runner thread for running a single test.
|
@OnThread(Tag.FXPlatform)
public TestRunnerThread(PkgMgrFrame pmf, ClassTarget ct, String methodName)
{
this.pmf = pmf;
this.project = pmf.getProject();
List<ClassTarget> l = new ArrayList<ClassTarget>(1);
l.add(ct);
testIterator = l.iterator();
this.methodName = methodName;
state = 0;
}
@OnThread(value = Tag.Worker, ignoreParent = true)
public void run()
{
while (testIterator.hasNext())
{
ClassTarget ct = testIterator.next();
List<String> allMethods;
if (methodName == null)
{
CompletableFuture<List<String>> methodsFuture = new CompletableFuture<>();
Platform.runLater(() -> startTestFindMethods(ct, methodsFuture));
try
{
allMethods = methodsFuture.get();
}
catch (InterruptedException | ExecutionException e)
{
Debug.reportError(e);
allMethods = Collections.emptyList();
}
}
else
{
allMethods = Arrays.asList(methodName);
}
if (allMethods.size() == 1)
{
TestResultsWithRunTime lastResult = project.getDebugger().runTestMethod(ct.getQualifiedName(), methodName);
Platform.runLater(() -> showNextResult(lastResult.getResults().get(0)));
}
else
{
TestResultsWithRunTime lastResults = project.getDebugger().runTestMethod(ct.getQualifiedName(), null);
for (DebuggerTestResult result : lastResults.getResults())
{
Platform.runLater(() -> showNextResult(result));
}
Platform.runLater(() -> TestDisplayFrame.getTestDisplay()
.setTotalTimeMs(lastResults.getTotalRunTime()));
}
}
Platform.runLater(() -> {
if (methodName == null)
pmf.endTestRun();
});
}
@OnThread(Tag.FXPlatform)
private void showNextResult(DebuggerTestResult lastResult)
{
boolean quiet = methodName != null && lastResult.isSuccess();
TestDisplayFrame.getTestDisplay().addResult(lastResult, quiet);
if (quiet)
pmf.setStatus(methodName + " " + Config.getString("pkgmgr.test.succeeded"));
DataCollector.testResult(pmf.getPackage(), lastResult);
}
@OnThread(Tag.FXPlatform)
private void startTestFindMethods(ClassTarget ct, CompletableFuture<List<String>> methodsFuture)
{
if (ct.isCompiled() && ct.isUnitTest() && ! ct.isAbstract()) {
UnitTestClassRole utcr = (UnitTestClassRole) ct.getRole();
List<String> allMethods = utcr.startRunTest(pmf, ct, TestRunnerThread.this);
if (allMethods == null)
methodsFuture.complete(Collections.emptyList());
else{ methodsFuture.complete(allMethods);
}
}
else {
methodsFuture.complete(Collections.emptyList());
}
}
}
top,
use,
map,
class TestRunnerThread
. TestRunnerThread
. TestRunnerThread
. run
. showNextResult
. startTestFindMethods
176 neLoCode
+ 8 LoComm