TestPrinter.java

package edu.udel.cis.vsl.sarl.util.autotg;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.LinkedList;
import java.util.List;

import edu.udel.cis.vsl.sarl.IF.expr.SymbolicExpression.SymbolicOperator;
import edu.udel.cis.vsl.sarl.IF.type.SymbolicType;
import edu.udel.cis.vsl.sarl.IF.type.SymbolicType.SymbolicTypeKind;

public class TestPrinter {
	/* Constants */
	final static public String UNIVERSE = "universe";
	final static public String DEBUG = "debug";
	final static public String OUT = "out";
	// Test File Constants
	final static private String CLASS_DIR = "test/autogen/";
	final static private String CLASS_PACKAGE_DEFAULT = "edu/udel/cis/vsl/sarl/autogen/";
	final static private String CLASS_NAME_DEFAULT = "AutoGenTest";
	final static private String CLASS_FILE_SUFFIX = ".java";
	// Test Class Constants
	final static private String PACKAGE_PREFIX = "package ";
	final static private String PACKAGE_SUFFIX = "; ";
	final static private String CLASS_HEADER_PREFIX = "public class ";
	final static private String CLASS_HEADER_SUFFIX = " {";
	final static private String CLASS_END = "} // Class End";
	// Test Initialization Constants
	final static private String CLASS_INIT_DEBUG = "final static private boolean "
			+ DEBUG + " = false;";
	final static private String CLASS_INIT_OUT = "final static private PrintStream "
			+ OUT + " = System.out;";
	final static private String CLASS_INIT_UNIV = "private static SymbolicUniverse "
			+ UNIVERSE + " = SARL.newStandardUniverse();";
	final static private String BLANK_LINE = "";
	// Test Unit Constants
	final static private String TEST_NAME_DEFAULT = "";
	final static private String TEST_CONTENT_DEFAULT = "// This uint test is automatically generated.";
	final static private String TEST_ANNO = "@Test";
	final static private String TEST_PREFIX = "public void AutoGenTest";
	final static private String TEST_SUFFIX = "() {";
	final static private String TEST_END = "} // Test End";

	private int unitTestCounter = 0;

	private LinkedList<String> testContent = new LinkedList<String>();
	private File testFile = new File(CLASS_DIR + CLASS_PACKAGE_DEFAULT
			+ CLASS_NAME_DEFAULT + CLASS_FILE_SUFFIX);

	private void createTestFile(String packageName, String className) {
		String packagePath = CLASS_DIR + CLASS_PACKAGE_DEFAULT;

		this.testFile = new File(packagePath + className + CLASS_FILE_SUFFIX);
		try {
			new File(packagePath).mkdirs();
			if (testFile.exists())
				testFile.delete();
			testFile.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private LinkedList<String> genClassHeader(String packageName,
			String className) {
		LinkedList<String> header = new LinkedList<String>();

		header.add(PACKAGE_PREFIX + packageName.replace('/', '.').substring(0,
				packageName.length() - 1) + PACKAGE_SUFFIX);
		header.add(BLANK_LINE);
		header.add(CLASS_HEADER_PREFIX + className + CLASS_HEADER_SUFFIX);
		header.add(BLANK_LINE);
		header.add(CLASS_INIT_DEBUG);
		header.add(CLASS_INIT_OUT);
		header.add(CLASS_INIT_UNIV);
		header.add(BLANK_LINE);
		return header;
	}

	private String genTestNumber() {
		if (unitTestCounter < 10)
			return "___" + unitTestCounter + "_";
		else if (unitTestCounter < 100)
			return "__" + unitTestCounter + "_";
		else
			return "_" + unitTestCounter + "_";
	}

	protected void genTestClass(String className, List<String> tests) {
		LinkedList<String> classContent = new LinkedList<String>();

		if (className.length() < 1)
			className = CLASS_NAME_DEFAULT;
		createTestFile(CLASS_PACKAGE_DEFAULT, className);
		classContent.addAll(genClassHeader(CLASS_PACKAGE_DEFAULT, className));
		classContent.addAll(tests);
		classContent.add(CLASS_END);
		try {
			Files.write(testFile.toPath(), classContent,
					Charset.defaultCharset());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	protected List<String> genUnitTest(String testName) {
		LinkedList<String> unitTest = new LinkedList<String>();
		String header = TEST_PREFIX + genTestNumber() + testName + TEST_SUFFIX;

		unitTest.add(TEST_ANNO);
		unitTest.add(header);
		unitTest.add(TEST_CONTENT_DEFAULT);
		unitTest.addAll(testContent);
		unitTest.add(TEST_END);
		unitTestCounter++;
		return unitTest;
	}

	@SuppressWarnings("incomplete-switch")
	protected void genExpression(String resName, SymbolicOperator op,
			String... operands) {
		String lhs = resName + " = ";

		switch (op) {
		case ADD:
			testContent.add(lhs + UNIVERSE + ".add(" + operands[0] + ", "
					+ operands[1] + ");");
			break;
		case EQUALS:
			testContent.add(lhs + UNIVERSE + ".equals(" + operands[0] + ", "
					+ operands[1] + ");");
			break;
		case SUBTRACT:
			testContent.add(lhs + UNIVERSE + ".subtract(" + operands[0] + ", "
					+ operands[1] + ");");
			break;
		case MULTIPLY:
			testContent.add(lhs + UNIVERSE + ".multiply(" + operands[0] + ", "
					+ operands[1] + ");");
			break;
		}
	}

	protected void genVariableDeclaration(SymbolicType type, String varName,
			String typeString) {
		String symConstText = "SymbolicExpression";
		String numericSymConstText = "NumericExpression";
		String symType = symConstText;

		if (type.typeKind() == SymbolicTypeKind.INTEGER
				|| type.typeKind() == SymbolicTypeKind.REAL)
			symType = numericSymConstText;

		String cast = "(" + symType + ")";
		String result = symType + " " + varName + " = " + cast + UNIVERSE
				+ ".symbolicConstant(" + UNIVERSE + ".stringObject(\"" + varName
				+ "\"), " + typeString + ");";

		testContent.add(result);
	}

	protected void genTypeDeclatation(String type, String typeName) {

	}

	protected void callValid(String resultTypeLHS, String context,
			String predicate) {
		String result = resultTypeLHS + " = " + UNIVERSE + ".reasoner("
				+ context + ").valid(" + predicate + ").getResultType();";

		testContent.add(result);
	}

	static public void main(String args[]) {
		TestPrinter tp = new TestPrinter();

		tp.genTestClass(CLASS_NAME_DEFAULT, tp.genUnitTest(TEST_NAME_DEFAULT));
		System.out.println("Terminated");
	}
}