diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index ecb272403..e2f86f2b4 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -56,7 +56,6 @@ public class ActionScript3Test extends ActionScriptTestBase { private SWF swf; - @BeforeClass public void init() throws IOException, InterruptedException { //Main.initLogging(false); @@ -146,128 +145,69 @@ public class ActionScript3Test extends ActionScriptTestBase { } @Test - public void testHello() { - decompileMethod("testHello", "trace(\"hello\");\r\n", false); + public void testArguments() { + decompileMethod("testArguments", "return arguments[0];\r\n", + false); } @Test - public void testIncDec() { - decompileMethod("testIncDec", "var a:* = 5;\r\n" - + "var b:* = 0;\r\n" - + "trace(\"++var\");\r\n" - + "b = ++a;\r\n" - + "trace(\"var++\");\r\n" - + "b = a++;\r\n" - + "trace(\"--var\");\r\n" - + "b = --a;\r\n" - + "trace(\"var--\");\r\n" - + "b = a--;\r\n" - + "var c:* = [1,2,3,4,5];\r\n" - + "trace(\"++arr\");\r\n" - + "b = ++c[2];\r\n" - + "trace(\"arr++\");\r\n" - + "b = c[2]++;\r\n" - + "trace(\"--arr\");\r\n" - + "b = --c[2];\r\n" - + "trace(\"arr--\");\r\n" - + "b = c[2]--;\r\n" - + "var d:* = new TestClass1();\r\n" - + "trace(\"++property\");\r\n" - + "trace(++d.attrib);\r\n" - + "trace(\"property++\");\r\n" - + "trace(d.attrib++);\r\n" - + "trace(\"--property\");\r\n" - + "trace(--d.attrib);\r\n" - + "trace(\"property--\");\r\n" - + "trace(d.attrib--);\r\n" - + "trace(\"arr[e++]\");\r\n" - + "var chars:Array = new Array(36);\r\n" - + "var index:uint = 0;\r\n" - + "chars[index++] = 5;\r\n" - + "trace(\"arr[++e]\");\r\n" - + "chars[++index] = 5;\r\n", false); - } - - @Test - public void testDoWhile() { - decompileMethod("testDoWhile", "var a:* = 8;\r\n" - + "do\r\n" - + "{\r\n" - + "trace(\"a=\" + a);\r\n" - + "a++;\r\n" - + "}\r\n" - + "while(a < 20);\r\n" - + "\r\n", false); - } - - @Test - public void testInnerTry() { - decompileMethod("testInnerTry", "try\r\n" - + "{\r\n" + public void testCatchFinally() { + decompileMethod("testCatchFinally", "var a:* = 5;\r\n" + "try\r\n" + "{\r\n" - + "trace(\"try body 1\");\r\n" + + "a = 9;\r\n" + + "trace(\"intry\");\r\n" + "}\r\n" - + "catch(e:DefinitionError)\r\n" + + "catch(e:*)\r\n" + "{\r\n" - + "trace(\"catched DefinitionError\");\r\n" - + "}\r\n" - + "trace(\"after try 1\");\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"catched Error\");\r\n" + + "trace(\"incatch\");\r\n" + "}\r\n" + "finally\r\n" + "{\r\n" - + "trace(\"finally block\");\r\n" - + "}\r\n", false); + + "trace(\"infinally\");\r\n" + + "}\r\n", + false); } @Test - public void testWhileContinue() { - decompileMethod("testWhileContinue", "var a:* = 5;\r\n" - + "while(true)\r\n" + public void testChain2() { + decompileMethod("testChain2", "var g:Array = null;\r\n" + + "var h:Boolean = false;\r\n" + + "var extraLine:Boolean = false;\r\n" + + "var r:int = 7;\r\n" + + "var t:int = 0;\r\n" + + "t = this.getInt();\r\n" + + "if(t + 1 < g.length)\r\n" + "{\r\n" - + "if(a == 9)\r\n" - + "{\r\n" - + "if(a == 8)\r\n" - + "{\r\n" - + "continue;\r\n" + + "t++;\r\n" + + "h = true;\r\n" + "}\r\n" - + "if(a == 9)\r\n" + + "if(t >= 0)\r\n" + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello 1\");\r\n" - + "}\r\n" - + "trace(\"hello2\");\r\n" - + "}\r\n", false); + + "trace(\"ch\");\r\n" + + "}\r\n", + false); } @Test - public void testPrecedence() { - decompileMethod("testPrecedence", "var a:* = 0;\r\n" - + "a = (5 + 6) * 7;\r\n" - + "a = 5 * (2 + 3);\r\n" - + "a = 5 + 6 * 7;\r\n" - + "a = 5 * 2 + 2;\r\n" - + "a = 5 * (25 % 3);\r\n" - + "a = 5 % (24 * 307);\r\n" - + "a = 1 / (2 / 3);\r\n" - + "a = 1 / (2 * 3);\r\n" - + "a = 1 * 2 * 3;\r\n" - + "a = 1 * 2 / 3;\r\n" - + "trace(\"a=\" + a);\r\n", false); + public void testChainedAssignments() { + decompileMethod("testChainedAssignments", "var a:int = 0;\r\n" + + "var b:int = 0;\r\n" + + "var c:int = 0;\r\n" + + "var d:int = 0;\r\n" + + "d = c = b = a = 5;\r\n" + + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" + + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" + + "this.traceIt(e.toString());\r\n", + false); } @Test - public void testStrings() { - decompileMethod("testStrings", "trace(\"hello\");\r\n" - + "trace(\"quotes:\\\"hello!\\\"\");\r\n" - + "trace(\"backslash: \\\\ \");\r\n" - + "trace(\"single quotes: \\'hello!\\'\");\r\n" - + "trace(\"new line \\r\\n hello!\");\r\n", false); + public void testComplexExpressions() { + decompileMethod("testComplexExpressions", "var i:int = 0;\r\n" + + "var j:int = 0;\r\n" + + "j = i = i + (i = i + i++);\r\n", + false); } @Test @@ -330,88 +270,138 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "}\r\n" + "trace(\"hello\");\r\n" - + "}\r\n", false); + + "}\r\n", + false); } @Test - public void testSwitchDefault() { - decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" - + "switch(a)\r\n" + public void testDecl2() { + decompileMethod("testDecl2", "var k:int = 0;\r\n" + + "var i:int = 5;\r\n" + + "i = i + 7;\r\n" + + "if(i == 5)\r\n" + + "{\r\n" + + "if(i < 8)\r\n" + + "{\r\n" + + "k = 6;\r\n" + + "}\r\n" + + "}\r\n" + + "k = 7;\r\n", + false); + } + + @Test + public void testDeclarations() { + decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" + + "var vstr:String = null;\r\n" + + "var vint:int = 0;\r\n" + + "var vuint:uint = 0;\r\n" + + "var vclass:TestClass1 = null;\r\n" + + "var vnumber:Number = NaN;\r\n" + + "var vobject:Object = null;\r\n" + + "vall = 6;\r\n" + + "vstr = \"hello\";\r\n" + + "vuint = 7;\r\n" + + "vint = -4;\r\n" + + "vclass = new TestClass1();\r\n" + + "vnumber = 0.5;\r\n" + + "vnumber = 6;\r\n" + + "vobject = vclass;\r\n", + false); + } + + @Test + public void testDefaultNotLastGrouped() { + decompileMethod("testDefaultNotLastGrouped", "var k:* = 10;\r\n" + + "switch(k)\r\n" + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "break;\r\n" + "default:\r\n" - + "trace(\"default clause\");\r\n" - + "}\r\n", false); - } - - @Test - public void testMultipleCondition() { - decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" - + "var b:* = 8;\r\n" - + "var c:* = 9;\r\n" - + "if((a <= 4 || b <= 8) && c == 7)\r\n" - + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"onFalse\");\r\n" - + "}\r\n", false); - } - - @Test - public void testForBreak() { - /*decompileMethod("testForBreak", "var a:* = 0;\r\n" - + "while(a < 10)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello:\" + a);\r\n" - + "a++;\r\n" - + "}\r\n", false);*/ - // Issue 842, recover for loops - decompileMethod("testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" + + "case \"six\":\r\n" + + "trace(\"def and 6\");\r\n" + + "case \"five\":\r\n" + + "trace(\"def and 6 and 5\");\r\n" + "break;\r\n" + + "case \"four\":\r\n" + + "trace(\"4\");\r\n" + "}\r\n" - + "trace(\"hello:\" + a);\r\n" - + "}\r\n", false); + + "trace(\"after switch\");\r\n", + false); } @Test - public void testIf() { - decompileMethod("testIf", "var a:* = 5;\r\n" - + "if(a == 7)\r\n" + public void testDoWhile() { + decompileMethod("testDoWhile", "var a:* = 8;\r\n" + + "do\r\n" + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n", false); + + "trace(\"a=\" + a);\r\n" + + "a++;\r\n" + + "}\r\n" + + "while(a < 20);\r\n", + false); } @Test - public void testIfElse() { - decompileMethod("testIfElse", "var a:* = 5;\r\n" - + "if(a == 7)\r\n" + public void testDoWhile2() { + decompileMethod("testDoWhile2", "var k:int = 5;\r\n" + + "do\r\n" + "{\r\n" - + "trace(\"onTrue\");\r\n" + + "k++;\r\n" + + "if(k == 7)\r\n" + + "{\r\n" + + "k = 5 * k;\r\n" + "}\r\n" + "else\r\n" + "{\r\n" - + "trace(\"onFalse\");\r\n" - + "}\r\n", false); + + "k = 5 - k;\r\n" + + "}\r\n" + + "k--;\r\n" + + "}\r\n" + + "while(k < 9);\r\n" + + "return 2;\r\n", + false); + } + + @Test + public void testExpressions() { + decompileMethod("testExpressions", "var arr:Array = null;\r\n" + + "var i:int = 5;\r\n" + + "var j:int = 5;\r\n" + + "if((i = i = i / 2) == 1 || i == 2)\r\n" + + "{\r\n" + + "arguments.concat(i);\r\n" + + "}\r\n" + + "else if(i == 0)\r\n" + + "{\r\n" + + "i = j++;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "arr[0]();\r\n" + + "}\r\n" + + "return i == 0;\r\n", + false); + } + + @Test + public void testFinallyZeroJump() { + decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" + + "try\r\n" + + "{\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"error is :\" + e.message);\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"hi \");\r\n" + + "if(5 == 4)\r\n" + + "{\r\n" + + "return str;\r\n" + + "}\r\n" + + "return \"hu\" + str;\r\n" + + "}\r\n", + false); } @Test @@ -419,7 +409,46 @@ public class ActionScript3Test extends ActionScriptTestBase { decompileMethod("testFor", "for(var a:* = 0; a < 10; a++)\r\n" + "{\r\n" + "trace(\"a=\" + a);\r\n" - + "}\r\n", false); + + "}\r\n", + false); + } + + @Test + public void testForAnd() { + decompileMethod("testForAnd", "var x:Boolean = false;\r\n" + + "var len:int = 5;\r\n" + + "var a:int = 4;\r\n" + + "var b:int = 7;\r\n" + + "var c:int = 9;\r\n" + + "for(var i:uint = 0; i < len; x = a > 4 && b < 2 || c > 10)\r\n" + + "{\r\n" + + "c = 1;\r\n" + + "if(c == 2)\r\n" + + "{\r\n" + + "trace(\"A\");\r\n" + + "if(c == 7)\r\n" + + "{\r\n" + + "trace(\"B\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"C\");\r\n" + + "}\r\n" + + "trace(\"D\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testForBreak() { + decompileMethod("testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" + + "{\r\n" + + "if(a == 5)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello:\" + a);\r\n" + + "}\r\n", + false); } @Test @@ -446,70 +475,247 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"part4\");\r\n" + "}\r\n" + "trace(\"part5\");\r\n" - + "}\r\n", false); + + "}\r\n", + false); } @Test - public void testTry() { - decompileMethod("testTry", "var i:int = 0;\r\n" - + "i = 7;\r\n" - + "try\r\n" + public void testForEach() { + decompileMethod("testForEach", "var list:Array = null;\r\n" + + "var item:* = undefined;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "for each(item in list)\r\n" + "{\r\n" - + "trace(\"try body\");\r\n" - + "}\r\n" - + "catch(e:DefinitionError)\r\n" - + "{\r\n" - + "trace(\"catched DefinitionError\");\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"Error message:\" + e.message);\r\n" - + "trace(\"Stacktrace:\" + e.getStackTrace());\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"Finally part\");\r\n" - + "}\r\n" - + "trace(\"end\");\r\n", false); - } - - //@Test //todo: enable test - public void testTryShouldHaveCatchOrFinally() { - decompileMethod("testTryShouldHaveCatchOrFinally", "try\r\n" - + "{\r\n" - + "trace(\"try body\");\r\n" - + "}\r\n" - + "finally\n\n" - + "{\r\n" - + "}\r\n", false); + + "trace(\"item #\" + item);\r\n" + + "}\r\n", + false); } @Test - public void testSwitch() { - decompileMethod("testSwitch", "var a:* = 5;\r\n" - + "switch(a)\r\n" + public void testForEachObjectArray() { + decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" + + "var test:Array = null;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "test = new Array();\r\n" + + "test[0] = 0;\r\n" + + "for each(test[0] in list)\r\n" + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "}\r\n", false); + + "trace(\"item #\" + test[0]);\r\n" + + "}\r\n", + false); } @Test - public void testTernarOperator() { - decompileMethod("testTernarOperator", "var a:* = 5;\r\n" - + "var b:* = 4;\r\n" - + "var c:* = 4;\r\n" - + "var d:* = 78;\r\n" - + "var e:* = a == b?c == d?1:7:3;\r\n" - + "trace(\"e=\" + e);\r\n", false); + public void testForEachObjectAttribute() { + decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "for each(this.testPriv in list)\r\n" + + "{\r\n" + + "trace(\"item #\" + this.testPriv);\r\n" + + "}\r\n", + false); + } + + @Test + public void testForGoto() { + decompileMethod("testForGoto", "var c:int = 0;\r\n" + + "var len:int = 5;\r\n" + + "for(var i:uint = 0; i < len; i++)\r\n" + + "{\r\n" + + "c = 1;\r\n" + + "if(c == 2)\r\n" + + "{\r\n" + + "trace(\"A\");\r\n" + + "}\r\n" + + "else if(c == 3)\r\n" + + "{\r\n" + + "trace(\"B\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"C\");\r\n" + + "}\r\n" + + "trace(\"exit\");\r\n", + false); + } + + @Test + public void testForIn() { + decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" + + "var item:* = null;\r\n" + + "for(item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n" + + "for each(item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n", + false); + } + + @Test + public void testForXml() { + decompileMethod("testForXml", "var c:int = 0;\r\n" + + "var name:String = \"ahoj\";\r\n" + + "var myXML:XML = \r\n" + + "\r\n" + + "{name}\r\n" + + "\r\n" + + ";\r\n" + + "var k:* = null;\r\n" + + "var len:int = 5;\r\n" + + "var a:int = 5;\r\n" + + "var b:int = 6;\r\n" + + "for(var i:int = 0; i < len; k = myXML.book.(@isbn = \"12345\"))\r\n" + + "{\r\n" + + "c = 1;\r\n" + + "if(c == 2)\r\n" + + "{\r\n" + + "trace(\"A\");\r\n" + + "}\r\n" + + "else if(c == 3)\r\n" + + "{\r\n" + + "trace(\"B\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"C\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testHello() { + decompileMethod("testHello", "trace(\"hello\");\r\n", + false); + } + + @Test + public void testIf() { + decompileMethod("testIf", "var a:* = 5;\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testIfElse() { + decompileMethod("testIfElse", "var a:* = 5;\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testInc2() { + decompileMethod("testInc2", "var a:* = [1];\r\n" + + "a[this.getInt()]++;\r\n" + + "var d:* = a[this.getInt()]++;\r\n" + + "var e:* = ++a[this.getInt()];\r\n" + + "var b:* = 1;\r\n" + + "b++;\r\n" + + "var c:* = 1;\r\n" + + "b = c++;\r\n", + false); + } + + @Test + public void testIncDec() { + decompileMethod("testIncDec", "var a:* = 5;\r\n" + + "var b:* = 0;\r\n" + + "trace(\"++var\");\r\n" + + "b = ++a;\r\n" + + "trace(\"var++\");\r\n" + + "b = a++;\r\n" + + "trace(\"--var\");\r\n" + + "b = --a;\r\n" + + "trace(\"var--\");\r\n" + + "b = a--;\r\n" + + "var c:* = [1,2,3,4,5];\r\n" + + "trace(\"++arr\");\r\n" + + "b = ++c[2];\r\n" + + "trace(\"arr++\");\r\n" + + "b = c[2]++;\r\n" + + "trace(\"--arr\");\r\n" + + "b = --c[2];\r\n" + + "trace(\"arr--\");\r\n" + + "b = c[2]--;\r\n" + + "var d:* = new TestClass1();\r\n" + + "trace(\"++property\");\r\n" + + "trace(++d.attrib);\r\n" + + "trace(\"property++\");\r\n" + + "trace(d.attrib++);\r\n" + + "trace(\"--property\");\r\n" + + "trace(--d.attrib);\r\n" + + "trace(\"property--\");\r\n" + + "trace(d.attrib--);\r\n" + + "trace(\"arr[e++]\");\r\n" + + "var chars:Array = new Array(36);\r\n" + + "var index:uint = 0;\r\n" + + "chars[index++] = 5;\r\n" + + "trace(\"arr[++e]\");\r\n" + + "chars[++index] = 5;\r\n", + false); + } + + @Test + public void testInlineFunctions() { + decompileMethod("testInlineFunctions", "var first:String = null;\r\n" + + "first = \"value1\";\r\n" + + "var traceParameter:Function = function(aParam:String):String\r\n" + + "{\r\n" + + "var second:String = null;\r\n" + + "second = \"value2\";\r\n" + + "second = second + \"cc\";\r\n" + + "var traceParam2:Function = function(bParam:String):String\r\n" + + "{\r\n" + + "trace(bParam + \",\" + aParam);\r\n" + + "return first + second + aParam + bParam;\r\n" + + "};\r\n" + + "trace(second);\r\n" + + "traceParam2(aParam);\r\n" + + "return first;\r\n" + + "};\r\n" + + "traceParameter(\"hello\");\r\n", + false); + } + + @Test + public void testInnerFunctions() { + decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" + + "var innerFunc:Function = function(b:String):*\r\n" + + "{\r\n" + + "trace(b);\r\n" + + "};\r\n" + + "var k:int = 5;\r\n" + + "if(k == 6)\r\n" + + "{\r\n" + + "s = 8;\r\n" + + "}\r\n" + + "innerFunc(a);\r\n", + false); } @Test @@ -535,107 +741,54 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"b!=7\");\r\n" + "}\r\n" - + "\r\n" - + "trace(\"end\");\r\n", false); + + "trace(\"end\");\r\n", + false); } @Test - public void testVector() { - decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" - + "v.push(\"hello\");\r\n" - + "v[0] = \"hi\";\r\n" - + "v[5 * 8 - 39] = \"hi2\";\r\n" - + "trace(v[0]);\r\n", false); - } - - @Test - public void testProperty() { - decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" - + "var k:* = 7 + 8;\r\n" - + "if(k == 15)\r\n" + public void testInnerTry() { + decompileMethod("testInnerTry", "try\r\n" + "{\r\n" - + "d.method(d.attrib * 5);\r\n" - + "}\r\n", false); - } - - @Test - public void testRest() { - decompileMethod("testRest", "trace(\"firstRest:\" + restval[0]);\r\n" - + "return firstp;\r\n", false); - } - - @Test - public void testParamNames() { - decompileMethod("testParamNames", "return firstp + secondp + thirdp;\r\n", false); - } - - @Test - public void testForEach() { - decompileMethod("testForEach", "var list:Array = null;\r\n" - + "var item:* = undefined;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "for each(item in list)\r\n" + + "try\r\n" + "{\r\n" - + "trace(\"item #\" + item);\r\n" - + "}\r\n", false); + + "trace(\"try body 1\");\r\n" + + "}\r\n" + + "catch(e:DefinitionError)\r\n" + + "{\r\n" + + "trace(\"catched DefinitionError\");\r\n" + + "}\r\n" + + "trace(\"after try 1\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"catched Error\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"finally block\");\r\n" + + "}\r\n", + false); } @Test - public void testForEachObjectArray() { - decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" - + "var test:Array = null;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "test = new Array();\r\n" - + "test[0] = 0;\r\n" - + "for each(test[0] in list)\r\n" + public void testLogicalComputing() { + decompileMethod("testLogicalComputing", "var b:Boolean = false;\r\n" + + "var i:* = 5;\r\n" + + "var j:* = 7;\r\n" + + "if(i > j)\r\n" + "{\r\n" - + "trace(\"item #\" + test[0]);\r\n" - + "}\r\n", false); + + "j = 9;\r\n" + + "b = true;\r\n" + + "}\r\n" + + "b = (i == 0 || i == 1) && j == 0;\r\n", + false); } @Test - public void testForEachObjectAttribute() { - decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "for each(this.testPriv in list)\r\n" - + "{\r\n" - + "trace(\"item #\" + this.testPriv);\r\n" - + "}\r\n", false); - } - - @Test - public void testParamsCount() { - decompileMethod("testParamsCount", "return firstp;\r\n", false); - } - - @Test - public void testInlineFunctions() { - decompileMethod("testInlineFunctions", "var first:String = null;\r\n" - + "first = \"value1\";\r\n" - + "var traceParameter:Function = function(aParam:String):String\r\n" - + "{\r\n" - + "var second:String = null;\r\n" - + "second = \"value2\";\r\n" - + "second = second + \"cc\";\r\n" - + "var traceParam2:Function = function(bParam:String):String\r\n" - + "{\r\n" - + "trace(bParam + \",\" + aParam);\r\n" - + "return first + second + aParam + bParam;\r\n" - + "};\r\n" - + "trace(second);\r\n" - + "traceParam2(aParam);\r\n" - + "return first;\r\n" - + "};\r\n" - + "traceParameter(\"hello\");\r\n", false); + public void testManualConvert() { + decompileMethod("testManualConvert", "trace(\"String(this).length\");\r\n" + + "trace(String(this).length);\r\n", + false); } @Test @@ -651,88 +804,33 @@ public class ActionScript3Test extends ActionScriptTestBase { + "break;\r\n" + "default:\r\n" + "jj = 3;\r\n" - + "}\r\n", false); + + "}\r\n", + false); } @Test - public void testChainedAssignments() { - decompileMethod("testChainedAssignments", "var a:int = 0;\r\n" - + "var b:int = 0;\r\n" - + "var c:int = 0;\r\n" - + "var d:int = 0;\r\n" - + "d = c = b = a = 5;\r\n" - + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" - + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" - + "this.traceIt(e.toString());\r\n", false); + public void testMultipleCondition() { + decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" + + "var b:* = 8;\r\n" + + "var c:* = 9;\r\n" + + "if((a <= 4 || b <= 8) && c == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", + false); } @Test - public void testFinallyZeroJump() { - decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" - + "try\r\n" + public void testNamedAnonFunctions() { + decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + "{\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"error is :\" + e.message);\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"hi \");\r\n" - + "if(5 == 4)\r\n" - + "{\r\n" - + "return str;\r\n" - + "}\r\n" - + "return \"hu\" + str;\r\n" - + "}\r\n", false); - } - - @Test - public void testInnerFunctions() { - decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" - + "var innerFunc:Function = function(b:String):*\r\n" - + "{\r\n" - + "trace(b);\r\n" - + "};\r\n" - + "var k:int = 5;\r\n" - + "if(k == 6)\r\n" - + "{\r\n" - + "s = 8;\r\n" - + "}\r\n" - + "innerFunc(a);\r\n", false); - } - - @Test - public void testDeclarations() { - decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" - + "var vstr:String = null;\r\n" - + "var vint:int = 0;\r\n" - + "var vuint:uint = 0;\r\n" - + "var vclass:TestClass1 = null;\r\n" - + "var vnumber:Number = NaN;\r\n" - + "var vobject:Object = null;\r\n" - + "vall = 6;\r\n" - + "vstr = \"hello\";\r\n" - + "vuint = 7;\r\n" - + "vint = -4;\r\n" - + "vclass = new TestClass1();\r\n" - + "vnumber = 0.5;\r\n" - + "vnumber = 6;\r\n" - + "vobject = vclass;\r\n", false); - } - - @Test - public void testForIn() { - decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" - + "var item:* = null;\r\n" - + "for(item in dic)\r\n" - + "{\r\n" - + "trace(item);\r\n" - + "}\r\n" - + "for each(item in dic)\r\n" - + "{\r\n" - + "trace(item);\r\n" - + "}\r\n", false); + + "return (param1 as TestClass2).attrib1 == 5;\r\n" + + "};\r\n", + false); } @Test @@ -742,141 +840,74 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var a:* = ns::unnamespacedFunc();\r\n" + "var b:* = ns::[name];\r\n" + "trace(b.c);\r\n" - + "var c:* = myInternal::neco;\r\n", false); + + "var c:* = myInternal::neco;\r\n", + false); } @Test - public void testComplexExpressions() { - decompileMethod("testComplexExpressions", "var i:int = 0;\r\n" - + "var j:int = 0;\r\n" - + "j = i = i + (i = i + i++);\r\n", false); + public void testParamNames() { + decompileMethod("testParamNames", "return firstp + secondp + thirdp;\r\n", + false); } @Test - public void testExpressions() { - decompileMethod("testExpressions", "var arr:Array = null;\r\n" - + "var i:int = 5;\r\n" - + "var j:int = 5;\r\n" - + "if((i = i = i / 2) == 1 || i == 2)\r\n" - + "{\r\n" - + "arguments.concat(i);\r\n" - + "}\r\n" - + "else if(i == 0)\r\n" - + "{\r\n" - + "i = j++;\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "arr[0]();\r\n" - + "}\r\n" - + "\r\n" - + "return i == 0;\r\n", false); + public void testParamsCount() { + decompileMethod("testParamsCount", "return firstp;\r\n", + false); } @Test - public void testArguments() { - decompileMethod("testArguments", "return arguments[0];\r\n", false); + public void testPrecedence() { + decompileMethod("testPrecedence", "var a:* = 0;\r\n" + + "a = (5 + 6) * 7;\r\n" + + "a = 5 * (2 + 3);\r\n" + + "a = 5 + 6 * 7;\r\n" + + "a = 5 * 2 + 2;\r\n" + + "a = 5 * (25 % 3);\r\n" + + "a = 5 % (24 * 307);\r\n" + + "a = 1 / (2 / 3);\r\n" + + "a = 1 / (2 * 3);\r\n" + + "a = 1 * 2 * 3;\r\n" + + "a = 1 * 2 / 3;\r\n" + + "trace(\"a=\" + a);\r\n", + false); } @Test - public void testLogicalComputing() { - decompileMethod("testLogicalComputing", "var b:Boolean = false;\r\n" - + "var i:* = 5;\r\n" - + "var j:* = 7;\r\n" - + "if(i > j)\r\n" - + "{\r\n" - + "j = 9;\r\n" - + "b = true;\r\n" - + "}\r\n" - + "b = (i == 0 || i == 1) && j == 0;\r\n", false); + public void testPrecedenceX() { + decompileMethod("testPrecedenceX", "var a:* = 5;\r\n" + + "var b:* = 2;\r\n" + + "var c:* = 3;\r\n" + + "var d:* = a << (b >>> c);\r\n" + + "var e:* = a << b >>> c;\r\n", + false); } @Test - public void testInc2() { - decompileMethod("testInc2", "var a:* = [1];\r\n" - + "a[this.getInt()]++;\r\n" - + "var d:* = a[this.getInt()]++;\r\n" - + "var e:* = ++a[this.getInt()];\r\n" - + "var b:* = 1;\r\n" - + "b++;\r\n" - + "var c:* = 1;\r\n" - + "b = c++;\r\n", false); + public void testProperty() { + decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" + + "var k:* = 7 + 8;\r\n" + + "if(k == 15)\r\n" + + "{\r\n" + + "d.method(d.attrib * 5);\r\n" + + "}\r\n", + false); } @Test - public void testDecl2() { - decompileMethod("testDecl2", "var k:int = 0;\r\n" - + "var i:int = 5;\r\n" - + "i = i + 7;\r\n" - + "if(i == 5)\r\n" - + "{\r\n" - + "if(i < 8)\r\n" - + "{\r\n" - + "k = 6;\r\n" - + "}\r\n" - + "}\r\n" - + "k = 7;\r\n", false); + public void testRegExp() { + decompileMethod("testRegExp", "var a1:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" + + "var a2:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" + + "var b1:* = /[0-9AB]+/;\r\n" + + "var b2:* = /[0-9AB]+/;\r\n", + false); } @Test - public void testChain2() { - decompileMethod("testChain2", "var g:Array = null;\r\n" - + "var h:Boolean = false;\r\n" - + "var extraLine:Boolean = false;\r\n" - + "var r:int = 7;\r\n" - + "var t:int = 0;\r\n" - + "t = this.getInt();\r\n" - + "if(t + 1 < g.length)\r\n" - + "{\r\n" - + "t++;\r\n" - + "h = true;\r\n" - + "}\r\n" - + "if(t >= 0)\r\n" - + "{\r\n" - + "trace(\"ch\");\r\n" - + "}\r\n", false); - } - - @Test - public void testDoWhile2() { - decompileMethod("testDoWhile2", "var k:int = 5;\r\n" - + "do\r\n" - + "{\r\n" - + "k++;\r\n" - + "if(k == 7)\r\n" - + "{\r\n" - + "k = 5 * k;\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "k = 5 - k;\r\n" - + "}\r\n" - + "k--;\r\n" - + "}\r\n" - + "while(k < 9);\r\n" - + "\r\n" - + "return 2;\r\n", false); - } - - @Test - public void testWhileAnd() { - decompileMethod("testWhileAnd", "var a:int = 5;\r\n" - + "var b:int = 10;\r\n" - + "while(a < 10 && b > 1)\r\n" - + "{\r\n" - + "a++;\r\n" - + "b--;\r\n" - + "}\r\n" - + "a = 7;\r\n" - + "b = 9;\r\n", false); - } - - @Test - public void testNamedAnonFunctions() { - decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" - + "{\r\n" - + "return (param1 as TestClass2).attrib1 == 5;\r\n" - + "};\r\n", false); + public void testRest() { + decompileMethod("testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + + "return firstp;\r\n", + false); } @Test @@ -884,54 +915,95 @@ public class ActionScript3Test extends ActionScriptTestBase { decompileMethod("testStringConcat", "var k:int = 8;\r\n" + "this.traceIt(\"hello\" + 5 * 6);\r\n" + "this.traceIt(\"hello\" + (k - 1));\r\n" - + "this.traceIt(\"hello\" + 5 + 6);\r\n", false); + + "this.traceIt(\"hello\" + 5 + 6);\r\n", + false); } @Test - public void testWhileTry() { - decompileMethod("testWhileTry", "while(true)\r\n" - + "{\r\n" - + "try\r\n" - + "{\r\n" - + "while(true)\r\n" - + "{\r\n" - + "trace(\"a\");\r\n" - + "}\r\n" - + "}\r\n" - + "catch(e:EOFError)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "}\r\n", false); + public void testStrings() { + decompileMethod("testStrings", "trace(\"hello\");\r\n" + + "trace(\"quotes:\\\"hello!\\\"\");\r\n" + + "trace(\"backslash: \\\\ \");\r\n" + + "trace(\"single quotes: \\'hello!\\'\");\r\n" + + "trace(\"new line \\r\\n hello!\");\r\n", + false); } @Test - public void testWhileTry2() { - decompileMethod("testWhileTry2", "var j:* = undefined;\r\n" - + "for(var i:* = 0; i < 100; i++)\r\n" + public void testSwitch() { + decompileMethod("testSwitch", "var a:* = 5;\r\n" + + "switch(a)\r\n" + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testSwitchDefault() { + decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"default clause\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testTernarOperator() { + decompileMethod("testTernarOperator", "var a:* = 5;\r\n" + + "var b:* = 4;\r\n" + + "var c:* = 4;\r\n" + + "var d:* = 78;\r\n" + + "var e:* = a == b?c == d?1:7:3;\r\n" + + "trace(\"e=\" + e);\r\n", + false); + } + + @Test + public void testTry() { + decompileMethod("testTry", "var i:int = 0;\r\n" + + "i = 7;\r\n" + "try\r\n" + "{\r\n" - + "for(j = 0; j < 20; j++)\r\n" - + "{\r\n" - + "trace(\"a\");\r\n" + + "trace(\"try body\");\r\n" + "}\r\n" - + "}\r\n" - + "catch(e:EOFError)\r\n" + + "catch(e:DefinitionError)\r\n" + "{\r\n" - + "continue;\r\n" + + "trace(\"catched DefinitionError\");\r\n" + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "continue;\r\n" + + "trace(\"Error message:\" + e.message);\r\n" + + "trace(\"Stacktrace:\" + e.getStackTrace());\r\n" + "}\r\n" - + "trace(\"after_try\");\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"Finally part\");\r\n" + "}\r\n" - + "trace(\"end\");\r\n", false); + + "trace(\"end\");\r\n", + false); } @Test @@ -958,202 +1030,110 @@ public class ActionScript3Test extends ActionScriptTestBase { + "catch(e:Error)\r\n" + "{\r\n" + "}\r\n" - + "return 4;\r\n", false); + + "return 4;\r\n", + false); + } + + @Test + public void testVector() { + decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" + + "v.push(\"hello\");\r\n" + + "v[0] = \"hi\";\r\n" + + "v[5 * 8 - 39] = \"hi2\";\r\n" + + "trace(v[0]);\r\n", + false); } @Test public void testVector2() { decompileMethod("testVector2", "var a:Vector.> = new Vector.>();\r\n" - + "var b:Vector. = new [10,20,30];\r\n", false); + + "var b:Vector. = new [10,20,30];\r\n", + false); } - public void testFinallyOnly() { - decompileMethod("testFinallyOnly", "var a:* = 5;\r\n" + @Test + public void testWhileAnd() { + decompileMethod("testWhileAnd", "var a:int = 5;\r\n" + + "var b:int = 10;\r\n" + + "while(a < 10 && b > 1)\r\n" + + "{\r\n" + + "a++;\r\n" + + "b--;\r\n" + + "}\r\n" + + "a = 7;\r\n" + + "b = 9;\r\n", + false); + } + + @Test + public void testWhileContinue() { + decompileMethod("testWhileContinue", "var a:* = 5;\r\n" + + "while(true)\r\n" + + "{\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "if(a == 8)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello 1\");\r\n" + + "}\r\n" + + "trace(\"hello2\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testWhileTry() { + decompileMethod("testWhileTry", "while(true)\r\n" + + "{\r\n" + "try\r\n" + "{\r\n" - + "a = 9;\r\n" - + "trace(\"intry\");\r\n" - + "}\r\n" - + "finally\r\n" + + "while(true)\r\n" + "{\r\n" - + "trace(\"infinally\");\r\n" - + "}\r\n", false); + + "trace(\"a\");\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "}\r\n", + false); } @Test - public void testCatchFinally() { - decompileMethod("testCatchFinally", "var a:* = 5;\r\n" + public void testWhileTry2() { + decompileMethod("testWhileTry2", "var j:* = undefined;\r\n" + + "for(var i:* = 0; i < 100; i++)\r\n" + + "{\r\n" + "try\r\n" + "{\r\n" - + "a = 9;\r\n" - + "trace(\"intry\");\r\n" - + "}\r\n" - + "catch(e:*)\r\n" + + "for(j = 0; j < 20; j++)\r\n" + "{\r\n" - + "trace(\"incatch\");\r\n" + + "trace(\"a\");\r\n" + "}\r\n" - + "finally\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + "{\r\n" - + "trace(\"infinally\");\r\n" - + "}\r\n", false); - } - - @Test - public void testMyPackage1TestClass() { - decompileScriptPack("tests_classes.mypackage1.TestClass", "package tests_classes.mypackage1\n" - + "{\n" - + " public class TestClass implements tests_classes.mypackage1.TestInterface\n" - + " {\n" - + " \n" - + " public function TestClass()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " trace(\"pkg1hello\");\n" - + " return \"pkg1hello\";\n" - + " }\n" - + " \n" - + " public function testMethod1() : void\n" - + " {\n" - + " var a:tests_classes.mypackage1.TestInterface = this;\n" - + " a.testMethod1();\n" - + " var b:tests_classes.mypackage2.TestInterface = this;\n" - + " b = new tests_classes.mypackage2.TestClass();\n" - + " }\n" - + " \n" - + " public function testMethod2() : void\n" - + " {\n" - + " var a:tests_classes.mypackage1.TestInterface = this;\n" - + " a.testMethod1();\n" - + " var b:tests_classes.mypackage2.TestInterface = this;\n" - + " b = new tests_classes.mypackage2.TestClass();\n" - + " }\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage1TestClass2() { - decompileScriptPack("tests_classes.mypackage1.TestClass2", "package tests_classes.mypackage1\n" - + "{\n" - + " public class TestClass2\n" - + " {\n" - + " \n" - + " public function TestClass2()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " var a:tests_classes.mypackage1.TestClass = null;\n" - + " var b:tests_classes.mypackage2.TestClass = null;\n" - + " var c:tests_classes.mypackage3.TestClass = null;\n" - + " a = new tests_classes.mypackage1.TestClass();\n" - + " b = new tests_classes.mypackage2.TestClass();\n" - + " c = new tests_classes.mypackage3.TestClass();\n" - + " var res:String = a.testCall() + b.testCall() + c.testCall() + this.testCall2() + myNamespace::testCall3();\n" - + " trace(res);\n" - + " return res;\n" - + " }\n" - + " \n" - + " myNamespace function testCall2() : String\n" - + " {\n" - + " return \"1\";\n" - + " }\n" - + " \n" - + " myNamespace function testCall3() : String\n" - + " {\n" - + " return myNamespace::testCall2();\n" - + " }\n" - + " \n" - + " public function testCall2() : String\n" - + " {\n" - + " return \"2\";\n" - + " }\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage1TestInterface() { - decompileScriptPack("tests_classes.mypackage1.TestInterface", "package tests_classes.mypackage1\n" - + "{\n" - + " public interface TestInterface extends tests_classes.mypackage2.TestInterface\n" - + " {\n" - + " \n" - + " function testMethod1() : void;\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage1MyNamespace() { - decompileScriptPack("tests_classes.mypackage1.myNamespace", "package tests_classes.mypackage1\n" - + "{\n" - + " public namespace myNamespace = \"https://www.free-decompiler.com/flash/test/namespace\";\n" - + "}"); - } - - @Test - public void testMyPackage2TestClass() { - decompileScriptPack("tests_classes.mypackage2.TestClass", "package tests_classes.mypackage2\n" - + "{\n" - + " public class TestClass implements TestInterface\n" - + " {\n" - + " \n" - + " public function TestClass()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " trace(\"pkg2hello\");\n" - + " return \"pkg2hello\";\n" - + " }\n" - + " \n" - + " public function testMethod2() : void\n" - + " {\n" - + " }\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage2TestInterface() { - decompileScriptPack("tests_classes.mypackage2.TestInterface", "package tests_classes.mypackage2\n" - + "{\n" - + " public interface TestInterface\n" - + " {\n" - + " \n" - + " function testMethod2() : void;\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage3TestClass() { - decompileScriptPack("tests_classes.mypackage3.TestClass", "package tests_classes.mypackage3\n" - + "{\n" - + " public class TestClass\n" - + " {\n" - + " \n" - + " public function TestClass()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " trace(\"pkg3hello\");\n" - + " return \"pkg3hello\";\n" - + " }\n" - + " }\n" - + "}"); + + "continue;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"after_try\");\r\n" + + "}\r\n" + + "trace(\"end\");\r\n", + false); } @Test @@ -1187,64 +1167,4 @@ public class ActionScript3Test extends ActionScriptTestBase { expectedResult = expectedResult.replaceAll("[ \r\n]", ""); assertEquals(actualResult, expectedResult); } - - @Test - public void testRegExp() { - decompileMethod("testRegExp", "var a1:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" - + "var a2:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" - + "var b1:* = /[0-9AB]+/;\r\n" - + "var b2:* = /[0-9AB]+/;\r\n", false); - } - - public void testDefaultNotLast() { - decompileMethod("testDefaultNotLast", "var k:* = 10;\r\n" - + "switch(k)\r\n" - + "{\r\n" - + "default:\r\n" - + "trace(\"def\");\r\n" - + "case 5:\r\n" - + "trace(\"def and 5\");\r\n" - + "break;\r\n" - + "case 4:\r\n" - + "trace(\"4\");\r\n" - + "}\r\n" - + "trace(\"after switch\");\r\n", false); - } - - @Test - public void testDefaultNotLastGrouped() { - decompileMethod("testDefaultNotLastGrouped", "var k:* = 10;\r\n" - + "switch(k)\r\n" - + "{\r\n" - + "default:\r\n" - + "case \"six\":\r\n" - + "trace(\"def and 6\");\r\n" - + "case \"five\":\r\n" - + "trace(\"def and 6 and 5\");\r\n" - + "break;\r\n" - + "case \"four\":\r\n" - + "trace(\"4\");\r\n" - + "}\r\n" - + "trace(\"after switch\");\r\n", false); - } - - /** - * Note: this one should be better compiled with ASC2/air, for String(xy) to - * be convert_s - */ - @Test - public void testManualConvert() { - decompileMethod("testManualConvert", "trace(\"String(this).length\");\r\n" - + "trace(String(this).length);\r\n", false); - } - - @Test - public void testPrecedenceX() { - decompileMethod("testPrecedenceX", "var a:* = 5;\r\n" - + "var b:* = 2;\r\n" - + "var c:* = 3;\r\n" - + "var d:* = a << (b >>> c);\r\n" - + "var e:* = a << b >>> c;\r\n", false); - } - } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index cc4aa0062..69a354b65 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -37,6 +37,8 @@ import java.io.FileInputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @@ -53,7 +55,12 @@ public class AS3Generator { List scriptPacks = swf.getAS3Packs(); StringBuilder s = new StringBuilder(); + Map sortedPacks = new TreeMap<>(); for (ScriptPack pack : scriptPacks) { + sortedPacks.put(pack.getClassPath().toRawString(), pack); + } + for (String packClassName : sortedPacks.keySet()) { + ScriptPack pack = sortedPacks.get(packClassName); ABC abc = pack.abc; if (pack.getClassPath().packageStr.toRawString().equals("tests")) { abc.findClassByName(pack.getClassPath().toRawString()); @@ -67,7 +74,7 @@ public class AS3Generator { String lower = clsName.substring(0, 1).toLowerCase() + clsName.substring(1); if (name.equals("run")) { s.append("@Test\r\npublic void "); - s.append(name); + s.append(lower); s.append("(){\r\ndecompileMethod(\""); s.append(lower); s.append("\", "); diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf index 880bcf125..e05772276 100644 Binary files a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf and b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf differ diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as index 6aba4e6c7..3d9031bfa 100644 --- a/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as @@ -27,12 +27,15 @@ package TestExpressions; TestFinallyZeroJump; TestFor; + TestForAnd; TestForBreak; TestForContinue; TestForEach; TestForEachObjectArray; TestForEachObjectAttribute; + TestForGoto; TestForIn; + TestForXml; TestHello; TestIf; TestIfElse; diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as new file mode 100644 index 000000000..5ded0122c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as @@ -0,0 +1,33 @@ +package tests +{ + public class TestForAnd + { + + + public function run() : * + { + var len:int = 5; + var x : Boolean; + var a:int = 4; + var b:int = 7; + var c:int = 9; + for (var i:uint = 0; i < len; x = a > 4 && b < 2 || c > 10) + { + c = 1; + + if (c == 2) { + trace("A"); + if (c == 7) + { + trace("B"); + continue; + } + trace("C"); + } + trace("D"); + + } + } + + } +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as new file mode 100644 index 000000000..1852b1f92 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as @@ -0,0 +1,28 @@ +package tests +{ + public class TestForGoto + { + + + public function run() : * + { + var len:int = 5; + for (var i:uint = 0; i < len; ++i) + { + var c:int = 1; + + if (c == 2) + trace("A") + else if (c == 3) + trace("B") + else + continue; + + trace("C") + + } + trace("exit"); + } + + } +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as new file mode 100644 index 000000000..e6699dde1 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as @@ -0,0 +1,39 @@ +package tests +{ + public class TestForXml + { + + + public function run() : * + { + var name:String = "ahoj"; + var myXML:XML= + + {name} + + ; + + var k:* = null; + + var len:int = 5; + var a:int = 5; + var b:int = 6; + + for (var i:int = 0; i < len; k=myXML.book.(@isbn="12345")) + { + var c:int = 1; + + if (c == 2) + trace("A") + else if (c == 3) + trace("B") + else + continue; + + trace("C") + + } + } + + } +} \ No newline at end of file