Skip to content

Commit

Permalink
Add TestGenWriterTest, use LF line endings
Browse files Browse the repository at this point in the history
  • Loading branch information
yurloc authored and ge0ffrey committed Jan 12, 2017
1 parent 13eb557 commit 0da0b77
Show file tree
Hide file tree
Showing 14 changed files with 269 additions and 81 deletions.
Expand Up @@ -34,8 +34,9 @@

public class TestGenDroolsScoreDirector<Solution_> extends DroolsScoreDirector<Solution_> {

private static final String TEST_CLASS_NAME = "DroolsReproducerTest";
private final TestGenKieSessionJournal journal = new TestGenKieSessionJournal();
private final File testFile = new File("DroolsReproducerTest.java");
private final File testFile = new File(TEST_CLASS_NAME + ".java");
private final TestGenTestWriter writer = new TestGenTestWriter();

public TestGenDroolsScoreDirector(
Expand All @@ -45,6 +46,7 @@ public TestGenDroolsScoreDirector(
List<String> scoreDrlList,
List<File> scoreDrlFileList) {
super(scoreDirectorFactory, locatorEnabled, constraintMatchEnabledPreference);
writer.setClassName(TEST_CLASS_NAME);
writer.setScoreDefinition(scoreDirectorFactory.getScoreDefinition());
writer.setConstraintMatchEnabled(constraintMatchEnabledPreference);
writer.setScoreDrlList(scoreDrlList);
Expand Down
Expand Up @@ -21,6 +21,8 @@
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
Expand All @@ -40,24 +42,33 @@ class TestGenTestWriter {
private static final Logger logger = LoggerFactory.getLogger(TestGenTestWriter.class);
private StringBuilder sb;
private TestGenKieSessionJournal journal;
private List<String> scoreDrlList;
private List<File> scoreDrlFileList;
private String className;
private List<String> scoreDrlList = Collections.emptyList();
private List<File> scoreDrlFileList = Collections.emptyList();
private ScoreDefinition<?> scoreDefinition;
private boolean constraintMatchEnabled;
private TestGenCorruptedScoreException scoreEx;

public void print(TestGenKieSessionJournal journal, Writer w) {
print(journal);
writeTest(w);
}

public void print(TestGenKieSessionJournal journal, File testFile) {
print(journal);
writeTestFile(testFile);
}

private void print(TestGenKieSessionJournal journal) {
this.journal = journal;
this.sb = new StringBuilder(1 << 15); // 2^15 initial capacity
printInit();
printSetup();
printTest();
writeTestFile(testFile);
}

private void printInit() {
sb.append("package org.optaplanner.testgen;").append(System.lineSeparator())
.append(System.lineSeparator());
sb.append("package org.optaplanner.testgen;\n\n");
SortedSet<String> imports = new TreeSet<>();
imports.add("org.junit.Before");
imports.add("org.junit.Test");
Expand All @@ -83,104 +94,91 @@ private void printInit() {
}

for (String cls : imports) {
sb.append(String.format("import %s;%n", cls));
sb.append(String.format("import %s;\n", cls));
}
sb.append(System.lineSeparator())
.append("public class DroolsReproducerTest {").append(System.lineSeparator())
.append(System.lineSeparator())
.append(" KieContainer kieContainer;").append(System.lineSeparator())
.append(" KieSession kieSession;").append(System.lineSeparator());
sb.append("\n")
.append("public class ").append(className).append(" {\n\n")
.append(" KieContainer kieContainer;\n")
.append(" KieSession kieSession;\n");
if (scoreDefinition != null) {
sb
.append(" ScoreHolder scoreHolder = new ")
.append(scoreDefinition.getClass().getSimpleName())
.append("().buildScoreHolder(")
.append(constraintMatchEnabled)
.append(");").append(System.lineSeparator());
sb.append(String.format(" ScoreHolder scoreHolder = new %s().buildScoreHolder(%s);\n",
scoreDefinition.getClass().getSimpleName(), constraintMatchEnabled));
}

for (TestGenFact fact : journal.getFacts()) {
fact.printInitialization(sb);
}
sb.append(System.lineSeparator());
sb.append("\n");
}

private void printSetup() {
sb
.append(" @Before").append(System.lineSeparator())
.append(" public void setUp() {").append(System.lineSeparator())
.append(" KieServices kieServices = KieServices.Factory.get();").append(System.lineSeparator())
.append(" KieFileSystem kfs = kieServices.newKieFileSystem();").append(System.lineSeparator());
.append(" @Before\n")
.append(" public void setUp() {\n")
.append(" KieServices kieServices = KieServices.Factory.get();\n")
.append(" KieFileSystem kfs = kieServices.newKieFileSystem();\n");
scoreDrlFileList.forEach(file -> {
sb
.append(" kfs.write(kieServices.getResources()").append(System.lineSeparator())
.append(" kfs.write(kieServices.getResources()\n")
.append(" .newFileSystemResource(new File(\"").append(file.getAbsoluteFile())
.append("\"), \"UTF-8\"));").append(System.lineSeparator());
.append("\"), \"UTF-8\"));\n");
});
scoreDrlList.forEach(drl -> {
sb
.append(" kfs.write(kieServices.getResources()").append(System.lineSeparator())
.append(" .newClassPathResource(\"").append(drl).append("\"));")
.append(System.lineSeparator());
.append(" kfs.write(kieServices.getResources()\n")
.append(" .newClassPathResource(\"").append(drl).append("\"));\n");
});
sb
.append(" kieServices.newKieBuilder(kfs).buildAll();").append(System.lineSeparator())
.append(" kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());").append(System.lineSeparator())
.append(" kieSession = kieContainer.newKieSession();").append(System.lineSeparator())
.append(System.lineSeparator());
.append(" kieServices.newKieBuilder(kfs).buildAll();\n")
.append(" kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());\n")
.append(" kieSession = kieContainer.newKieSession();\n\n");
if (scoreDefinition != null) {
sb.append(" kieSession.setGlobal(\"").append(DroolsScoreDirector.GLOBAL_SCORE_HOLDER_KEY)
.append("\", scoreHolder);")
.append(System.lineSeparator())
.append(System.lineSeparator());
.append("\", scoreHolder);\n\n");
}
for (TestGenFact fact : journal.getFacts()) {
fact.printSetup(sb);
}
sb.append(System.lineSeparator());
sb.append("\n");
for (TestGenKieSessionOperation insert : journal.getInitialInserts()) {
insert.print(sb);
}
sb.append(" }")
.append(System.lineSeparator())
.append(System.lineSeparator());
sb.append(" }\n\n");
}

private void printTest() {
sb
.append(" @Test").append(System.lineSeparator())
.append(" public void test() {").append(System.lineSeparator());
.append(" @Test\n")
.append(" public void test() {\n");
for (TestGenKieSessionOperation op : journal.getMoveOperations()) {
op.print(sb);
}
if (scoreEx != null) {
sb
.append(" // This is the corrupted score, just to make sure the bug is reproducible")
.append(System.lineSeparator())
.append(" // This is the corrupted score, just to make sure the bug is reproducible\n")
.append(" Assert.assertEquals(\"").append(scoreEx.getWorkingScore())
.append("\", scoreHolder.extractScore(0).toString());").append(System.lineSeparator());
.append("\", scoreHolder.extractScore(0).toString());\n");
// demonstrate the uncorrupted score
sb
.append(" kieSession = kieContainer.newKieSession();").append(System.lineSeparator())
.append(" kieSession = kieContainer.newKieSession();\n")
.append(" scoreHolder = new ").append(scoreDefinition.getClass().getSimpleName())
.append("().buildScoreHolder(").append(constraintMatchEnabled).append(");").append(System.lineSeparator())
.append("().buildScoreHolder(").append(constraintMatchEnabled).append(");\n")
.append(" kieSession.setGlobal(\"").append(DroolsScoreDirector.GLOBAL_SCORE_HOLDER_KEY)
.append("\", scoreHolder);").append(System.lineSeparator());
.append("\", scoreHolder);\n");

sb.append(System.lineSeparator()).append(System.lineSeparator())
.append(" // Insert everything into a fresh session to see the uncorrupted score")
.append(System.lineSeparator());
sb
.append("\n\n // Insert everything into a fresh session to see the uncorrupted score\n");
for (TestGenKieSessionOperation insert : journal.getInitialInserts()) {
insert.print(sb);
}
sb
.append(" kieSession.fireAllRules();").append(System.lineSeparator())
.append(" kieSession.fireAllRules();\n")
.append(" Assert.assertEquals(\"").append(scoreEx.getUncorruptedScore())
.append("\", scoreHolder.extractScore(0).toString());").append(System.lineSeparator());
.append("\", scoreHolder.extractScore(0).toString());\n");
}
sb
.append(" }").append(System.lineSeparator())
.append("}").append(System.lineSeparator());
.append(" }\n")
.append("}\n");
}

private void writeTestFile(File file) {
Expand All @@ -197,26 +195,34 @@ private void writeTestFile(File file) {
logger.error("Cannot open test file: " + file.toString(), ex);
return;
}
OutputStreamWriter out;
OutputStreamWriter osw;
try {
out = new OutputStreamWriter(fos, "UTF-8");
osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException ex) {
logger.error("Can't open", ex);
return;
}
writeTest(osw);
}

private void writeTest(Writer w) {
try {
out.append(sb);
w.append(sb);
} catch (IOException ex) {
logger.error("Can't write", ex);
} finally {
try {
out.close();
w.close();
} catch (IOException ex) {
logger.error("Can't close", ex);
}
}
}

public void setClassName(String className) {
this.className = className;
}

public void setScoreDrlList(List<String> scoreDrlList) {
this.scoreDrlList = scoreDrlList == null ? Collections.emptyList() : scoreDrlList;
}
Expand Down
Expand Up @@ -62,7 +62,7 @@ void print(StringBuilder sb) {
valueProvider.printSetup(sb);
// null original value means the field is uninitialized so there's no need to .set(null);
if (valueProvider.get() != null) {
sb.append(String.format(" %s.%s(%s);%n",
sb.append(String.format(" %s.%s(%s);\n",
fact.getVariableName(), setter.getName(), valueProvider.toString()));
}
}
Expand Down
Expand Up @@ -57,10 +57,10 @@ public List<Class<?>> getImports() {
@Override
public void printSetup(StringBuilder sb) {
String e = ((Class<?>) typeArgument).getSimpleName();
sb.append(String.format(" ArrayList<%s> %s = new ArrayList<%s>();%n", e, identifier, e));
sb.append(String.format(" ArrayList<%s> %s = new ArrayList<%s>();\n", e, identifier, e));
for (Object item : value) {
sb.append(String.format(" //%s%n", item));
sb.append(String.format(" %s.add(%s);%n", identifier, existingInstances.get(item)));
sb.append(String.format(" //%s\n", item));
sb.append(String.format(" %s.add(%s);\n", identifier, existingInstances.get(item)));
}
}

Expand Down
Expand Up @@ -63,10 +63,10 @@ public List<Class<?>> getImports() {
public void printSetup(StringBuilder sb) {
String k = ((Class<?>) typeArguments[0]).getSimpleName();
String v = ((Class<?>) typeArguments[1]).getSimpleName();
sb.append(String.format(" HashMap<%s, %s> %s = new HashMap<%s, %s>();%n", k, v, identifier, k, v));
sb.append(String.format(" HashMap<%s, %s> %s = new HashMap<%s, %s>();\n", k, v, identifier, k, v));
for (Map.Entry<? extends Object, ? extends Object> entry : value.entrySet()) {
sb.append(String.format(" //%s => %s%n", entry.getKey(), entry.getValue()));
sb.append(String.format(" %s.put(%s, %s);%n", identifier, existingInstances.get(entry.getKey()), existingInstances.get(entry.getValue())));
sb.append(String.format(" //%s => %s\n", entry.getKey(), entry.getValue()));
sb.append(String.format(" %s.put(%s, %s);\n", identifier, existingInstances.get(entry.getKey()), existingInstances.get(entry.getValue())));
}
}

Expand Down
Expand Up @@ -59,10 +59,10 @@ public List<Class<?>> getImports() {
@Override
public void printSetup(StringBuilder sb) {
String e = ((Class<?>) typeArgument).getSimpleName();
sb.append(String.format(" HashSet<%s> %s = new HashSet<%s>();%n", e, identifier, e));
sb.append(String.format(" HashSet<%s> %s = new HashSet<%s>();\n", e, identifier, e));
for (Object item : value) {
sb.append(String.format(" //%s%n", item));
sb.append(String.format(" %s.add(%s);%n", identifier, existingInstances.get(item)));
sb.append(String.format(" //%s\n", item));
sb.append(String.format(" %s.add(%s);\n", identifier, existingInstances.get(item)));
}
}

Expand Down
Expand Up @@ -161,18 +161,18 @@ public void reset() {
@Override
public void printInitialization(StringBuilder sb) {
if (instance.getClass().isEnum()) {
sb.append(String.format(" private final %s %s = %s.%s;%n",
sb.append(String.format(" private final %s %s = %s.%s;\n",
instance.getClass().getSimpleName(), variableName, instance.getClass().getSimpleName(),
((Enum) instance).name()));
} else {
sb.append(String.format(" private final %s %s = new %s();%n",
sb.append(String.format(" private final %s %s = new %s();\n",
instance.getClass().getSimpleName(), variableName, instance.getClass().getSimpleName()));
}
}

@Override
public void printSetup(StringBuilder sb) {
sb.append(String.format(" //%s%n", instanceToString));
sb.append(String.format(" //%s\n", instanceToString));
fields.forEach(f -> f.print(sb));
}

Expand Down
Expand Up @@ -35,8 +35,8 @@ public void invoke(KieSession kieSession) {

@Override
public void print(StringBuilder sb) {
sb.append(String.format(" //%s%n", this));
sb.append(String.format(" kieSession.delete(kieSession.getFactHandle(%s), %s);", entity, entity));
sb.append(String.format(" //%s\n", this));
sb.append(String.format(" kieSession.delete(kieSession.getFactHandle(%s));\n", entity));
}

@Override
Expand Down
Expand Up @@ -36,8 +36,8 @@ public void invoke(KieSession kieSession) {

@Override
public void print(StringBuilder sb) {
sb.append(String.format(" //%s%n", this));
sb.append(String.format(" kieSession.fireAllRules();%n"));
sb.append(String.format(" //%s\n", this));
sb.append(String.format(" kieSession.fireAllRules();\n"));
}

@Override
Expand Down
Expand Up @@ -39,8 +39,8 @@ public void invoke(KieSession kieSession) {

@Override
public void print(StringBuilder sb) {
sb.append(String.format(" //%s%n", this));
sb.append(String.format(" kieSession.insert(%s);%n", fact));
sb.append(String.format(" //%s\n", this));
sb.append(String.format(" kieSession.insert(%s);\n", fact));
}

@Override
Expand Down
Expand Up @@ -74,9 +74,9 @@ public void invoke(KieSession kieSession) {

@Override
public void print(StringBuilder sb) {
sb.append(String.format(" //%s%n", this));
sb.append(String.format(" %s.%s(%s);%n", entity, setterName, value));
sb.append(String.format(" kieSession.update(kieSession.getFactHandle(%s), %s);%n", entity, entity));
sb.append(String.format(" //%s\n", this));
sb.append(String.format(" %s.%s(%s);\n", entity, setterName, value));
sb.append(String.format(" kieSession.update(kieSession.getFactHandle(%s), %s);\n", entity, entity));
}

@Override
Expand Down

0 comments on commit 0da0b77

Please sign in to comment.