package org.test4j.spec.util;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.test4j.spec.inner.IScenarioStep;
import org.test4j.spec.scenario.JSpecScenario;
import org.test4j.spec.scenario.step.StepMethod;
import org.test4j.tools.commons.StringHelper;
/**
* java代码生成器
*
* @author darui.wudr 2012-6-28 下午3:17:43
*/
public class JavaGenerator {
/**
* 根据场景列表生成TestNg java代码
*
* @param javaClaz 要生成的java文件类名(全称)
* @param scenarioLists
* @return
*/
public static String generateTestNgTestJava(String claz, List<JSpecScenario> scenarioLists) {
if (claz == null) {
throw new RuntimeException("the test java name can't be null!");
}
int index = claz.lastIndexOf('.');
String name = claz;
String pack = "";
if (index > 0) {
name = claz.substring(index + 1);
pack = claz.substring(0, index);
}
StringBuilder java = new StringBuilder("");
if (StringHelper.isEmpty(pack) == false) {
java.append("package ").append(pack).append(";\n");
java.append("\n");
}
java.append("import org.test4j.spec.JSpec;\n");
java.append("import org.testng.annotations.Test;\n");
java.append("import org.test4j.spec.step.JSpecScenario;\n");
java.append("import org.test4j.spec.annotations.Given;\n");
java.append("import org.test4j.spec.annotations.When;\n");
java.append("import org.test4j.spec.annotations.Then;\n");
java.append("\n");
java.append("public class ").append(name).append(" extends JSpec {\n");
// buff.append("\t@Override\n");
java.append("\t@Test(dataProvider = \"story\", groups = \"jspec\")\n");
java.append("\tpublic void runStory(JSpecScenario scenario) throws Exception {\n");
java.append("\t\tthis.run(scenario);\n");
java.append("\t}\n");
Set<StepMethod> existed = new HashSet<StepMethod>();
for (JSpecScenario scenario : scenarioLists) {
generateTestMethod(java, existed, scenario);
}
java.append("}");
return java.toString();
}
private static void generateTestMethod(StringBuilder java, Set<StepMethod> existed, JSpecScenario scenario) {
List<IScenarioStep> steps = scenario.getSteps();
for (IScenarioStep step : steps) {
StepMethod method = new StepMethod(step);
if (existed.contains(method)) {
continue;
}
existed.add(method);
String code = method.generateMethodJava();
java.append(code);
}
}
}