package me.tomassetti.turin.compiler;
import me.tomassetti.turin.classloading.TurinClassLoader;
import me.tomassetti.turin.classloading.ClassFileDefinition;
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.assertEquals;
public class AsteriskParameterCompilationTest extends AbstractCompilerTest {
@Test
public void asteriskParamCannotBeUsedWithOtherParams1() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/bad_usage_of_asterisk_on_creation1.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
ErrorCollector errorCollector = EasyMock.createMock(ErrorCollector.class);
errorCollector.recordSemanticError(EasyMock.eq(Position.create(10, 20, 10, 28)), EasyMock.anyString());
EasyMock.replay(errorCollector);
instance.compile(turinFile, errorCollector);
EasyMock.verify(errorCollector);
}
@Test
public void asteriskParamCannotBeUsedWithOtherParams2() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/bad_usage_of_asterisk_on_creation2.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
ErrorCollector errorCollector = EasyMock.createMock(ErrorCollector.class);
errorCollector.recordSemanticError(EasyMock.eq(Position.create(10, 22, 10, 30)), EasyMock.anyString());
EasyMock.replay(errorCollector);
instance.compile(turinFile, errorCollector);
EasyMock.verify(errorCollector);
}
@Test
public void asteriskParamCannotBeUsedWithOtherParams3() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/bad_usage_of_asterisk_on_creation3.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
ErrorCollector errorCollector = EasyMock.createMock(ErrorCollector.class);
errorCollector.recordSemanticError(EasyMock.eq(Position.create(10, 37, 10, 44)), EasyMock.anyString());
EasyMock.replay(errorCollector);
instance.compile(turinFile, errorCollector);
EasyMock.verify(errorCollector);
}
@Test
public void asteriskParamCannotBeUsedWithOverloadedMethods() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/bad_usage_of_asterisk_on_method1.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
ErrorCollector errorCollector = EasyMock.createMock(ErrorCollector.class);
errorCollector.recordSemanticError(EasyMock.eq(Position.create(10, 36, 10, 43)), EasyMock.anyString());
EasyMock.replay(errorCollector);
instance.compile(turinFile, errorCollector);
EasyMock.verify(errorCollector);
}
@Test
public void correctUsageOfAsteriskOnCreationWithObject() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/ok_usage_of_asterisk_in_creation_with_object.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, new MyErrorCollector());
TurinClassLoader turinClassLoader = new TurinClassLoader();
Class typeClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(),
classFileDefinitions.get(0).getBytecode());
Class foo1 = turinClassLoader.addClass(classFileDefinitions.get(1).getName(),
classFileDefinitions.get(1).getBytecode());
Class foo2 = turinClassLoader.addClass(classFileDefinitions.get(2).getName(),
classFileDefinitions.get(2).getBytecode());
Class foo3 = turinClassLoader.addClass(classFileDefinitions.get(3).getName(),
classFileDefinitions.get(3).getBytecode());
Object result1 = foo1.getMethod("invoke").invoke(null);
Object result2 = foo2.getMethod("invoke").invoke(null);
Object result3 = foo3.getMethod("invoke").invoke(null);
assertEquals(1, typeClass.getMethod("getA").invoke(result1));
assertEquals(10, typeClass.getMethod("getB").invoke(result1));
assertEquals(5, typeClass.getMethod("getC").invoke(result1));
assertEquals(7, typeClass.getMethod("getD").invoke(result1));
assertEquals(1, typeClass.getMethod("getA").invoke(result2));
assertEquals(10, typeClass.getMethod("getB").invoke(result2));
assertEquals(15, typeClass.getMethod("getC").invoke(result2));
assertEquals(7, typeClass.getMethod("getD").invoke(result2));
assertEquals(1, typeClass.getMethod("getA").invoke(result3));
assertEquals(10, typeClass.getMethod("getB").invoke(result3));
assertEquals(5, typeClass.getMethod("getC").invoke(result3));
assertEquals(15, typeClass.getMethod("getD").invoke(result3));
}
@Test
public void correctUsageOfAsteriskOnMethodWithObject() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/ok_usage_of_asterisk_in_method_with_object.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, new MyErrorCollector());
TurinClassLoader turinClassLoader = new TurinClassLoader();
Class typeClass = turinClassLoader.addClass(classFileDefinitions.get(0).getName(),
classFileDefinitions.get(0).getBytecode());
Class callMe = turinClassLoader.addClass(classFileDefinitions.get(1).getName(),
classFileDefinitions.get(1).getBytecode());
Class foo1 = turinClassLoader.addClass(classFileDefinitions.get(2).getName(),
classFileDefinitions.get(2).getBytecode());
Class foo2 = turinClassLoader.addClass(classFileDefinitions.get(3).getName(),
classFileDefinitions.get(3).getBytecode());
Class foo3 = turinClassLoader.addClass(classFileDefinitions.get(4).getName(),
classFileDefinitions.get(4).getBytecode());
Object result1 = foo1.getMethod("invoke").invoke(null);
Object result2 = foo2.getMethod("invoke").invoke(null);
Object result3 = foo3.getMethod("invoke").invoke(null);
assertEquals(23, typeClass.getMethod("getA").invoke(result1));
assertEquals(10, typeClass.getMethod("getB").invoke(result1));
assertEquals(5, typeClass.getMethod("getC").invoke(result1));
assertEquals(7, typeClass.getMethod("getD").invoke(result1));
assertEquals(1, typeClass.getMethod("getA").invoke(result2));
assertEquals(10, typeClass.getMethod("getB").invoke(result2));
assertEquals(15, typeClass.getMethod("getC").invoke(result2));
assertEquals(7, typeClass.getMethod("getD").invoke(result2));
assertEquals(1, typeClass.getMethod("getA").invoke(result3));
assertEquals(10, typeClass.getMethod("getB").invoke(result3));
assertEquals(5, typeClass.getMethod("getC").invoke(result3));
assertEquals(7, typeClass.getMethod("getD").invoke(result3));
}
}