package ch.vorburger.mtemplating;
import static org.hamcrest.CoreMatchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import org.junit.Ignore;
import org.junit.Test;
import ch.vorburger.mtemplating.test.gen.SomeTestText;
/**
* TODO Doc
*
* This test must be run twice, as in the first pass it generates code,
* which it tests in the second pass. On first run it test the gen. code
* from the previous run.
*
* @author Michael Vorburger
*/
public class GeneratorGeneratorTest {
@Test
public void testGeneratingSomeTextTemplateEngine() throws IOException {
File outputBaseDir = new File("target/generated-sources/mtemplates/");
iMustBeMovedSomewhereElseLater("/SomeTestText.txt.template", SomeTestTemplateInput.class, outputBaseDir, "ch.vorburger.mtemplating.test.gen");
// TODO now assert that gen. code is compilable (via Compiler API)
}
// TODO Refactor this!
private void iMustBeMovedSomewhereElseLater(String classpathResourcePath, Class<?> parameterClass, File outputBaseDirectory, String packageName) throws IOException {
InputStream template = getClass().getResourceAsStream(classpathResourcePath);
Reader reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(template)));
Template t = new Template(parameterClass, reader);
t.className = classpathResourcePath.substring(classpathResourcePath.lastIndexOf('/') + 1, classpathResourcePath.indexOf('.'));
t.dottedPackageName = packageName;
outputBaseDirectory.mkdirs();
File outputPackageDir = new File(outputBaseDirectory, t.dottedPackageName.replace('.', '/'));
outputPackageDir.mkdirs();
File outputFile = new File(outputPackageDir, t.className + ".java");
Writer w = new FileWriter(outputFile);
GeneratorGenerator.generateIt(w, t);
template.close();
reader.close();
w.close();
}
@Test
public void testUsingThePreviouslyGeneratedSomeTextTemplateEngine() throws IOException {
SomeTestTemplateInput i = new SomeTestTemplateInput();
i.someNumber = 1234;
i.helloMessage = "Saluton!";
Writer w = new StringWriter(); // TODO org.apache.commons.io.output.StringBuilderWriter would be more efficient
SomeTestText.generate(w, i);
String r = w.toString();
// System.out.println(r);
assertTrue(r.startsWith("I am static text and have been generated by a template."));
assertTrue(r.contains("Saluton!, I am dynamic and have been passed into the template instance."));
assertTrue(r.contains("* 1. Number 1234 (dynamically passed into template)"));
assertTrue(r.contains("* 2. Number 1234 (dynamically passed into template)"));
}
@Test // TODO use this for the GeneratorGenerator directly, remove SomeTestClass.java.template?
@Ignore
public void testGeneratingSomeJavaClassTemplateEngine() throws IOException {
File outputBaseDir = new File("target/generated-sources/mtemplates/");
iMustBeMovedSomewhereElseLater("/SomeTestClass.java.template", SomeTestTemplateInput.class, outputBaseDir, "ch.vorburger.mtemplating.test.gen");
}
@Test
@Ignore // TODO Implement
public void testSimpleOnTheFlyTemplate() throws IOException {
// Writer w = new StringWriter(); // org.apache.commons.io.output.StringBuilderWriter would be more efficient
// TODO Feed that into compiler, without writing file, and execute it
}
}