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.io.Serializable;
import java.util.List;
import static org.junit.Assert.*;
public class ExtensionsCompilerTest extends AbstractCompilerTest {
@Test
public void theBaseTypeIsSetCorrectly() throws NoSuchMethodException, IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/type_extending.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, getErrorCollector());
assertEquals(2, classFileDefinitions.size());
TurinClassLoader turinClassLoader = new TurinClassLoader();
Class typeB = turinClassLoader.addClass(classFileDefinitions.get(0));
Class typeA = turinClassLoader.addClass(classFileDefinitions.get(1));
assertEquals(typeB, typeA.getSuperclass());
assertEquals(Object.class, typeB.getSuperclass());
}
@Test
public void theImplementedInterfacesAreSetCorrectly() throws IOException {
TurinFile turinFile = new Parser().parse(this.getClass().getResourceAsStream("/type_implementing.to"));
// generate bytecode
Compiler.Options options = new Compiler.Options();
Compiler instance = new Compiler(getResolverFor(turinFile), options);
List<ClassFileDefinition> classFileDefinitions = instance.compile(turinFile, getErrorCollector());
assertEquals(1, classFileDefinitions.size());
TurinClassLoader turinClassLoader = new TurinClassLoader();
Class typeA = turinClassLoader.addClass(classFileDefinitions.get(0));
assertEquals(2, typeA.getInterfaces().length);
assertTrue(Serializable.class.isAssignableFrom(typeA));
assertTrue(Cloneable.class.isAssignableFrom(typeA));
}
}