now builds test descriptions recursively

This commit is contained in:
Wouter Groeneveld 2011-06-27 10:05:01 +02:00
parent 7ea8dc7ce4
commit 45d32509ef
3 changed files with 194 additions and 204 deletions

View File

@ -1,40 +1,24 @@
package be.klak.junit.jasmine;
import java.util.Collection;
import java.util.Map;
import org.junit.runner.Description;
import be.klak.rhino.RhinoContext;
class JasmineDescriptions {
private final Description rootDescription;
private final Map<String, JasmineSpec> specsMap;
private final RhinoContext rhinoContext;
private final Collection<JasmineSpec> specs;
JasmineDescriptions(Description rootDescription, Map<String, JasmineSpec> specsMap, RhinoContext context) {
public JasmineDescriptions(Description rootDescription, Collection<JasmineSpec> specs) {
this.rootDescription = rootDescription;
this.specsMap = specsMap;
this.rhinoContext = context;
this.specs = specs;
}
public Description getRootDescription() {
return rootDescription;
}
public Collection<JasmineSpec> getAllSpecs() {
return specsMap.values();
public Collection<JasmineSpec> getSpecs() {
return specs;
}
public void executeSpec(Description description) {
getSpec(description).execute(rhinoContext);
}
public JasmineSpec getSpec(Description description) {
return specsMap.get(description.getDisplayName());
}
}

View File

@ -1,9 +1,8 @@
package be.klak.junit.jasmine;
import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import org.junit.runner.Description;
import org.mozilla.javascript.NativeArray;
@ -11,45 +10,54 @@ import org.mozilla.javascript.NativeObject;
import be.klak.rhino.RhinoContext;
public class JasmineJSSuiteConverter {
class JasmineJSSuiteConverter {
private final NativeArray baseSuites;
private final RhinoContext context;
JasmineJSSuiteConverter(NativeArray baseSuites, RhinoContext context) {
this.baseSuites = baseSuites;
public JasmineJSSuiteConverter(RhinoContext context) {
this.context = context;
}
public JasmineDescriptions convertToJunitDescriptions(Class<?> testClass) {
public JasmineDescriptions convertToJunitDescriptions(Class<?> testClass, NativeArray baseSuites) {
Description rootDescription = Description.createSuiteDescription(testClass);
Map<String, JasmineSpec> specsMap = convertSuiteArrayToDescriptions(this.baseSuites, rootDescription);
return new JasmineDescriptions(rootDescription, specsMap, context);
List<JasmineSpec> specs = convertSuiteArrayToDescriptions(baseSuites, rootDescription, new ArrayList<String>());
return new JasmineDescriptions(rootDescription, specs);
}
private Map<String, JasmineSpec> convertSuiteArrayToDescriptions(NativeArray suiteArray, Description rootDescription) {
Map<String, JasmineSpec> specsMap = new HashMap<String, JasmineSpec>();
private List<JasmineSpec> convertSuiteArrayToDescriptions(NativeArray suiteArray, Description rootDescription,
List<String> processed) {
List<JasmineSpec> specs = new ArrayList<JasmineSpec>();
for (Object idObj : suiteArray.getIds()) {
NativeObject suite = (NativeObject) suiteArray.get((Integer) idObj, suiteArray);
Description suiteDescription = Description
.createSuiteDescription((String) suite.get("description", suite), (Annotation[]) null);
rootDescription.addChild(suiteDescription);
specsMap.putAll(convertToJunitDescription(suite, suiteDescription));
String description = (String) suite.get("description", suite);
if (!processed.contains(description)) {
Description suiteDescription = addSuiteToDescription(rootDescription, processed, description);
specs.addAll(convertToJunitDescription(suite, suiteDescription));
NativeArray subSuites = (NativeArray) context.executeFunction(suite, "suites");
convertSuiteArrayToDescriptions(subSuites, suiteDescription, processed);
}
}
return specsMap;
return specs;
}
private Map<String, JasmineSpec> convertToJunitDescription(NativeObject suite, Description description) {
Map<String, JasmineSpec> specsMap = new HashMap<String, JasmineSpec>();
private Description addSuiteToDescription(Description description, List<String> processed, String suiteName) {
processed.add(suiteName);
Description suiteDescription = Description.createSuiteDescription(suiteName, (Annotation[]) null);
description.addChild(suiteDescription);
return suiteDescription;
}
private List<JasmineSpec> convertToJunitDescription(NativeObject suite, Description description) {
List<JasmineSpec> specsMap = new ArrayList<JasmineSpec>();
NativeArray specsArray = (NativeArray) context.executeFunction(suite, "specs");
for (Object idObj : specsArray.getIds()) {
NativeObject spec = (NativeObject) specsArray.get((Integer) idObj, specsArray);
JasmineSpec jasmineSpec = new JasmineSpec(spec);
specsMap.put(jasmineSpec.toString(), jasmineSpec);
specsMap.add(jasmineSpec);
description.addChild(jasmineSpec.getDescription());
}

View File

@ -3,7 +3,6 @@ package be.klak.junit.jasmine;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import org.apache.commons.lang.StringUtils;
import org.junit.After;
import org.junit.Before;
@ -15,7 +14,6 @@ import org.mozilla.javascript.tools.debugger.Main;
import be.klak.rhino.RhinoContext;
public class JasmineTestRunner extends Runner {
private static final int SLEEP_TIME_MILISECONDS = 50;
@ -90,7 +88,7 @@ public class JasmineTestRunner extends Runner {
private JasmineDescriptions getJasmineDescriptions() {
if (this.jasmineSuite == null) {
NativeArray baseSuites = (NativeArray) rhinoContext.evalJS("jasmine.getEnv().currentRunner().suites()");
this.jasmineSuite = new JasmineJSSuiteConverter(baseSuites, rhinoContext).convertToJunitDescriptions(testClass);
this.jasmineSuite = new JasmineJSSuiteConverter(rhinoContext).convertToJunitDescriptions(testClass, baseSuites);
}
return this.jasmineSuite;
}
@ -104,7 +102,7 @@ public class JasmineTestRunner extends Runner {
public void run(RunNotifier notifier) {
generateSpecRunnerIfNeeded();
for (JasmineSpec spec : getJasmineDescriptions().getAllSpecs()) {
for (JasmineSpec spec : getJasmineDescriptions().getSpecs()) {
Object testClassInstance = createTestClassInstance();
fireMethodsWithSpecifiedAnnotationIfAny(testClassInstance, Before.class);