package uk.co.badgersinfoil.metaas;
import java.io.IOException;
import java.util.List;
import uk.co.badgersinfoil.metaas.dom.ASClassType;
import uk.co.badgersinfoil.metaas.dom.ASCompilationUnit;
import uk.co.badgersinfoil.metaas.dom.ASField;
import uk.co.badgersinfoil.metaas.dom.ASMethod;
import uk.co.badgersinfoil.metaas.dom.Visibility;
import junit.framework.TestCase;
public class ASClassTypeTests extends TestCase {
private ActionScriptFactory fact = new ActionScriptFactory();
private ASCompilationUnit unit;
private ASClassType clazz;
protected void setUp() {
ActionScriptFactory fact = new ActionScriptFactory();
unit = fact.newClass("Test");
clazz = (ASClassType)unit.getType();
}
protected void tearDown() throws IOException {
CodeMirror.assertReflection(fact, unit);
}
public void testName() {
assertEquals("Test", clazz.getName());
clazz.setName("Another");
assertEquals("Another", clazz.getName());
}
public void testMethods() {
ASMethod foo = clazz.newMethod("foo", Visibility.PUBLIC, null);
clazz.newMethod("removeme", Visibility.PUBLIC, null);
clazz.newMethod("bar", Visibility.PUBLIC, null);
clazz.removeMethod("removeme");
List methods = clazz.getMethods();
assertEquals(2, methods.size());
ASMethod meth0 = (ASMethod)methods.get(0);
assertEquals("foo", meth0.getName());
ASMethod meth1 = (ASMethod)methods.get(1);
assertEquals("bar", meth1.getName());
assertEquals(foo.getName(), clazz.getMethod("foo").getName());
assertNull(clazz.getMethod("missing"));
// no exception should be raised,
clazz.removeMethod("missing");
}
public void testFields() {
clazz.newField("foo", Visibility.PUBLIC, null);
clazz.newField("removeme", Visibility.PUBLIC, null);
clazz.newField("bar", Visibility.PRIVATE, "Boolean");
assertEquals("foo", clazz.getField("foo").getName());
assertEquals(3, clazz.getFields().size());
clazz.removeField("removeme");
List fields = clazz.getFields();
assertEquals(2, fields.size());
ASField field0 = (ASField)fields.get(0);
assertEquals("foo", field0.getName());
ASField field1 = (ASField)fields.get(1);
assertEquals("bar", field1.getName());
assertEquals(null, clazz.getField("missing"));
// check no exception raised,
clazz.removeField("missing");
}
public void testSuper() throws IOException {
assertNull(clazz.getSuperclass());
clazz.setSuperclass("com.example.SuperTest");
assertEquals("com.example.SuperTest", clazz.getSuperclass());
// replace the original type name,
clazz.setSuperclass("SuperTest");
CodeMirror.assertReflection(fact, unit);
clazz.setSuperclass(null);
assertNull(clazz.getSuperclass());
}
public void testImplements() {
assertEquals(0, clazz.getImplementedInterfaces().size());
clazz.addImplementedInterface("InterfaceTestA");
clazz.addImplementedInterface("InterfaceTestB");
clazz.addImplementedInterface("pkg.InterfaceTestC");
assertEquals(3, clazz.getImplementedInterfaces().size());
clazz.removeImplementedInterface("InterfaceTestB");
List interfaces = clazz.getImplementedInterfaces();
assertEquals(2, interfaces.size());
String interface0 = (String)interfaces.get(0);
assertEquals("InterfaceTestA", interface0);
String interface1 = (String)interfaces.get(1);
assertEquals("pkg.InterfaceTestC", interface1);
}
public void testRemoveImplements() {
clazz.addImplementedInterface("InterfaceTest");
clazz.removeImplementedInterface("InterfaceTest");
// tearDown() will assert that the code still parses, which
// it shouldn't do if the inteface name is removed, but the
// 'implements' keyword isn't.
}
public void testDocComment() {
String comment = "\nfoo\n bar\n\n";
clazz.setDocComment(comment);
assertEquals(comment, clazz.getDocComment());
}
public void testPackage() {
assertNull(unit.getPackageName());
unit.setPackageName("test.foo");
assertEquals("test.foo", unit.getPackageName());
unit.setPackageName("test.bar");
assertEquals("test.bar", unit.getPackageName());
unit.setPackageName(null);
assertNull(unit.getPackageName());
}
public void testVisibility() {
assertEquals(Visibility.PUBLIC, clazz.getVisibility());
clazz.setVisibility(Visibility.DEFAULT);
assertEquals(Visibility.DEFAULT, clazz.getVisibility());
}
public void testDynamic() {
assertFalse(clazz.isDynamic());
clazz.setDynamic(false);
// set false when already false,
assertFalse(clazz.isDynamic());
clazz.setDynamic(true);
assertTrue(clazz.isDynamic());
// set true when already true,
clazz.setDynamic(true);
assertTrue(clazz.isDynamic());
}
public void testFinal() {
assertFalse(clazz.isFinal());
clazz.setFinal(false);
// set false when already false,
assertFalse(clazz.isFinal());
clazz.setFinal(true);
assertTrue(clazz.isFinal());
// set true when already true,
clazz.setFinal(true);
assertTrue(clazz.isFinal());
}
public void testRemoveModifiers() {
// set the 'final' keyword
clazz.setFinal(true);
// remove the 'public' keyword added by default in setUp()
clazz.setVisibility(Visibility.DEFAULT);
// now, test removing the 'final' flag, which should also be
// the only remaining modifier,
clazz.setFinal(false);
}
}