package uk.co.badgersinfoil.metaas;
import java.io.IOException;
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.ASIntegerLiteral;
import uk.co.badgersinfoil.metaas.dom.ASStringLiteral;
import uk.co.badgersinfoil.metaas.dom.Expression;
import uk.co.badgersinfoil.metaas.dom.Visibility;
import junit.framework.TestCase;
public class ASFieldTests extends TestCase {
private ActionScriptFactory fact = new ActionScriptFactory();
private ASCompilationUnit unit;
private ASField field;
protected void setUp() {
unit = fact.newClass("Test");
ASClassType clazz = (ASClassType)unit.getType();
field = clazz.newField("test", Visibility.PUBLIC, "Bar");
}
protected void tearDown() throws IOException {
CodeMirror.assertReflection(fact, unit);
}
public void testName() {
assertEquals("test", field.getName());
field.setName("foobar");
assertEquals("foobar", field.getName());
try {
field.setName("bad.name");
fail("should not have accepted field name containing '.'");
} catch (SyntaxException e) {
// expected
}
}
public void testStatic() {
assertFalse("new fields should be non-static by default", field.isStatic());
field.setStatic(false);
assertFalse("seting non-static when already non-static should be ok", field.isStatic());
field.setStatic(true);
assertTrue("changing to static failed", field.isStatic());
field.setStatic(true);
assertTrue("static static when already static didn't work", field.isStatic());
field.setStatic(false);
assertFalse("removing static again didn't work", field.isStatic());
}
public void testInit() throws IOException {
// should no none to start with,
assertNull(field.getInitializer());
field.setInitializer(fact.newStringLiteral("foo"));
assertTrue(field.getInitializer() instanceof ASStringLiteral);
field.setInitializer("1");
assertTrue(field.getInitializer() instanceof ASIntegerLiteral);
field.setInitializer((String)null); // remove it again
assertNull(field.getInitializer());
field.setInitializer((Expression)null); // when already absent
// complicated initialiser value,
field.setInitializer("function() { trace('test'); }");
CodeMirror.assertReflection(fact, unit);
}
public void testRenameWithInit() {
field.setInitializer(fact.newStringLiteral("foo"));
assertTrue(field.getInitializer() instanceof ASStringLiteral);
field.setName("foo");
// renaming the field should cause the initialiser to vanish
assertNotNull(field.getInitializer());
}
public void testDocComment() {
// initial add,
String comment = "foo\n bar";
field.setDocComment(comment);
assertEquals(comment, field.getDocComment());
// modify,
comment = "blat";
field.setDocComment(comment);
assertEquals(comment, field.getDocComment());
// delete,
field.setDocComment(null);
assertNull(field.getDocComment());
}
public void testType() {
assertEquals("Bar", field.getType());
// overwrite the old type,
field.setType("Foo");
assertEquals("Foo", field.getType());
field.setType(null);
assertNull(field.getType());
field.setType(null); // when already absent
field.setType("Foo");
assertEquals("Foo", field.getType());
}
public void testConst() {
assertFalse(field.isConst());
field.setConst(true);
assertTrue(field.isConst());
field.setConst(false);
assertFalse(field.isConst());
// set it to the value it already has,
field.setConst(false);
assertFalse(field.isConst());
}
public void testConstSerialisation() throws IOException {
field.setConst(true);
field.setName("renamed");
unit = CodeMirror.assertReflection(fact, unit);
field = ((ASClassType)unit.getType()).getField("renamed");
assertNotNull(field);
assertTrue(field.isConst());
}
}