package me.tomassetti.turin.compiler; import me.tomassetti.turin.classloading.ClassFileDefinition; import me.tomassetti.turin.classloading.TurinClassLoader; import me.tomassetti.turin.compiler.errorhandling.ErrorCollector; import me.tomassetti.turin.parser.Parser; import me.tomassetti.turin.parser.ast.Position; import me.tomassetti.turin.parser.ast.TurinFile; import org.easymock.EasyMock; import org.junit.Test; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.List; import static org.junit.Assert.*; public class ExplicitConstructorsTest extends AbstractCompilerTest { @Test public void multipleExplicitConstructorsCauseAnError() throws IOException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/explicit_constructors.to")); // generate bytecode Compiler.Options options = new Compiler.Options(); Compiler instance = new Compiler(getResolverFor(turinFile), options); ErrorCollector errorCollector = EasyMock.createMock(ErrorCollector.class); errorCollector.recordSemanticError(Position.create(5, 4, 7, 1), "At most one explicit constructor can be defined"); errorCollector.recordSemanticError(Position.create(8, 4, 10, 1), "At most one explicit constructor can be defined"); EasyMock.replay(errorCollector); instance.compile(turinFile, errorCollector); EasyMock.verify(errorCollector); } @Test public void explicitConstructorNoExtend() throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/explicit_constructor_no_extend.to")); // generate bytecode Compiler.Options options = new Compiler.Options(); Compiler compiler = new Compiler(getResolverFor(turinFile), options); List<ClassFileDefinition> classFileDefinitions = compiler.compile(turinFile, new MyErrorCollector()); assertEquals(1, classFileDefinitions.size()); TurinClassLoader turinClassLoader = new TurinClassLoader(); Class typeClass = turinClassLoader.addClass(classFileDefinitions.get(0)); Object instance = typeClass.getConstructor(int.class).newInstance(123); assertEquals("123", typeClass.getMethod("getA").invoke(instance)); } }