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