package be.klak.junit.jasmine; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import org.junit.runner.Description; import org.mozilla.javascript.NativeArray; import org.mozilla.javascript.NativeObject; import be.klak.rhino.RhinoContext; class JasmineJSSuiteConverter { private final RhinoContext context; public JasmineJSSuiteConverter(RhinoContext context) { this.context = context; } public JasmineDescriptions convertToJunitDescriptions(Class testClass, NativeArray baseSuites) { Description rootDescription = Description.createSuiteDescription(testClass); List specs = convertSuiteArrayToDescriptions(baseSuites, rootDescription, new ArrayList()); return new JasmineDescriptions(rootDescription, specs); } private List convertSuiteArrayToDescriptions(NativeArray suiteArray, Description rootDescription, List processed) { List specs = new ArrayList(); for (Object idObj : suiteArray.getIds()) { NativeObject suite = (NativeObject) suiteArray.get((Integer) idObj, suiteArray); 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"); specs.addAll(convertSuiteArrayToDescriptions(subSuites, suiteDescription, processed)); } } return specs; } private Description addSuiteToDescription(Description description, List processed, String suiteName) { processed.add(suiteName); Description suiteDescription = Description.createSuiteDescription(suiteName, (Annotation[]) null); description.addChild(suiteDescription); return suiteDescription; } private List convertToJunitDescription(NativeObject suite, Description description) { List specsMap = new ArrayList(); 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.add(jasmineSpec); description.addChild(jasmineSpec.getDescription()); } return specsMap; } }