/* * Copyright 2008 CoreMedia AG * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package net.jangaroo.test.integration; import java.io.File; /** * Some basic test cases for JangarooScript compiler and runtime correctness. * * @author Andreas Gawecki */ public class JooTest extends JooRuntimeTestCase { public JooTest(String name) throws Exception { super(name); } @Override protected void setUp() throws Exception { super.setUp(); } public void testMethodCall() throws Exception { import_("package1.TestMethodCall"); complete(); expectNumber(43, "package1.TestMethodCall.s(43)"); eval("obj = new package1.TestMethodCall();"); eval("t = new package1.TestMethodCall();"); expectNumber(43, "obj.m(43)"); expectNumber(43, "obj.callm(43, t)"); expectNumber(43, "obj.callmViaThis(43, t)"); expectNumber(43, "obj.callmViaObject(43, t)"); expectNumber(43, "obj.callmViaVar(43, t)"); expectNumber(43, "obj.callmViaField(43, t)"); expectNumber(43, "obj.callmViaThisDotField(43, t)"); //expectException( "obj.prot(43)"); expectNumber(44, "obj.prot(43)"); expectNumber(44, "obj.callProt(43, t)"); expectNumber(44, "obj.callProtViaThis(43, t)"); //expectException( "obj.callProtViaObject(43, t)"); expectNumber(44, "obj.callProtViaObject(43, t)"); expectNumber(44, "obj.callProtViaVar(43, t)"); expectNumber(44, "obj.callProtViaField(43, t)"); expectNumber(44, "obj.callProtViaThisDotField(43, t)"); expectException( "obj.priv(43)"); expectNumber(45, "obj.callPriv(43, t)"); expectNumber(45, "obj.callPrivViaThis(43, t)"); expectException( "obj.callPrivViaObject(43, t)"); expectNumber(45, "obj.callPrivViaVar(43, t)"); expectNumber(45, "obj.callPrivViaField(43, t)"); expectNumber(45, "obj.callPrivViaThisDotField(43, t)"); } public void testAssert() throws Exception { String qualifiedName = "package1.TestAssert"; String asFileName = asFileName(qualifiedName); String jsFileName = jsFileName(qualifiedName); import_(qualifiedName); complete(); String canonicalJsFileName = new File(jsFileName).getCanonicalPath(); // TODO: re-enable when we again have both kinds of tests: boolean assertionsEnabled = Boolean.valueOf("true"); //canonicalJsFileName.contains(File.separatorChar + "debug-and-assert" + File.separatorChar); final String script = qualifiedName + ".testAssert()"; System.out.println("\ncanonicalJsFileName: " + canonicalJsFileName); System.out.println("\nassertions enabled: " + assertionsEnabled); if (!assertionsEnabled) { expectString("no exception thrown", script); } else { int line = 30; int column = 9; String expectedErrorMsgTail = new File(asFileName).getName() + "(" + line + ":" + column + "): assertion failed"; expectSubstring(expectedErrorMsgTail, qualifiedName + ".testAssert()"); } } public void testInheritance() throws Exception { import_("package1.TestInheritanceSuperClass"); import_("package1.TestInheritanceSubClass"); import_("package1.TestInheritanceSubSubClass"); complete(); eval("obj1 = new package1.TestInheritanceSuperClass(1);"); eval("obj2 = new package1.TestInheritanceSubClass(11, 2);"); eval("obj3 = new package1.TestInheritanceSubSubClass(111, 22, 3);"); expectNumber(1, "obj1.getSlot1()"); expectNumber(11, "obj2.getSlot1()"); expectNumber(111, "obj3.getSlot1()"); expectNumber(2, "obj2.getSlot2()"); expectNumber(22, "obj3.getSlot2()"); expectNumber(3, "obj3.getSlot3()"); expectNumber(1, "obj1.m()"); expectNumber(12, "obj2.m()"); expectNumber(113, "obj3.m()"); } public void testStaticInitializer() throws Exception { import_("package2.TestStaticInitializer"); complete(); initClass("package2.TestStaticInitializer"); expectString("s1", "package2.TestStaticInitializer.s1"); expectString("s2/s1", "package2.TestStaticInitializer.s2"); expectString("s3/s2/s1", "package2.TestStaticInitializer.s3"); expectNumber(10, "package2.TestStaticInitializer.fv"); // must not access private fields expectString("undefined", "typeof package2.TestStaticInitializer.f"); } public void testStaticAccess() throws Exception { import_("package2.TestStaticAccess"); complete(); expectGetAndGetQualified("s0", false, "s0"); expectGetAndGetQualified("s1", true, "s1"); expectGetAndGetQualified("s2", false, "s2"); eval("package2.StaticAccessSuperClass.s0='s0_mod1';"); expectGetAndGetQualified("s0", false, "s0_mod1"); eval("package2.TestStaticAccess.set_s0('s0_mod2');"); expectGetAndGetQualified("s0", false, "s0_mod2"); eval("package2.TestStaticAccess.set_s0_qualified('s0_mod3');"); expectGetAndGetQualified("s0", false, "s0_mod3"); eval("package2.TestStaticAccess.set_s0_fully_qualified('s0_mod4');"); expectGetAndGetQualified("s0", false, "s0_mod4"); eval("package2.TestStaticAccess.s1='s1_mod1';"); expectGetAndGetQualified("s1", true, "s1_mod1"); eval("package2.TestStaticAccess.set_s1('s1_mod2');"); expectGetAndGetQualified("s1", true, "s1_mod2"); eval("package2.TestStaticAccess.set_s1_qualified('s1_mod3');"); expectGetAndGetQualified("s1", true, "s1_mod3"); eval("package2.TestStaticAccess.set_s1_fully_qualified('s1_mod4');"); expectGetAndGetQualified("s1", true, "s1_mod4"); eval("package2.TestStaticAccess.set_s2('s2_mod2');"); expectGetAndGetQualified("s2", false, "s2_mod2"); eval("package2.TestStaticAccess.set_s2_qualified('s2_mod3');"); expectGetAndGetQualified("s2", false, "s2_mod3"); eval("package2.TestStaticAccess.set_s2_fully_qualified('s2_mod4');"); expectGetAndGetQualified("s2", false, "s2_mod4"); expectString("s2_mod4", "package2.TestStaticAccess.get_s2_via_private_static_method()"); expectString("s2_mod4", "package2.TestStaticAccess.get_s2_via_private_static_method_qualified()"); expectString("s2_mod4", "package2.TestStaticAccess.get_s2_via_private_static_method_full_qualified()"); } public void testStaticAccess2() throws Exception { import_("package2.TestStaticAccess2"); complete(); initClass("package2.TestStaticAccess2"); eval("package2.TestStaticAccess.s1='s1_mod1';"); expectGetAndGetQualified("s1", true, "s1_mod1"); eval("package2.TestStaticAccess2.set_s1_qualified('s1_mod3');"); expectGetAndGetQualified("s1", true, "s1_mod3"); eval("package2.TestStaticAccess2.set_s1_fully_qualified('s1_mod4');"); expectGetAndGetQualified("s1", true, "s1_mod4"); eval("package2.TestStaticAccess2.set_s2_qualified('s2_mod3');"); expectGetAndGetQualified2("s2", "s2_mod3"); eval("package2.TestStaticAccess2.set_s2_fully_qualified('s2_mod4');"); expectGetAndGetQualified2("s2", "s2_mod4"); // TODO: test that static members are *not* inherited. } public void testStaticAccess3() throws Exception { import_("package2.TestStaticAccess3"); complete(); expectString("s1", "package2.TestStaticAccess3.testInitOtherClass()"); } public void testMemberNames() throws Exception { import_("package1.TestMemberNames"); complete(); eval("obj1 = new package1.TestMemberNames()"); expectString("foo", "obj1.foo()"); expectString("foo-static", "package1.TestMemberNames.foo()"); expectString("bar-foo", "obj1.bar()"); expectString("bar-foo-static", "package1.TestMemberNames.bar()"); } private void expectGetAndGetQualified(String memberName, boolean publicMember, String expected) throws Exception { if (publicMember) { expectString(expected, "package2.TestStaticAccess."+memberName+""); } else { expectString("undefined", "typeof(package2.TestStaticAccess."+memberName+")"); } expectString(expected, "package2.TestStaticAccess.get_"+memberName+"()"); expectString(expected, "package2.TestStaticAccess.get_"+memberName+"_qualified()"); expectString(expected, "package2.TestStaticAccess.get_"+memberName+"_fully_qualified()"); } private void expectGetAndGetQualified2(String memberName, String expected) throws Exception { expectString(expected, "package2.TestStaticAccess2.get_"+memberName+"_qualified()"); expectString(expected, "package2.TestStaticAccess2.get_"+memberName+"_fully_qualified()"); } public void testInternal() throws Exception { import_("package2.TestInternal"); complete(); expectString("internal", "new package2.TestInternal().returnInternal()"); } public void testInitializeBeforeStaticMethod() throws Exception { import_("package2.TestStaticInitializer"); complete(); expectNumber(1, "package2.TestStaticInitializer.return1()"); expectNumber(2, "package2.TestStaticInitializer.return2()"); expectString("function", "typeof package2.TestStaticInitializer.FUN"); expectString("something", "var o = { slot: 'bad' }; package2.TestStaticInitializer.FUN.call(o, 'something'); o.slot"); expectString("something", "var o = { slot: 'bad' }; package2.TestStaticInitializer.FUN2_PUBLIC.call(o, 'something'); o.slot"); } public void testLocalVariables() throws Exception { import_("package1.TestLocalVariables"); complete(); eval("obj = new package1.TestLocalVariables();"); expectNumber(200, "obj.m(10)"); expectNumber(134, "obj.m2(10)"); } public void testStatements() throws Exception { import_("package2.TestStatements"); complete(); eval("obj = new package2.TestStatements;"); expectNumber(200, "obj.testIf(true, 200, 300)"); expectNumber(300, "obj.testIf(false, 200, 300)"); expectNumber(200, "obj.testIfThenElse(true, 200, 300)"); expectNumber(300, "obj.testIfThenElse(false, 200, 300)"); expectNumber(15, "obj.testWhile(5)"); expectNumber(10, "obj.testFor(5)"); expectNumber(10, "obj.testFor2(5)"); expectNumber(15, "obj.testDoWhile(5)"); expectNumber(3, "obj.testBreakDo()"); expectNumber(3, "obj.testBreakWhile()"); expectNumber(3, "obj.testBreakFor()"); expectNumber(3, "obj.testBreakLabeledWhile()"); expectNumber(3, "obj.testBreakLabeledFor()"); expectNumber(3, "obj.testBreakLabeledDo()"); expectNumber(3, "obj.testBreakLabeledBlock()"); expectNumber(1, "obj.testBreakLabeledIf()"); expectNumber(14, "obj.testBreakDuplicateLabel()"); expectString("x, y, z", "obj.testForIn({ y: 2, x :1, z: 3})"); expectString("x, y, z", "obj.testForIn2({ y: 2, x :1, z: 3})"); expectString("1, 2, 3", "obj.testForEach({ y: 2, x :1, z: 3})"); expectString("1, 2, 3", "obj.testForEach2({ y: 2, x :1, z: 3})"); expectString("1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3", "obj.testForEach3({ y: 2, x :1, z: 3})"); // from http://pastebin.com/1MDyFVJA expectNumber(1, "obj.testForEach4()"); expectString("x, y, z", "obj.testForWithLValue({ y: 2, x :1, z: 3})"); expectString("1, 2, 3", "obj.testForEachWithLValue({ y: 2, x :1, z: 3})"); expectNumber(11, "obj.testSwitch(1,1,11,2,22,33)"); expectNumber(22, "obj.testSwitch(2,1,11,2,22,33)"); expectNumber(33, "obj.testSwitch(3,1,11,2,22,33)"); expectString("undefined", "typeof(obj.testReturnVoid())"); expectNumber(42, "var o = { tobedeleted: 42 }; o.tobedeleted"); expectNumber(42, "var o2 = { tobedeleted: 42 }; o2.tobedeleted"); expectString("undefined", "obj.testDelete1(o); typeof(o.tobedeleted)"); expectString("undefined", "obj.testDelete2(o2, 'tobedeleted'); typeof(o.tobedeleted)"); expectString("is an Error: foo", "obj.testTryCatchFinally(new Error('foo'))"); expectString("is not an Error: bar", "obj.testTryCatchFinally(new String('bar'))"); expectBoolean(true, "obj.cleanedUp"); } public void testSemicolonInsertion() throws Exception { import_("package2.TestSemicolonInsertion"); complete(); eval("obj = new package2.TestSemicolonInsertion;"); eval("obj.testMissingBeforeBlockEnd();"); eval("obj.testMissingAfterRegexp();"); eval("obj.testMissingBeforeBlockEnd2();"); expectBoolean(true, "undefined === obj.testMissingAfterReturn()"); expectNumber(33, "obj.testMissingAfterContinue()"); expectNumber(33, "obj.testMissingAfterBreak()"); expectNumber(13, "obj.testMissingBeforePostfixPlusPlus()"); expectNumber(31, "obj.testMissingBeforePostfixMinusMinus()"); expectNumber(101, "obj.testReturnPreIncrement(100)"); expectNumber(100, "obj.testReturnPostIncrement(100)"); expectNumber(99, "obj.testReturnPreDecrement(100)"); expectNumber(100, "obj.testReturnPostDecrement(100)"); } public void testExpressions() throws Exception { import_("package2.TestExpressions"); complete(); eval("obj = new package2.TestExpressions;"); expectNumber(200, "obj.testCond(true, 200, 300)"); expectNumber(300, "obj.testCond(false, 200, 300)"); expectString("foo", "obj.testCommaExprAsArrayIndex('foo')"); expectNumber(24, "obj.testParenExpr(11)"); expectNumber(7, "obj.testBinOpExpr(12)"); expectNumber(130, "(obj.testFunExpr(13))(10)"); expectNumber(-2, "obj.testPrefixOpExpr(14)"); expectNumber(30, "obj.testPostfixOpExpr(15)"); String dq = "'€\\\b\t\n\f\r\'/'\u00C6\u01Bfe\"'"; // "'€\\\b\t\n\f\r\'/'\xc6\u01Bfe\"'" String sq = "\"€\\\b\t\n\f\r\'/\"\u00C6\u01Bfe'\""; // '"€\\\b\t\n\f\r\'/"\xc6\u01Bfe\'"' expectString(dq, "obj.testStringLiteralsDQ()"); expectString(sq, "obj.testStringLiteralsSQ()"); expectString("ActionScript <span class='heavy'>3.0</span>", "obj.testStringLiterals3()"); expectString("<item id=\"155\">banana</item>", "obj.testStringLiterals4()"); expectString(dq, "obj.testCharLiterals()"); expectString("2,7,2,2,4,2,3,10", "obj.testRegexpLiterals()"); expectNumber(18, "obj.antitestRegexpLiterals1()"); expectNumber(34, "obj.antitestRegexpLiterals2((99*2),2,{p:3})"); expectNumber(33, "obj.antitestRegexpLiterals3()"); expectNumber(123+456, "obj.testObjectLiterals()"); expectNumber(123+456, "obj.testNestedObjectLiterals()"); expectNumber(123+456, "obj.testObjectLiteralWithFun()"); expectNumber(123+456+11, "obj.testObjectLiteralsInBooleanShortcuts(false,true,99)"); expectNumber(9+456+11, "obj.testObjectLiteralsInBooleanShortcuts({x:9,y:10},true,99)"); expectNumber(9+88+11, "obj.testObjectLiteralsInBooleanShortcuts({x:9,y:10},false,88)"); expectString("", "obj.testArrayLiterals1()"); expectString("1", "obj.testArrayLiterals2()"); expectString("1,2,3,4,5,6,7,8,9,0", "obj.testArrayLiterals3()"); expectString(",1,2,,,3,4,5,6,7,8,9,0,", "obj.testArrayLiterals4()"); expectBoolean(true, "obj.testIsPrecedence()"); } public void testImport() throws Exception { import_("package2.TestImport"); //todo remove this once *imports are added as implicit imports: import_("package1.TestMethodCall"); import_("package1.TestImplements"); complete(); expectString("s2/s1"+"/"+(-19+42), "package2.TestImport.main()"); } public void testInclude() throws Exception { import_("package2.TestInclude"); complete(); expectString("included!", "package2.TestInclude.testIncludeSameDir()"); expectString("included!", "package2.TestInclude.testIncludeOtherDir()"); } public void testSelfAwareness() throws Exception { runClass("package1.TestSelfAwareness"); } public void testInitializers() throws Exception { doTestThreeSlots("package1.TestInitializers"); } public void testInitializersWithDefaultConstructor() throws Exception { doTestThreeSlots("package1.TestInitializersWithDefaultConstructor"); } public void testImplicitSuper() throws Exception { import_("package1.TestInitializers"); doTestThreeSlots("package1.TestImplicitSuper"); } public void testExplicitSuper() throws Exception { import_("package1.TestInitializers"); doTestThreeSlots("package1.TestExplicitSuper"); } private void doTestThreeSlots(String className) throws Exception { import_(className); complete(); eval("obj = new "+className+"();"); expectNumber(1, "obj.getSlot1()"); expectNumber(2, "obj.getSlot2()"); expectNumber(1, "obj.getSlot3().nolabel"); expectNumber(2, "obj.getSlot3().alsonolabel"); expectBoolean(true, "obj.getSlot3()===obj.getSlot3()"); eval("obj2 = new " + className + "();"); expectBoolean(false, "obj.getSlot3()===obj2.getSlot3()"); } public void testUnqualifiedAccess() throws Exception { import_("package1.TestUnqualifiedAccess"); complete(); eval("obj = new package1.TestUnqualifiedAccess(\"a\")"); eval("new package1.TestUnqualifiedAccess(\"c\")"); expectString("a", "obj.getPrivateSlot()"); eval("obj.setPrivateSlot(\"b\")"); expectString("b", "obj.getPrivateSlot()"); expectString("a", "obj.getProtectedSlot()"); eval("obj.setProtectedSlot(\"b\")"); expectString("b", "obj.getProtectedSlot()"); expectString("a", "obj.getPublicSlot()"); eval("obj.setPublicSlot(\"b\")"); expectString("b", "obj.getPublicSlot()"); expectBoolean(true, "obj.testConstructorAccess()"); expectBoolean(true, "package1.TestUnqualifiedAccess.UNQUALIFIED_CLASS_EQUALS_QUALIFIED_CLASS"); expectString("foo", "package1.TestUnqualifiedAccess.SET_BY_STATIC_INITIALIZER"); expectBoolean(true, "obj.testLocalFunction()"); expectString("foo", "obj.testForwardPrivateUnqualified('foo')"); } public void testTypeCast() throws Exception { import_("package1.TestTypeCast"); complete(); eval("obj = new package1.TestTypeCast()"); expectBoolean(true, "package1.TestTypeCast.testAsCast(obj)===obj"); expectBoolean(true, "package1.TestTypeCast.testFunctionCast(obj)===obj"); expectNumber(123, "package1.TestTypeCast.testCastToUint(123.9)"); expectNumber(0, "package1.TestTypeCast.testCastToUint(-.1)"); expectNumber(0, "package1.TestTypeCast.testCastToUint(-.9)"); expectNumber(4294967295.0, "package1.TestTypeCast.testCastToUint(-1)"); expectNumber(4294967294.0, "package1.TestTypeCast.testCastToUint(-2.9)"); } public void testYesSuper1() throws Exception { import_("package1.TestInheritanceSuperClass"); import_("package1.TestInheritanceSubClass"); import_("package1.TestInheritanceSubSubClass"); complete(); } public void testYesSuper2() throws Exception { import_("package1.TestInheritanceSubSubClass"); import_("package1.TestInheritanceSubClass"); import_("package1.TestInheritanceSuperClass"); complete(); } public void testParamInitializers() throws Exception { import_("package1.TestParamInitializers"); complete(); eval("obj = new package1.TestParamInitializers();"); expectString("foo/bar", "obj.initParams1('foo','bar')"); expectString("foo/1", "obj.initParams1('foo')"); expectString("foo/bar/3", "obj.initParams2('foo','bar','a',2,true)"); expectString("foo/bar/0", "obj.initParams2('foo','bar')"); expectString("foo/foo/0", "obj.initParams2('foo')"); expectString("foo/bar/baz/3", "obj.initParams3('foo','bar','baz', 'a',2,true)"); expectString("foo/bar/undefined/0", "obj.initParams3('foo','bar')"); expectString("foo/foo/undefined/0", "obj.initParams3('foo')"); expectString("undefined/foo/undefined/0", "obj.initParams3()"); expectNumber(5 * 99, "obj.testParamWithAnyTypeWithoutWhitespaceSyntax()"); expectNumber(6 * 88, "obj.testParamWithAnyTypeWithoutWhitespaceSyntax2()"); } public void testRestParams() throws Exception { import_("package1.TestRestParams"); complete(); eval("obj = new package1.TestRestParams();"); expectNumber(3, "obj.anyParams(1,2,3);"); expectNumber(3, "obj.anyParamsOptimized(1,2,3);"); expectNumber(42, "obj.xAndAnyParams(40,2,3);"); } public void testArguments() throws Exception { import_("package1.TestArguments"); complete(); eval("obj = new package1.TestArguments();"); expectString("a,2,III", "obj.joinArguments('a',2,'III')"); expectString("a,2,III", "obj.joinArgumentsClassic('a',2,'III')"); expectString("a,2,III", "obj.joinArgumentsAuxVar('a',2,'III')"); expectString("a,2,III", "obj.joinRest('a',2,'III')"); expectString("a,2,III", "obj.joinExplicitArguments('a',2,'III')"); expectString("a/2/III", "obj.joinRestWithSeparator('/', 'a',2,'III')"); expectString("a/2/III", "obj.testArguments('a',2,'III').join('/')"); expectString("foo", "obj.testParameterShadesArguments('foo')"); } public void testGetterSetter() throws Exception { import_("package1.TestGetterSetter"); import_("package1.TestSetterOverride"); complete(); eval("obj = new package1.TestGetterSetter();"); eval("obj.foo = '1234';"); expectString("1234", "obj.foo"); eval("obj.foo = 'foo';"); expectString("NaN", "obj.foo"); eval("sub = new package1.TestSetterOverride();"); eval("sub.foo = '5678';"); expectString("15678", "sub.foo"); } public void testIs() throws Exception { import_("package1.TestIs"); import_("package1.TestImplementsSubInterface"); complete(); expectBoolean(true, "package1.TestIs.testIs(new package1.TestIs(), package1.TestIs)"); expectBoolean(true, "package1.TestIs.testIs(new package1.TestImplementsSubInterface(), package1.TestSubInterface)"); expectBoolean(true, "package1.TestIs.testIs(new package1.TestImplementsSubInterface(), package1.TestInterface)"); expectBoolean(false, "package1.TestIs.testIs(new package1.TestIs(), String)"); expectBoolean(true, "package1.TestIs.testIs('foo', String)"); expectBoolean(true, "package1.TestIs.testIs(new String('foo'), String)"); expectBoolean(true, "package1.TestIs.testIs(new TypeError('foo'), Error)"); expectBoolean(true, "package1.TestIs.testIs(new TypeError('foo'), TypeError)"); expectBoolean(true, "package1.TestIs.testIs(package1.TestIs, Class)"); expectBoolean(true, "package1.TestIs.testConcreteIs()"); expectBoolean(true, "package1.TestIs.testIsInt(0)"); expectBoolean(true, "package1.TestIs.testIsUint(0)"); expectBoolean(true, "package1.TestIs.testIsInt(123)"); expectBoolean(true, "package1.TestIs.testIsUint(123)"); expectBoolean(true, "package1.TestIs.testIsInt(new Number(123))"); expectBoolean(true, "package1.TestIs.testIsUint(new Number(123))"); expectBoolean(true, "package1.TestIs.testIsInt(-123)"); expectBoolean(false, "package1.TestIs.testIsUint(-123)"); expectBoolean(true, "package1.TestIs.testIsInt(new Number(-123))"); expectBoolean(false, "package1.TestIs.testIsUint(new Number(-123))"); expectBoolean(false, "package1.TestIs.testIsInt(123.4)"); expectBoolean(false, "package1.TestIs.testIsUint(123.4)"); expectBoolean(false, "package1.TestIs.testIsUint(123.4)"); expectBoolean(false, "package1.TestIs.testIsInt(-123.4)"); expectBoolean(false, "package1.TestIs.testIsUint(-123.4)"); expectBoolean(false, "package1.TestIs.testIsInt(NaN)"); expectBoolean(false, "package1.TestIs.testIsUint(NaN)"); expectBoolean(false, "package1.TestIs.testIsInt('foo')"); expectBoolean(false, "package1.TestIs.testIsUint('foo')"); } public void testCatch() throws Exception { // should also load class package3.ClassToImport even though merely referenced within type clause: import_("package1.TestCatch"); import_("package3.ClassToImport"); import_("package1.TestImplements"); complete(); expectString("TestInterface", "package1.TestCatch.testCatch(function() {throw new package1.TestImplements(); })"); expectBoolean(true, "package1.TestCatch.finallyExecuted"); expectString("ClassToImport", "package1.TestCatch.testCatch(function() {throw new package3.ClassToImport(); })"); expectBoolean(true, "package1.TestCatch.finallyExecuted"); expectException("package1.TestCatch.testFallThrough()"); } public void testInterface() throws Exception { import_("package1.TestImplements"); import_("package1.TestInheritImplements"); complete(); eval("obj = new package1.TestImplements();"); expectNumber(5, "obj.implementMe('house')"); expectBoolean(true, "joo.is(obj, package1.TestImplements)"); expectBoolean(true, "joo.is(obj, package1.TestInterface)"); expectBoolean(true, "joo.is(obj, Object)"); expectBoolean(false, "joo.is(obj, Number)"); eval("obj = new package1.TestInheritImplements();"); expectBoolean(true, "joo.is(obj, package1.TestInheritImplements)"); expectBoolean(true, "joo.is(obj, package1.TestInterface2)"); expectBoolean(true, "joo.is(obj, package1.TestImplements)"); expectBoolean(true, "joo.is(obj, package1.TestInterface)"); expectBoolean(true, "joo.is(obj, Object)"); expectBoolean(false, "joo.is(obj, Number)"); // TODO: test inheritance between interfaces and implementing multiple interfaces at once. } public void testBind() throws Exception { import_("package1.TestBind"); complete(); eval("obj = new package1.TestBind('foo');"); expectString("foo", "obj.getState()"); expectString("foo", "obj.testInvokeLocalVar()"); expectString("foo", "obj.testInvokeLocalVarUnqualified()"); expectString("foo", "obj.testInvokeParameter()"); expectString("foo", "obj.testInvokeParameterUnqualified()"); expectString("foo", "obj.testInvokeParameterUnqualifiedPrivate()"); expectString("foo", "obj.testInvokeObjectField()"); expectString("foo", "obj.testLocalFunction()"); expectNumber(55, "obj.testLocalFunctionIde()"); expectString("foo", "obj.testLocalFunctionUnqualified()"); expectString("bar", "obj.testNotBound.call({getState: function(){return 'bar';}})"); expectBoolean(true, "package1.TestBind.testStaticNotBound().call('bar')=='bar'"); expectString("foo", "obj.testInvokeLocalVarMethod()"); expectString("foo", "obj.testInvokeFieldMethod()"); expectString("foo", "obj.testInvokeFieldMethodThroughLocalFunction()"); expectString("foo", "obj.testInvokeFieldMethodThroughLocalFunctionExpr()"); expectString("sounds good", "obj.testDontInvokeFieldMethodThroughLocalFunction()"); expectString("sounds good", "obj.testDontInvokeFieldMethodThroughLocalFunctionExpr()"); expectString("foo", "obj.testReturn()"); expectBoolean(true, "obj.testBindMethodInBinaryOpExpr()"); //todo re-write this test to pass in Flex?! //expectString("undefined", "typeof obj.testBindNonExistentMethod()"); expectBoolean(true, "obj.testBindTwiceReturnsSameFunction()"); } public void testMultiDeclarations() throws Exception { import_("package1.TestMultiDeclarations"); complete(); eval("obj = new package1.TestMultiDeclarations();"); String expected = (String)eval("package1.TestMultiDeclarations.EXPECTED_RESULT"); expectString(expected, "obj.testFields()"); expectString(expected, "obj.testVariables()"); expectString("[This is a test]", "obj.testForLoops(['This','is','a','test'])"); } public void testJavaPackage() throws Exception { import_("net.jangaroo.test.JavaPackageTest"); complete(); eval("new net.jangaroo.test.JavaPackageTest();"); } public void testNew() throws Exception { import_("package2.TestNew"); complete(); eval("obj = new package2.TestNew()"); expectString("foo", "obj.foo()"); expectString("foo", "obj.testNewWithoutParens()"); expectString("foo", "obj.testNewCall()"); expectString("foo", "obj.testNewCallNoThis()"); expectString("foo", "package2.TestNew.testNewApplyExpr()"); expectString("foo", "package2.TestNew.testNewExpr()"); expectString("foo", "package2.TestNew.testNewStaticCall()"); expectString("foo", "package2.TestNew.testNewFullyQualified()"); expectString("foo", "package2.TestNew.testNewSuperClass()"); } public void testPackageHidesVar() throws Exception { import_("package1.TestPackageHidesVar"); complete(); eval("obj = new package1.TestPackageHidesVar()"); // todo known bug: //expectString("function", "obj.getTestClass()"); expectString("string", "obj.getClass()"); } public void testHelperClasses() throws Exception { import_("package1.TestHelperClasses"); complete(); expectString("FOO", "package1.TestHelperClasses.getConstantFromHelperClass()"); expectString("foo", "package1.TestHelperClasses.getText()"); } public void testAnnotations() throws Exception { import_("package1.TestAnnotations"); complete(); expectNumber(1, "package1.TestAnnotations.$class.metadata.ClassAnnotation.num"); expectBoolean(true, "package1.TestAnnotations.$class.metadata.ClassAnnotation.bool"); expectString("foo", "package1.TestAnnotations.$class.metadata.ClassAnnotation.str"); expectBoolean(true, "!!package1.TestAnnotations.$class.getMemberDeclaration('public','getState').metadata.Bindable"); expectBoolean(false, "package1.TestAnnotations.$class.getMemberDeclaration('private','state').metadata.Serializable.transitive"); // TODO: I did not yet find out how constructors are represented in AS3 reflection. //expectString("bar", "package1.TestAnnotations.$class.getMemberDeclaration('public','TestAnnotations').metadata.foo"); } public void testTrace() throws Exception { import_("package1.TestTrace"); complete(); eval("new package1.TestTrace()"); // TODO: so far, we only test for errors. Find a way to check the actual console output. } public void testVector() throws Exception { import_("package1.TestVector"); complete(); expectString("foo|bar", "package1.TestVector.testConstructorAndSingleAssignment('foo', 'bar')"); expectString("9|7", "package1.TestVector.testIntConstructorAndSingleAssignment(9, 7)"); expectString("foo|bar", "package1.TestVector.testConversion('foo', 'bar')"); expectString("foo|bar", "package1.TestVector.testLiteral('foo', 'bar')"); expectString("foo|bar", "package1.TestVector.testForEach('foo', 'bar')"); } public void testExtendError() throws Exception { import_("package1.TestExtendError"); complete(); eval("e = new package1.TestExtendError('foo', 12, {x:3})"); expectString("foo", "e.message"); expectNumber(12, "e.id"); expectNumber(3, "e.getData().x"); } public void testJavaScriptObject() throws Exception { import_("package1.TestIs"); import_("package2.TestInheritingJavaScriptObject"); complete(); eval("var o = new package2.TestInheritingJavaScriptObject()"); expectString("allProperties,bar,foo", "o.allProperties()"); // test that while "constructor" is not set, "is" still works: expectBoolean(true, "package1.TestIs.testIs(o, package2.TestInheritingJavaScriptObject)"); expectBoolean(true, "package1.TestIs.testIs(o, package2.TestJavaScriptObject)"); expectBoolean(true, "package1.TestIs.testIs(o, joo.JavaScriptObject)"); expectBoolean(true, "package1.TestIs.testIs(o, Object)"); expectBoolean(false, "package1.TestIs.testIs(o, String)"); } public void testRecursiveFunction() throws Exception { import_("package1.TestRecursiveFunction"); complete(); expectNumber(13, "new package1.TestRecursiveFunction().testFib(7)"); } public void testGlobalVariable() throws Exception { import_("package1.testVariable"); complete(); initClass("package1.testVariable"); expectNumber(1, "package1.testVariable.getSlot1()"); } public void testClassUsingGlobalVariable() throws Exception { import_("package1.TestTestVariable"); complete(); expectNumber(1, "package1.TestTestVariable.getTestVariable().getSlot1()"); } public void testGlobalFunction() throws Exception { import_("package1.testFunction"); complete(); expectNumber(1, "package1.testFunction().getSlot1()"); } public void testClassUsingGlobalFunction() throws Exception { import_("package1.TestTestFunction"); complete(); expectNumber(1, "package1.TestTestFunction.invokeTestFunction().getSlot1()"); } public static void main(String args[]) { junit.textui.TestRunner.run(JooTest.class); } }