/*
* Copyright (c) 2016 RWTH Aachen. All rights reserved.
*
* http://www.se-rwth.de/
*/
package de.monticore.templateclassgenerator.it;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import de.monticore.java.symboltable.JavaMethodSymbol;
import de.monticore.java.symboltable.JavaTypeSymbol;
import de.monticore.symboltable.Scope;
/**
* Tests the correctness of the generated template classes methods
*
* @author Jerome Pfeiffer
*/
public class CorrectnessTest extends AbstractSymtabTest {
private static Path outputDirectory = Paths.get("target/generated-sources/templateClasses");
private static CorrectnessTest theInstance = new CorrectnessTest();
// set once in doSetup
private static Scope symTab = null;
@BeforeClass
public static void setup() {
theInstance.doSetup();
}
private void doSetup() {
symTab = createJavaSymTab(outputDirectory);
}
/**
* Tests completely empty template
*/
@Test
public void testEmptyTemplate() {
JavaTypeSymbol emptyTemplateClass = symTab.<JavaTypeSymbol> resolve(
"_templates.templates.a.EmptyTemplate", JavaTypeSymbol.KIND).orElse(null);
assertNotNull(emptyTemplateClass);
boolean hasCorrectGenerate = false;
boolean hasCorrectToString = false;
List<JavaMethodSymbol> methods = emptyTemplateClass.getMethods();
assertEquals(6, methods.size());
for (JavaMethodSymbol method : methods) {
if (method.getName().equals("generate") && method.getReturnType().getName().equals("void")) {
assertEquals(3, method.getParameters().size());
hasCorrectGenerate = true;
}
if (method.getName().equals("generate") && method.getReturnType().getName().equals("String")) {
assertEquals(1, method.getParameters().size());
hasCorrectToString = true;
}
}
assertTrue(hasCorrectGenerate);
assertTrue(hasCorrectToString);
}
/**
* Tests template with tc.params but without tc.result
*/
@Test
public void testTemplateWithoutResult() {
JavaTypeSymbol templateWithoutResultClass = symTab.<JavaTypeSymbol> resolve(
"_templates.templates.a.TemplateWithoutResult", JavaTypeSymbol.KIND).orElse(null);
assertNotNull(templateWithoutResultClass);
boolean hasCorrectGenerate = false;
boolean hasCorrectToString = false;
List<JavaMethodSymbol> methods = templateWithoutResultClass.getMethods();
assertEquals(6, methods.size());
;
for (JavaMethodSymbol method : methods) {
if (method.getName().equals("generate") && method.getReturnType().getName().equals("void")) {
assertEquals(4, method.getParameters().size());
hasCorrectGenerate = true;
}
if (method.getName().equals("generate") && method.getReturnType().getName().equals("String")) {
assertEquals(2, method.getParameters().size());
hasCorrectToString = true;
}
}
assertTrue(hasCorrectGenerate);
assertTrue(hasCorrectToString);
}
/**
* Template that does not contain a signature, but template code
*/
@Test
public void testTemplateWithoutSignature() {
JavaTypeSymbol templateWithoutSignature = symTab.<JavaTypeSymbol> resolve(
"_templates.templates.a.TemplateWithoutSignature", JavaTypeSymbol.KIND)
.orElse(null);
assertNotNull(templateWithoutSignature);
boolean hasCorrectGenerate = false;
boolean hasCorrectToString = false;
List<JavaMethodSymbol> methods = templateWithoutSignature.getMethods();
assertEquals(6, methods.size());
for (JavaMethodSymbol method : methods) {
if (method.getName().equals("generate") && method.getReturnType().getName().equals("void")) {
assertEquals(3, method.getParameters().size());
hasCorrectGenerate = true;
}
if (method.getName().equals("generate") && method.getReturnType().getName().equals("String")) {
assertEquals(1, method.getParameters().size());
hasCorrectToString = true;
}
}
assertTrue(hasCorrectGenerate);
assertTrue(hasCorrectToString);
}
/**
* Tests template with tc.params and tc.result
*/
@Test
public void testTemplateWithResult() {
JavaTypeSymbol templateWithResult = symTab.<JavaTypeSymbol> resolve(
"_templates.templates.a.TemplateWithResult", JavaTypeSymbol.KIND).orElse(null);
assertNotNull(templateWithResult);
boolean hasCorrectGenerate = false;
boolean hasCorrectToString = false;
boolean hasCorrectToResult = false;
List<JavaMethodSymbol> methods = templateWithResult.getMethods();
assertEquals(8, methods.size());
for (JavaMethodSymbol method : methods) {
if (method.getName().equals("generate") && method.getReturnType().getName().equals("void")) {
assertEquals(4, method.getParameters().size());
hasCorrectGenerate = true;
}
if (method.getName().equals("generate") && method.getReturnType().getName().equals("String")) {
assertEquals(2, method.getParameters().size());
hasCorrectToString = true;
}
if (method.getName().equals("generate") && method.getReturnType().getName().equals("Integer")) {
assertEquals(3, method.getParameters().size());
hasCorrectToResult = true;
}
}
assertTrue(hasCorrectGenerate);
assertTrue(hasCorrectToString);
assertTrue(hasCorrectToResult);
}
}