package me.august.lumen;
import me.august.lumen.common.Modifier;
import me.august.lumen.common.ModifierSet;
import me.august.lumen.compile.parser.ast.ClassNode;
import me.august.lumen.compile.parser.ast.ProgramNode;
import org.junit.Assert;
import org.junit.Test;
public class ClassDeclarationTest {
static String TEST_SIMPLE_CLASS_FILE = "/test_class.lm";
static String TEST_SUPER_CLASS_FILE = "/test_superclass.lm";
static String TEST_INTERFACES_FILE = "/test_interfaces.lm";
@Test
public void testSimpleClass() {
String src = Util.readResource(TEST_SIMPLE_CLASS_FILE);
ProgramNode program = Util.parse(src);
ClassNode cls = program.getClassNode();
Assert.assertEquals(
"Expected class name to be 'Foo'",
"Foo", cls.getName()
);
Assert.assertEquals(
"Expected class to have 'public' modifier",
new ModifierSet(Modifier.PUBLIC), cls.getModifiers()
);
Assert.assertEquals(
"Expected class to implement to interfaces",
0, cls.getInterfaces().length
);
Assert.assertEquals(
"Expected class to have no fields",
0, cls.getFields().size()
);
Assert.assertEquals(
"Expected class to have no methods",
0, cls.getMethods().size()
);
}
@Test
public void testSuperClass() {
String src = Util.readResource(TEST_SUPER_CLASS_FILE);
ProgramNode program = Util.parse(src);
ClassNode cls = program.getClassNode();
String type = cls.getSuperClass().getUnresolvedType().getBaseName();
Assert.assertEquals(
"Expected class's superclass to be 'Bar'",
"Bar", type
);
}
@Test
public void testInterfaces() {
String src = Util.readResource(TEST_INTERFACES_FILE);
ProgramNode program = Util.parse(src);
ClassNode cls = program.getClassNode();
String[] expectedInterfaces = new String[]{"Bar", "Qux"};
Assert.assertArrayEquals(
"Expected class to implement {'Bar', 'Qux'}",
expectedInterfaces, cls.getInterfaces()
);
}
}