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.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class AnnotationCompilationTest extends AbstractCompilerTest { @Test public void compileAnnotationOnFunction() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/annotations.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(2, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class functionClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(), classFileDefinitions.get(0).getBytecode()); Annotation annotation = functionClass.getAnnotation(turin.test.Test.class); assertNotNull(annotation); } @Test public void compileAnnotationOnType() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/annotations.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(2, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class typeClass = turinClassLoader.addClass(classFileDefinitions.get(1).getName(), classFileDefinitions.get(1).getBytecode()); Annotation annotation = typeClass.getAnnotation(turin.test.Test.class); assertNotNull(annotation); } }