package me.tomassetti.turin.compiler; import me.tomassetti.turin.classloading.TurinClassLoader; import me.tomassetti.turin.classloading.ClassFileDefinition; import me.tomassetti.turin.parser.Parser; import me.tomassetti.turin.parser.ast.TurinFile; import org.junit.Test; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import static org.junit.Assert.*; public class InitialValuesCompilationTest extends AbstractCompilerTest { @Test public void theConstructorDoNotConsiderThePropertiesWithInitialValues() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/initial_values.to")); // generate bytecode Compiler instance = new Compiler(getResolverFor(turinFile), new Compiler.Options()); List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, new MyErrorCollector()); assertEquals(2, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class typeClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(), classFileDefinitions.get(0).getBytecode()); saveClassFile(classFileDefinitions.get(0), "tmp"); assertEquals(1, typeClass.getConstructors().length); assertEquals(2, typeClass.getConstructors()[0].getParameterCount()); assertEquals(int.class, typeClass.getConstructors()[0].getParameterTypes()[0]); assertEquals(int.class, typeClass.getConstructors()[0].getParameterTypes()[1]); } @Test public void initialValuesAreSetCorrectly() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/initial_values.to")); // generate bytecode Compiler instance = new Compiler(getResolverFor(turinFile), new Compiler.Options()); List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, new MyErrorCollector()); assertEquals(2, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class typeClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(), classFileDefinitions.get(0).getBytecode()); Class functionClass = turinClassLoader.addClass(classFileDefinitions.get(1).getName(), classFileDefinitions.get(1).getBytecode()); Method invoke = functionClass.getMethod("invoke"); Object result = invoke.invoke(null); assertEquals(1, typeClass.getMethod("getA").invoke(result)); assertEquals(10, typeClass.getMethod("getB").invoke(result)); assertEquals(12, typeClass.getMethod("getC").invoke(result)); assertEquals(2, typeClass.getMethod("getD").invoke(result)); } }