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 java.util.Optional; import static org.junit.Assert.assertEquals; public class FieldConstraintsCompilationTest extends AbstractCompilerTest { @Test public void fieldConstraintsOnDefaultParamCompilation() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/field_constraints_on_default_param.to")); // generate bytecode Compiler.Options options = new Compiler.Options(); Compiler instance = new Compiler(getResolverFor(turinFile), options); List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, new MyErrorCollector()); assertEquals(7, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class optionsClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(), classFileDefinitions.get(0).getBytecode()); saveClassFile(classFileDefinitions.get(0), "tmp"); Class foo1Class = turinClassLoader.addClass(classFileDefinitions.get(1).getName(), classFileDefinitions.get(1).getBytecode()); Class foo2Class = turinClassLoader.addClass(classFileDefinitions.get(2).getName(), classFileDefinitions.get(2).getBytecode()); Class foo3Class = turinClassLoader.addClass(classFileDefinitions.get(3).getName(), classFileDefinitions.get(3).getBytecode()); Class foo4Class = turinClassLoader.addClass(classFileDefinitions.get(4).getName(), classFileDefinitions.get(4).getBytecode()); Class foo5Class = turinClassLoader.addClass(classFileDefinitions.get(5).getName(), classFileDefinitions.get(5).getBytecode()); Class foo6Class = turinClassLoader.addClass(classFileDefinitions.get(6).getName(), classFileDefinitions.get(6).getBytecode()); Optional<Throwable> exc1 = getException(foo1Class.getMethod("invoke")); Optional<Throwable> exc2 = getException(foo2Class.getMethod("invoke")); Optional<Throwable> exc3 = getException(foo3Class.getMethod("invoke")); Optional<Throwable> exc4 = getException(foo4Class.getMethod("invoke")); Optional<Throwable> exc5 = getException(foo5Class.getMethod("invoke")); Optional<Throwable> exc6 = getException(foo6Class.getMethod("invoke")); assertEquals(true, exc1.isPresent()); assertEquals(true, exc2.isPresent()); assertEquals(true, exc3.isPresent()); assertEquals(false, exc4.isPresent()); assertEquals(true, exc5.isPresent()); assertEquals(false, exc6.isPresent()); } @Test public void fieldConstraintsOnNonDefaultParamCompilation() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/field_constraints_on_non_default_param.to")); // generate bytecode Compiler.Options options = new Compiler.Options(); Compiler instance = new Compiler(getResolverFor(turinFile), options); List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, new MyErrorCollector()); assertEquals(7, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class optionsClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(), classFileDefinitions.get(0).getBytecode()); Class foo1Class = turinClassLoader.addClass(classFileDefinitions.get(1).getName(), classFileDefinitions.get(1).getBytecode()); Class foo2Class = turinClassLoader.addClass(classFileDefinitions.get(2).getName(), classFileDefinitions.get(2).getBytecode()); Class foo3Class = turinClassLoader.addClass(classFileDefinitions.get(3).getName(), classFileDefinitions.get(3).getBytecode()); Class foo4Class = turinClassLoader.addClass(classFileDefinitions.get(4).getName(), classFileDefinitions.get(4).getBytecode()); Class foo5Class = turinClassLoader.addClass(classFileDefinitions.get(5).getName(), classFileDefinitions.get(5).getBytecode()); Class foo6Class = turinClassLoader.addClass(classFileDefinitions.get(6).getName(), classFileDefinitions.get(6).getBytecode()); Optional<Throwable> exc1 = getException(foo1Class.getMethod("invoke")); Optional<Throwable> exc2 = getException(foo2Class.getMethod("invoke")); Optional<Throwable> exc3 = getException(foo3Class.getMethod("invoke")); Optional<Throwable> exc4 = getException(foo4Class.getMethod("invoke")); Optional<Throwable> exc5 = getException(foo5Class.getMethod("invoke")); Optional<Throwable> exc6 = getException(foo6Class.getMethod("invoke")); assertEquals(true, exc1.isPresent()); assertEquals(true, exc2.isPresent()); assertEquals(true, exc3.isPresent()); assertEquals(false, exc4.isPresent()); assertEquals(true, exc5.isPresent()); assertEquals(false, exc6.isPresent()); } }