package uk.co.badgersinfoil.metaas;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import uk.co.badgersinfoil.metaas.dom.ASArg;
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.ASForStatement;
import uk.co.badgersinfoil.metaas.dom.ASMethod;
import uk.co.badgersinfoil.metaas.dom.ASPackage;
import uk.co.badgersinfoil.metaas.dom.Visibility;
import junit.framework.TestCase;
public class BasicTests extends TestCase {
public void testBasic() throws IOException {
String source =
"/*fpkg*/package foo.bar {" +
" import pkg.Stuff;" +
" /**\n" +
" * java doc\n" +
" */" +
" public class /*f*/Blat extends Bing implements Febraz, Goo {" +
" [Annotate]" +
" [Basic()]" +
" [String(\"foo\")]" +
" [Num(1)]" +
" [Bool(false)]" +
" [Arg(foo=\"bar\")]" +
" [List(foo=\"bar\", that=2)]" +
" [Event(\"alpha\")]" +
" [Event(\"beta\")]" +
" private var x:String = 1;" +
" /** javadoc? */" +
" public static function func(arg:Number, foo=null, ...):Boolean {" +
" for (var b=1;b<=10;b++) { bar(); }" +
" for (var g in blah) { r(); }" +
" for each (var g in blah) { r(); }" +
" if (h==undefined) { poo(); } else { /* bar */ }" +
" while (false) v();" +
" do { continue; } while (m);" +
" switch (blah) {" +
" case 0x3: x(); y(); break;" +
" case 4: next;" +
" default: x(); y();" +
" }" +
" with (scope) foo();" +
" var a=b?(x+y):new Foo();" +
" const X=true;" +
" ff = function(y, z) { };" +
" l=[1,'2'];" +
" xx = doc.ns::name;" +
" m={a:null};" +
" d = <foo bar=\"{blat}\"/>;" +
" r = /regexp/;" +
" /* unary expressions */" +
" --a; ++a; a--; a++; a = -a;" +
" return a.call(i.j*k, l[m]);" +
" }" +
" }" +
" } // trailing comment";
StringReader reader = new StringReader(source);
ActionScriptFactory fact = new ActionScriptFactory();
ASCompilationUnit unit = fact.newParser().parse(reader);
// check that everything looks as it should,
assertEquals("foo.bar", unit.getPackageName());
ASPackage pkg = unit.getPackage();
assertEquals("foo.bar", pkg.getName());
List imports = pkg.findImports();
assertEquals(1, imports.size());
assertEquals("pkg.Stuff", imports.get(0));
ASClassType clazz = (ASClassType)unit.getType();
assertEquals("Blat", clazz.getName());
assertEquals("Bing", clazz.getSuperclass());
assertEquals(Arrays.asList(new String[] {"Febraz", "Goo"}),
clazz.getImplementedInterfaces());
assertEquals("\n java doc\n", clazz.getDocComment());
assertEquals(1, clazz.getMethods().size());
ASField x = clazz.getField("x");
assertEquals("x", x.getName());
assertEquals("String", x.getType());
assertEquals(Visibility.PRIVATE, x.getVisibility());
assertNotNull(x.getFirstMetatag("Annotate"));
ASMethod func = clazz.getMethod("func");
assertEquals("func", func.getName());
assertEquals("Boolean", func.getType());
assertTrue(func.isStatic());
assertEquals(Visibility.PUBLIC, func.getVisibility());
assertEquals(ASMethod.AccessorRole.NORMAL_METHOD,
func.getAccessorRole());
List args = func.getArgs();
assertEquals(3, args.size());
ASArg arg0 = (ASArg)args.get(0);
assertEquals("arg", arg0.getName());
assertEquals("Number", arg0.getType());
ASArg arg1 = (ASArg)args.get(1);
assertEquals("foo", arg1.getName());
assertNull(arg1.getType());
assertEquals(" javadoc? ", func.getDocComment());
ASArg arg2 = (ASArg)args.get(2);
assertTrue(arg2.isRest());
assertEquals("...", arg2.getName());
assertNull(arg2.getType());
// compare the re-serialised code with the origional input,
StringWriter writer = new StringWriter();
fact.newWriter().write(writer, unit);
assertEquals(source.trim(), writer.toString());
List stats = func.getStatementList();
assertTrue(stats.get(0) instanceof ASForStatement);
}
public void testInvalidInput() {
StringReader reader = new StringReader("(*H!D)(&H!)D&*GH");
ActionScriptFactory fact = new ActionScriptFactory();
try {
fact.newParser().parse(reader);
fail("Should raise exception on invalid input");
} catch (SyntaxException e) {
// expected
}
}
}