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

View File

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