From adf153e13a277aa8c98a18efb96e85dfedcf7a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 31 Jan 2021 15:52:22 +0100 Subject: [PATCH] Improved tests. Fixed try..catch..finally. --- .../flash/abc/avm2/graph/AVM2Graph.java | 285 ++++-- .../ActionScript3AssembledDecompileTest.java | 146 +++ .../flash/ActionScript3ClassTest.java | 215 +++++ ...=> ActionScript3ClassicDecompileTest.java} | 885 +++++------------- ...ctionScript3CrossCompileDecompileTest.java | 372 ++++++++ .../flash/ActionScript3DecompileTestBase.java | 105 +++ .../ActionScript3OptinalParametersTest.java | 57 ++ .../flash/generators/AS3Generator.java | 69 +- .../testdata/cross_compile/bin/Main.air.swf | Bin 2760 -> 2872 bytes .../testdata/cross_compile/bin/Main.flex.swf | Bin 3635 -> 3856 bytes .../cross_compile/bin/Main.flex_apache.swf | Bin 3620 -> 3856 bytes .../cross_compile/bin/Main.swftools.swf | Bin 1529 -> 1626 bytes .../testdata/cross_compile/src/Main.as | 3 +- .../src/tests/TestTryCatchLoop.as | 9 +- .../src/tests/TestTryFinallyLoop.as | 7 +- .../src/tests/TestTryFinallyLoopInFinally.as | 7 +- .../src/tests/TestTryFinallyNoCatch.as | 26 + .../src/tests/TestTryFinallyReturnNested.as | 2 +- .../src/tests/TestTryFinallyReturnVoid.as | 2 +- 19 files changed, 1418 insertions(+), 772 deletions(-) create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssembledDecompileTest.java create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassTest.java rename libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/{ActionScript3Test.java => ActionScript3ClassicDecompileTest.java} (55%) create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3CrossCompileDecompileTest.java create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptinalParametersTest.java create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyNoCatch.as diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index a459a92f9..2a0580c0e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -260,22 +260,45 @@ public class AVM2Graph extends Graph { localData.switchedRegs.put(e, switchedReg); if (switchPart != null) { for (GraphPart r : finallyPart.refs) { - for (int ip = r.end; ip >= r.start; ip--) { - AVM2Instruction ins = avm2code.code.get(ip); - if (ins.definition instanceof JumpIns) { - continue; - } else if (ins.definition instanceof PushByteIns) { - int val = ins.operands[0]; - if (val < 0 || val > switchPart.nextParts.size() - 2) { - localData.finallyJumps.put(r, switchPart.nextParts.get(0)); //default branch + GraphPart rr = r; + boolean needsPrev = true; + while (true) { + for (int ip = rr.end; ip >= rr.start; ip--) { + AVM2Instruction ins = avm2code.code.get(ip); + if (ins.definition instanceof JumpIns) { + continue; + } else if (ins.definition instanceof PushByteIns) { + int val = ins.operands[0]; + if (val < 0 || val > switchPart.nextParts.size() - 2) { + localData.finallyJumps.put(rr, switchPart.nextParts.get(0)); //default branch + } else { + localData.finallyJumps.put(rr, switchPart.nextParts.get(1 + val)); + } + needsPrev = false; + break; + } else if ((ins.definition instanceof SetLocalTypeIns) && (((SetLocalTypeIns) ins.definition).getRegisterId(ins) == switchedReg)) { + //ignore + } else if (ins.definition instanceof CoerceAIns) { + //ignore } else { - localData.finallyJumps.put(r, switchPart.nextParts.get(1 + val)); + needsPrev = false; + break; } - break; - } else if ((ins.definition instanceof SetLocalTypeIns) && (((SetLocalTypeIns) ins.definition).getRegisterId(ins) == switchedReg)) { - //ignore - } else if (ins.definition instanceof CoerceAIns) { - //ignore + } + if (needsPrev) { + List prevs = new ArrayList<>(); + for (GraphPart prevR : rr.refs) { + if (prevR.start >= 0) { + prevs.add(prevR); + } + } + + if (prevs.size() == 1) { + rr = prevs.get(0); + } else { + break; + } + } else { break; } @@ -542,6 +565,25 @@ public class AVM2Graph extends Graph { } } + private List getRealRefs(GraphPart part) { + List ret = new ArrayList<>(); + for (GraphPart r : part.refs) { + if (r.start >= 0) { + ret.add(r); + } + } + return ret; + } + + private GraphPart searchPart(int ip, Set allParts) { + for (GraphPart p : allParts) { + if (ip >= p.start && ip <= p.end) { + return p; + } + } + return null; + } + private List checkTry(List currentRet, List output, List foundGotos, Map> partCodes, Map partCodePos, AVM2LocalData localData, GraphPart part, List stopPart, List loops, Set allParts, TranslateStack stack, int staticOperation, String path) throws InterruptedException { if (localData.parsedExceptions == null) { localData.parsedExceptions = new ArrayList<>(); @@ -556,31 +598,82 @@ public class AVM2Graph extends Graph { long addr = avm2code.getAddrThroughJumpAndDebugLine(avm2code.pos2adr(part.start)); long maxEndAddr = -1; List catchedExceptions = new ArrayList<>(); - ABCException finallyException = null; + int endIp = -1; - int finallyIndex = -1; + List finnalysIndicesToBe = new ArrayList<>(); for (int e = 0; e < body.exceptions.length; e++) { if (addr == avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].start)) { - if (!parsedExceptions.contains(body.exceptions[e])) { - long endAddr = avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end); - if (endAddr > maxEndAddr) { - catchedExceptions.clear(); - finallyException = null; - finallyIndex = -1; - maxEndAddr = avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end); - endIp = avm2code.adr2pos(maxEndAddr); - catchedExceptions.add(body.exceptions[e]); - } else if (endAddr == maxEndAddr) { - catchedExceptions.add(body.exceptions[e]); - } - if (body.exceptions[e].isFinally()) { - finallyException = body.exceptions[e]; - finallyIndex = e; + ABCException ex = body.exceptions[e]; + if (!parsedExceptions.contains(ex)) { + if (ex.isFinally()) { + finnalysIndicesToBe.add(e); + } else { + long endAddr = avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end); + if (endAddr > maxEndAddr) { + catchedExceptions.clear(); + maxEndAddr = avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end); + endIp = avm2code.adr2pos(maxEndAddr); + catchedExceptions.add(body.exceptions[e]); + } else if (endAddr == maxEndAddr) { + catchedExceptions.add(body.exceptions[e]); + } } } } } + //GraphPart endPart = searchPart(endIp, allParts); + int finallyIndex = -1; + ABCException finallyException = null; + Integer defaultPushByte = null; + + for (int e : finnalysIndicesToBe) { + ABCException finallyExceptionToBe = body.exceptions[e]; + if (endIp == -1) { + /*there's no exception, finally only*/ + finallyIndex = e; + finallyException = finallyExceptionToBe; + break; + } + int finEndIp = avm2code.getIpThroughJumpAndDebugLine(avm2code.adr2pos(finallyExceptionToBe.end)); + if (finEndIp == endIp) { + finallyIndex = e; + finallyException = finallyExceptionToBe; + break; + } + GraphPart endPart = searchPart(endIp, allParts); + GraphPart finEndPart = searchPart(finEndIp, allParts); + + if (endPart.getHeight() == 1) { + if (avm2code.code.get(endPart.start).definition instanceof PushByteIns) { + /*defaultPushByte = avm2code.code.get(endPart.start).operands[0];*/ + int afterEndIp = avm2code.getIpThroughJumpAndDebugLine(endPart.nextParts.get(0).start); + int afterFinEndIp = avm2code.getIpThroughJumpAndDebugLine(finEndPart.start); + if (afterEndIp == afterFinEndIp) { + finallyIndex = e; + finallyException = finallyExceptionToBe; + break; + } + } + } + } + + if (finallyException != null) { + int finEndIp = avm2code.adr2pos(finallyException.end); + GraphPart finallyEndPart = searchPart(finEndIp, allParts); + List refs = getRealRefs(finallyEndPart); + if (refs.size() == 1) { + GraphPart prev = refs.get(0); + if (prev.getHeight() == 1) { + if (avm2code.code.get(prev.start).definition instanceof PushByteIns) { + defaultPushByte = avm2code.code.get(prev.start).operands[0]; + } + } + } + + catchedExceptions.add(finallyException); + } + int switchedReg = -1; if (finallyIndex != -1) { switchedReg = localData.switchedRegs.containsKey(finallyIndex) ? localData.switchedRegs.get(finallyIndex) : -1; @@ -605,38 +698,17 @@ public class AVM2Graph extends Graph { stack.clear(); //If the original code (before check()) had "if" in it, there would be something on stack - for (ABCException ex : catchedExceptions) { - - TranslateStack st2 = (TranslateStack) stack.clone(); - st2.clear(); - st2.add(new ExceptionAVM2Item(ex)); - - GraphPart catchPart = null; - for (GraphPart p : allParts) { - if (p.start == avm2code.adr2pos(ex.target)) { - catchPart = p; - break; - } - } - AVM2LocalData localData2 = new AVM2LocalData(localData); - localData2.scopeStack = new ScopeStack(); - - List stopPart2 = new ArrayList<>(stopPart); - stopPart2.add(afterPart); - - List currentCatchCommands = printGraph(foundGotos, partCodes, partCodePos, localData2, st2, allParts, null, catchPart, stopPart2, loops, staticOperation, path); - if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(0) instanceof SetLocalAVM2Item)) { - if (currentCatchCommands.get(0).value.getNotCoerced() instanceof ExceptionAVM2Item) { - currentCatchCommands.remove(0); - } - } - if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(currentCatchCommands.size() - 1) instanceof SetLocalAVM2Item)) { - SetLocalAVM2Item setLocal = (SetLocalAVM2Item) currentCatchCommands.get(currentCatchCommands.size() - 1); + if (switchedReg > -1) { + //There is assignment to switched reg before entering try + if (!currentRet.isEmpty() && (currentRet.get(currentRet.size() - 1) instanceof SetLocalAVM2Item)) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) currentRet.get(currentRet.size() - 1); if (setLocal.regIndex == switchedReg) { - currentCatchCommands.remove(currentCatchCommands.size() - 1); + if (setLocal.value.getNotCoerced() instanceof IntegerValueAVM2Item) { + defaultPushByte = (int) (long) ((IntegerValueAVM2Item) setLocal.value.getNotCoerced()).value; + } + currentRet.remove(currentRet.size() - 1); } } - catchCommands.add(currentCatchCommands); } if (finallyException == null) { @@ -644,8 +716,22 @@ public class AVM2Graph extends Graph { stopPart2.add(afterPart); tryCommands = printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, part, stopPart2, loops, staticOperation, path); } - + GraphPart exAfterPart = afterPart; + GraphPart defaultPart = null; if (finallyException != null) { + + if (defaultPushByte != null) { + GraphPart switchPart = localData.ignoredSwitches.get(finallyIndex); + if (switchPart != null) { + if (defaultPushByte < 0 || defaultPushByte > switchPart.nextParts.size() - 2) { + defaultPart = switchPart.nextParts.get(0); + } else { + defaultPart = switchPart.nextParts.get(1 + defaultPushByte); + } + localData.defaultWays.put(switchPart, defaultPushByte); + } + } + afterPart = null; GraphPart finallyTryTargetPart = null; int targetPos = avm2code.adr2pos(finallyException.target); @@ -662,6 +748,9 @@ public class AVM2Graph extends Graph { if (finallyPart != null) { tryStopPart.add(finallyPart); } + if (defaultPart != null) { + tryStopPart.add(defaultPart); + } tryCommands = printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, part, tryStopPart, loops, staticOperation, path); makeAllCommands(tryCommands, stack); processIfs(tryCommands); @@ -683,6 +772,7 @@ public class AVM2Graph extends Graph { } if (switchPart != null) { finallyCommands.addAll(translatePart(localData, switchPart, stack, staticOperation, path)); + stack.pop(); //value switched by lookupswitch if (localData.defaultWays.containsKey(switchPart)) { int defaultWay = localData.defaultWays.get(switchPart); if (defaultWay < 0 || defaultWay > switchPart.nextParts.size() - 2) { @@ -693,33 +783,66 @@ public class AVM2Graph extends Graph { } else { afterPart = switchPart.nextParts.get(0); //take the default branch. TODO: detect actual value } + exAfterPart = afterPart; } - stack.pop(); - - if (tryCommands.size() == 1 - && (tryCommands.get(0) instanceof TryAVM2Item) - && catchCommands.isEmpty() - && ((TryAVM2Item) tryCommands.get(0)).finallyCommands.isEmpty()) { - catchCommands = ((TryAVM2Item) tryCommands.get(0)).catchCommands; - catchedExceptions = ((TryAVM2Item) tryCommands.get(0)).catchExceptions; - tryCommands = ((TryAVM2Item) tryCommands.get(0)).tryCommands; - } + //stack.pop(); } + + for (ABCException ex : catchedExceptions) { + + TranslateStack st2 = (TranslateStack) stack.clone(); + st2.clear(); + st2.add(new ExceptionAVM2Item(ex)); + + GraphPart catchPart = null; + for (GraphPart p : allParts) { + if (p.start == avm2code.adr2pos(ex.target)) { + catchPart = p; + break; + } + } + AVM2LocalData localData2 = new AVM2LocalData(localData); + localData2.scopeStack = new ScopeStack(); + + List stopPart2 = new ArrayList<>(stopPart); + stopPart2.add(exAfterPart); + if (defaultPart != null) { + stopPart2.add(defaultPart); + } + + List currentCatchCommands = printGraph(foundGotos, partCodes, partCodePos, localData2, st2, allParts, null, catchPart, stopPart2, loops, staticOperation, path); + if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(0) instanceof SetLocalAVM2Item)) { + if (currentCatchCommands.get(0).value.getNotCoerced() instanceof ExceptionAVM2Item) { + currentCatchCommands.remove(0); + } + } + if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(currentCatchCommands.size() - 1) instanceof SetLocalAVM2Item)) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) currentCatchCommands.get(currentCatchCommands.size() - 1); + if (setLocal.regIndex == switchedReg) { + currentCatchCommands.remove(currentCatchCommands.size() - 1); + } + } + catchCommands.add(currentCatchCommands); + } + + /*if (tryCommands.size() == 1 + && (tryCommands.get(0) instanceof TryAVM2Item) + && catchCommands.isEmpty() + && ((TryAVM2Item) tryCommands.get(0)).finallyCommands.isEmpty()) { + catchCommands = ((TryAVM2Item) tryCommands.get(0)).catchCommands; + catchedExceptions = ((TryAVM2Item) tryCommands.get(0)).catchExceptions; + tryCommands = ((TryAVM2Item) tryCommands.get(0)).tryCommands; + }*/ if (catchCommands.isEmpty() && finallyCommands.isEmpty() && tryCommands.isEmpty()) { return null; } - if (switchedReg > -1) { - //There is assignment to switched reg before entering try - if (!currentRet.isEmpty() && (currentRet.get(currentRet.size() - 1) instanceof SetLocalAVM2Item)) { - SetLocalAVM2Item setLocal = (SetLocalAVM2Item) currentRet.get(currentRet.size() - 1); - if (setLocal.regIndex == switchedReg) { - currentRet.remove(currentRet.size() - 1); - } - } + List ret = new ArrayList<>(); + if (catchedExceptions.isEmpty() && finallyCommands.isEmpty()) { + ret.addAll(tryCommands); + return ret; } - List ret = new ArrayList<>(); ret.add(new TryAVM2Item(tryCommands, catchedExceptions, catchCommands, finallyCommands, "TODO")); if (afterPart != null) { @@ -886,7 +1009,7 @@ public class AVM2Graph extends Graph { switchPart = gp; switchedReg = aLocalData.switchedRegs.containsKey(finallyIndex) ? aLocalData.switchedRegs.get(finallyIndex) : -1; - + break; } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssembledDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssembledDecompileTest.java new file mode 100644 index 000000000..0fdf5b366 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssembledDecompileTest.java @@ -0,0 +1,146 @@ +package com.jpexs.decompiler.flash; + +import java.io.IOException; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileTestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + addSwf("assembled", "testdata/custom/bin/custom.swf"); + } + + @Test + public void testDoubleDup() { + decompileMethod("assembled", "testDoubleDup", "var _loc10_:Rectangle = myprop(_loc5_);\r\n" + + "_loc10_.mymethod(-_loc10_.width,-_loc10_.height);\r\n", + false); + } + + @Test + public void testDup() { + decompileMethod("assembled", "testDup", "return 1 - (var _loc1_:Number = 1 - _loc1_ / _loc4_) * _loc1_;\r\n", + false); + } + + @Test + public void testDupAssignment() { + decompileMethod("assembled", "testDupAssignment", "var _loc1_:int = 0;\r\n" + + "var _loc2_:int = 10;\r\n" + + "if(_loc1_ = _loc2_)\r\n" + + "{\r\n" + + "trace(_loc2_);\r\n" + + "}\r\n", + false); + } + + @Test + public void testForEach() { + decompileMethod("assembled", "testForEach", "var _loc5_:* = undefined;\r\n" + + "var _loc2_:* = 0;\r\n" + + "var _loc3_:int = 0;\r\n" + + "for each(var _loc4_ in _loc5_)\r\n" + + "{\r\n" + + "if(_loc4_ != null)\r\n" + + "{\r\n" + + "_loc2_ = _loc4_;\r\n" + + "}\r\n" + + "}\r\n" + + "_loc3_ = 0;\r\n", + false); + } + + @Test + public void testForEachCoerced() { + decompileMethod("assembled", "testForEachCoerced", "for each(var _loc6_ in someprop)\r\n" + + "{\r\n" + + "_loc6_.methodname(_loc1_,_loc2_,_loc5_);\r\n" + + "}\r\n", + false); + } + + @Test + public void testIncrement() { + decompileMethod("assembled", "testIncrement", "super();\r\n" + + "b = a++;\r\n", + false); + } + + @Test + public void testIncrement2() { + decompileMethod("assembled", "testIncrement2", "if(++loadCount == 2)\r\n" + + "{\r\n" + + "somemethod();\r\n" + + "}\r\n", + false); + } + + @Test + public void testIncrement3() { + decompileMethod("assembled", "testIncrement3", "_loc1_.length--;\r\n", + false); + } + + @Test + public void testSetSlotDup() { + decompileMethod("assembled", "testSetSlotDup", "var _loc5_:int = 5;\r\n" + + "myname.somemethod(\"okay\",myslot = _loc5_);\r\n" + + "myname.start();\r\n", + false); + } + + @Test + public void testSetSlotFindProperty() { + decompileMethod("assembled", "testSetSlotFindProperty", "return var myprop:int = 50;\r\n", + false); + } + + @Test + public void testSwitch() { + decompileMethod("assembled", "testSwitch", "switch(int(somevar))\r\n" + + "{\r\n" + + "case 0:\r\n" + + "var _loc2_:String = \"X\";\r\n" + + "return;\r\n" + + "break;\r\n" + + "case 1:\r\n" + + "_loc2_ = \"A\";\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "_loc2_ = \"B\";\r\n" + + "break;\r\n" + + "case 4:\r\n" + + "_loc2_ = \"C\";\r\n" + + "}\r\n" + + "_loc2_ = \"after\";\r\n", + false); + } + + @Test + public void testSwitchDefault() { + decompileMethod("assembled", "testSwitchDefault", "switch(5)\r\n" + + "{\r\n" + + "case 6:\r\n" + + "var _loc2_:int = 6;\r\n" + + "case 0:\r\n" + + "_loc2_ = 0;\r\n" + + "break;\r\n" + + "case 1:\r\n" + + "_loc2_ = 1;\r\n" + + "case 5:\r\n" + + "_loc2_ = 5;\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "_loc2_ = 3;\r\n" + + "break;\r\n" + + "default:\r\n" + + "_loc2_ = 100;\r\n" + + "}\r\n", + false); + } +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassTest.java new file mode 100644 index 000000000..5226614b3 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassTest.java @@ -0,0 +1,215 @@ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.abc.types.ConvertData; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.Tag; +import java.io.IOException; +import java.util.Arrays; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3ClassTest extends ActionScript3DecompileTestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + addSwf("standard", "testdata/flashdevelop/bin/flashdevelop.swf"); + } + + private void decompileScriptPack(String path, String expectedResult) { + + DoABC2Tag tag = null; + ABC abc = null; + ScriptPack scriptPack = null; + for (Tag t : getSwf("standard").getTags()) { + if (t instanceof DoABC2Tag) { + tag = (DoABC2Tag) t; + abc = tag.getABC(); + scriptPack = abc.findScriptPackByPath(path, Arrays.asList(abc)); + if (scriptPack != null) { + break; + } + } + } + assertNotNull(abc); + assertNotNull(scriptPack); + HighlightedTextWriter writer = null; + try { + writer = new HighlightedTextWriter(new CodeFormatting(), false); + scriptPack.toSource(writer, abc.script_info.get(scriptPack.scriptIndex).traits.traits, new ConvertData(), ScriptExportMode.AS, false); + } catch (InterruptedException ex) { + fail(); + } + String actualResult = cleanPCode(writer.toString()); + expectedResult = cleanPCode(expectedResult); + assertEquals(actualResult, expectedResult); + } + @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" + + "}"); + } +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassicDecompileTest.java similarity index 55% rename from libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java rename to libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassicDecompileTest.java index a2a007374..14a9c26e0 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3ClassicDecompileTest.java @@ -1,165 +1,29 @@ -/* - * Copyright (C) 2010-2021 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ package com.jpexs.decompiler.flash; -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.ScriptPack; -import com.jpexs.decompiler.flash.abc.types.ConvertData; -import com.jpexs.decompiler.flash.abc.types.traits.Traits; -import com.jpexs.decompiler.flash.configuration.Configuration; -import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; -import com.jpexs.decompiler.flash.helpers.CodeFormatting; -import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; -import com.jpexs.decompiler.flash.helpers.NulWriter; -import com.jpexs.decompiler.flash.tags.ABCContainerTag; -import com.jpexs.decompiler.flash.tags.DoABC2Tag; -import com.jpexs.decompiler.flash.tags.Tag; -import com.jpexs.decompiler.graph.DottedChain; -import com.jpexs.decompiler.graph.ScopeStack; -import java.io.BufferedInputStream; -import java.io.FileInputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * * @author JPEXS */ -public class ActionScript3Test extends ActionScriptTestBase { - - private Map swfMap = new HashMap<>(); +public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTestBase { @BeforeClass public void init() throws IOException, InterruptedException { - //Main.initLogging(false); - swfMap.put("standard", new SWF(new BufferedInputStream(new FileInputStream("testdata/flashdevelop/bin/flashdevelop_flex.swf")), false)); - swfMap.put("standard_asc2", new SWF(new BufferedInputStream(new FileInputStream("testdata/flashdevelop/bin/flashdevelop_asc2.swf")), false)); - swfMap.put("assembled", new SWF(new BufferedInputStream(new FileInputStream("testdata/custom/bin/custom.swf")), false)); - Configuration.autoDeobfuscate.set(false); - Configuration.simplifyExpressions.set(false); - - Configuration.decompile.set(true); - Configuration.registerNameFormat.set("_loc%d_"); - Configuration.showMethodBodyId.set(false); + addSwf("classic", "testdata/flashdevelop/bin/flashdevelop.swf"); } - private void decompileMethod(String swfIdentifier, String methodName, String expectedResult, boolean isStatic) { - String className = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); - - int clsIndex = -1; - int scriptIndex = -1; - - ABC abc = null; - SWF swf = swfMap.get(swfIdentifier); - List abcs = new ArrayList<>(); - for (ABCContainerTag abcTag : swf.getAbcList()) { - abcs.add(abcTag.getABC()); - } - ScriptPack scriptPack = null; - for (ABC a : abcs) { - scriptPack = a.findScriptPackByPath("tests." + className, abcs); - if (scriptPack != null) { - break; - } - } - assertNotNull(scriptPack); - abc = scriptPack.abc; - scriptIndex = scriptPack.scriptIndex; - - clsIndex = abc.findClassByName(new DottedChain(new String[]{"tests", className}, "")); - - assertTrue(clsIndex > -1); - assertTrue(scriptIndex > -1); - - int bodyIndex = abc.findMethodBodyByName(clsIndex, "run"); - - assertTrue(bodyIndex > -1); - HighlightedTextWriter writer; - try { - List ts = new ArrayList<>(); - ts.add(abc.instance_info.get(clsIndex).instance_traits); - abc.bodies.get(bodyIndex).convert(new ConvertData(), "run", ScriptExportMode.AS, isStatic, abc.bodies.get(bodyIndex).method_info, scriptIndex, clsIndex, abc, null, new ScopeStack(scriptIndex), 0, new NulWriter(), new ArrayList<>(), ts, true); - writer = new HighlightedTextWriter(new CodeFormatting(), false); - abc.bodies.get(bodyIndex).toString("run", ScriptExportMode.AS, abc, null, writer, new ArrayList<>()); - } catch (InterruptedException ex) { - fail(); - return; - } - String actualResult = cleanPCode(writer.toString()); - expectedResult = cleanPCode(expectedResult); - assertEquals(actualResult, expectedResult); - } - - private void decompileScriptPack(String path, String expectedResult) { - - DoABC2Tag tag = null; - ABC abc = null; - ScriptPack scriptPack = null; - for (Tag t : swfMap.get("standard").getTags()) { - if (t instanceof DoABC2Tag) { - tag = (DoABC2Tag) t; - abc = tag.getABC(); - scriptPack = abc.findScriptPackByPath(path, Arrays.asList(abc)); - if (scriptPack != null) { - break; - } - } - } - assertNotNull(abc); - assertNotNull(scriptPack); - HighlightedTextWriter writer = null; - try { - writer = new HighlightedTextWriter(new CodeFormatting(), false); - scriptPack.toSource(writer, abc.script_info.get(scriptPack.scriptIndex).traits.traits, new ConvertData(), ScriptExportMode.AS, false); - } catch (InterruptedException ex) { - fail(); - } - String actualResult = cleanPCode(writer.toString()); - expectedResult = cleanPCode(expectedResult); - assertEquals(actualResult, expectedResult); - } - - @DataProvider - private Object[][] standardSwfNamesProvider() { - return new Object[][]{ - {"standard"}, //{"standard_asc2"} - }; - } - - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardArguments(String swfUsed) { - decompileMethod(swfUsed, "testArguments", "return arguments[0];\r\n", + @Test + public void testArguments() { + decompileMethod("classic", "testArguments", "return arguments[0];\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardCatchFinally(String swfUsed) { - decompileMethod(swfUsed, "testCatchFinally", "var a:* = 5;\r\n" + @Test + public void testCatchFinally() { + decompileMethod("classic", "testCatchFinally", "var a:* = 5;\r\n" + "try\r\n" + "{\r\n" + "a = 9;\r\n" @@ -176,9 +40,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardChain2(String swfUsed) { - decompileMethod(swfUsed, "testChain2", "var g:Array = null;\r\n" + @Test + public void testChain2() { + decompileMethod("classic", "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" @@ -196,9 +60,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardChainedAssignments(String swfUsed) { - decompileMethod(swfUsed, "testChainedAssignments", "var a:int = 0;\r\n" + @Test + public void testChainedAssignments() { + decompileMethod("classic", "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" @@ -209,17 +73,17 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardComplexExpressions(String swfUsed) { - decompileMethod(swfUsed, "testComplexExpressions", "var i:int = 0;\r\n" + @Test + public void testComplexExpressions() { + decompileMethod("classic", "testComplexExpressions", "var i:int = 0;\r\n" + "var j:int = 0;\r\n" + "j = i = i + (i = i + i++);\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardContinueLevels(String swfUsed) { - decompileMethod(swfUsed, "testContinueLevels", "var b:* = undefined;\r\n" + @Test + public void testContinueLevels() { + decompileMethod("classic", "testContinueLevels", "var b:* = undefined;\r\n" + "var c:* = undefined;\r\n" + "var d:* = undefined;\r\n" + "var e:* = undefined;\r\n" @@ -281,9 +145,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardDecl2(String swfUsed) { - decompileMethod(swfUsed, "testDecl2", "var k:int = 0;\r\n" + @Test + public void testDecl2() { + decompileMethod("classic", "testDecl2", "var k:int = 0;\r\n" + "var i:int = 5;\r\n" + "i = i + 7;\r\n" + "if(i == 5)\r\n" @@ -297,9 +161,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardDeclarations(String swfUsed) { - decompileMethod(swfUsed, "testDeclarations", "var vall:* = undefined;\r\n" + @Test + public void testDeclarations() { + decompileMethod("classic", "testDeclarations", "var vall:* = undefined;\r\n" + "var vstr:String = null;\r\n" + "var vint:int = 0;\r\n" + "var vuint:uint = 0;\r\n" @@ -317,9 +181,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardDefaultNotLastGrouped(String swfUsed) { - decompileMethod(swfUsed, "testDefaultNotLastGrouped", "var k:* = 10;\r\n" + @Test + public void testDefaultNotLastGrouped() { + decompileMethod("classic", "testDefaultNotLastGrouped", "var k:* = 10;\r\n" + "switch(k)\r\n" + "{\r\n" + "case \"six\":\r\n" @@ -335,9 +199,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardDoWhile(String swfUsed) { - decompileMethod(swfUsed, "testDoWhile", "var a:* = 8;\r\n" + @Test + public void testDoWhile() { + decompileMethod("classic", "testDoWhile", "var a:* = 8;\r\n" + "do\r\n" + "{\r\n" + "trace(\"a=\" + a);\r\n" @@ -347,9 +211,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardDoWhile2(String swfUsed) { - decompileMethod(swfUsed, "testDoWhile2", "var k:int = 5;\r\n" + @Test + public void testDoWhile2() { + decompileMethod("classic", "testDoWhile2", "var k:int = 5;\r\n" + "do\r\n" + "{\r\n" + "k++;\r\n" @@ -368,9 +232,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardExpressions(String swfUsed) { - decompileMethod(swfUsed, "testExpressions", "var arr:Array = null;\r\n" + @Test + public void testExpressions() { + decompileMethod("classic", "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" @@ -389,9 +253,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardFinallyZeroJump(String swfUsed) { - decompileMethod(swfUsed, "testFinallyZeroJump", "var str:String = param1;\r\n" + @Test + public void testFinallyZeroJump() { + decompileMethod("classic", "testFinallyZeroJump", "var str:String = param1;\r\n" + "try\r\n" + "{\r\n" + "}\r\n" @@ -411,18 +275,18 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardFor(String swfUsed) { - decompileMethod(swfUsed, "testFor", "for(var a:* = 0; a < 10; a++)\r\n" + @Test + public void testFor() { + decompileMethod("classic", "testFor", "for(var a:* = 0; a < 10; a++)\r\n" + "{\r\n" + "trace(\"a=\" + a);\r\n" + "}\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForAnd(String swfUsed) { - decompileMethod(swfUsed, "testForAnd", "var x:Boolean = false;\r\n" + @Test + public void testForAnd() { + decompileMethod("classic", "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" @@ -445,9 +309,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForBreak(String swfUsed) { - decompileMethod(swfUsed, "testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" + @Test + public void testForBreak() { + decompileMethod("classic", "testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" + "{\r\n" + "if(a == 5)\r\n" + "{\r\n" @@ -458,9 +322,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForContinue(String swfUsed) { - decompileMethod(swfUsed, "testForContinue", "for(var a:* = 0; a < 10; a = a + 1)\r\n" + @Test + public void testForContinue() { + decompileMethod("classic", "testForContinue", "for(var a:* = 0; a < 10; a = a + 1)\r\n" + "{\r\n" + "if(a == 9)\r\n" + "{\r\n" @@ -486,9 +350,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForEach(String swfUsed) { - decompileMethod(swfUsed, "testForEach", "var list:Array = null;\r\n" + @Test + public void testForEach() { + decompileMethod("classic", "testForEach", "var list:Array = null;\r\n" + "var item:* = undefined;\r\n" + "list = new Array();\r\n" + "list[0] = \"first\";\r\n" @@ -501,9 +365,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForEachObjectArray(String swfUsed) { - decompileMethod(swfUsed, "testForEachObjectArray", "var list:Array = null;\r\n" + @Test + public void testForEachObjectArray() { + decompileMethod("classic", "testForEachObjectArray", "var list:Array = null;\r\n" + "var test:Array = null;\r\n" + "list = new Array();\r\n" + "list[0] = \"first\";\r\n" @@ -518,9 +382,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForEachObjectAttribute(String swfUsed) { - decompileMethod(swfUsed, "testForEachObjectAttribute", "var list:Array = null;\r\n" + @Test + public void testForEachObjectAttribute() { + decompileMethod("classic", "testForEachObjectAttribute", "var list:Array = null;\r\n" + "list = new Array();\r\n" + "list[0] = \"first\";\r\n" + "list[1] = \"second\";\r\n" @@ -532,9 +396,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForGoto(String swfUsed) { - decompileMethod(swfUsed, "testForGoto", "var c:int = 0;\r\n" + @Test + public void testForGoto() { + decompileMethod("classic", "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" @@ -557,9 +421,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForIn(String swfUsed) { - decompileMethod(swfUsed, "testForIn", "var dic:Dictionary = null;\r\n" + @Test + public void testForIn() { + decompileMethod("classic", "testForIn", "var dic:Dictionary = null;\r\n" + "var item:* = null;\r\n" + "for(item in dic)\r\n" + "{\r\n" @@ -572,9 +436,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardForXml(String swfUsed) { - decompileMethod(swfUsed, "testForXml", "var c:int = 0;\r\n" + @Test + public void testForXml() { + decompileMethod("classic", "testForXml", "var c:int = 0;\r\n" + "var name:String = \"ahoj\";\r\n" + "var myXML:XML = \r\n" + "\r\n" @@ -605,9 +469,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos(String swfUsed) { - decompileMethod(swfUsed, "testGotos", "var a:Boolean = true;\r\n" + @Test + public void testGotos() { + decompileMethod("classic", "testGotos", "var a:Boolean = true;\r\n" + "var b:Boolean = false;\r\n" + "if(a)\r\n" + "{\r\n" @@ -637,9 +501,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos2(String swfUsed) { - decompileMethod(swfUsed, "testGotos2", "var a:Boolean = true;\r\n" + @Test + public void testGotos2() { + decompileMethod("classic", "testGotos2", "var a:Boolean = true;\r\n" + "var b:Boolean = false;\r\n" + "var c:Boolean = true;\r\n" + "if(a)\r\n" @@ -661,9 +525,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos3(String swfUsed) { - decompileMethod(swfUsed, "testGotos3", "var i:int = 0;\r\n" + @Test + public void testGotos3() { + decompileMethod("classic", "testGotos3", "var i:int = 0;\r\n" + "var a:int = 5;\r\n" + "if(a > 5)\r\n" + "{\r\n" @@ -688,9 +552,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos4(String swfUsed) { - decompileMethod(swfUsed, "testGotos4", "var a:int = 5;\r\n" + @Test + public void testGotos4() { + decompileMethod("classic", "testGotos4", "var a:int = 5;\r\n" + "if(a > 3)\r\n" + "{\r\n" + "if(a < 7)\r\n" @@ -709,9 +573,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos5(String swfUsed) { - decompileMethod(swfUsed, "testGotos5", "var j:int = 0;\r\n" + @Test + public void testGotos5() { + decompileMethod("classic", "testGotos5", "var j:int = 0;\r\n" + "var s:String = \"A\";\r\n" + "for(var i:int = 0; i < 10; i++)\r\n" + "{\r\n" @@ -733,9 +597,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos6(String swfUsed) { - decompileMethod(swfUsed, "testGotos6", "var a:Boolean = true;\r\n" + @Test + public void testGotos6() { + decompileMethod("classic", "testGotos6", "var a:Boolean = true;\r\n" + "var s:String = \"a\";\r\n" + "if(a)\r\n" + "{\r\n" @@ -758,9 +622,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardGotos7(String swfUsed) { - decompileMethod(swfUsed, "testGotos7", "for(var i:int = 0; i < 10; i++)\r\n" + @Test + public void testGotos7() { + decompileMethod("classic", "testGotos7", "for(var i:int = 0; i < 10; i++)\r\n" + "{\r\n" + "switch(i)\r\n" + "{\r\n" @@ -787,15 +651,15 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardHello(String swfUsed) { - decompileMethod(swfUsed, "testHello", "trace(\"hello\");\r\n", + @Test + public void testHello() { + decompileMethod("classic", "testHello", "trace(\"hello\");\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardIf(String swfUsed) { - decompileMethod(swfUsed, "testIf", "var a:* = 5;\r\n" + @Test + public void testIf() { + decompileMethod("classic", "testIf", "var a:* = 5;\r\n" + "if(a == 7)\r\n" + "{\r\n" + "trace(\"onTrue\");\r\n" @@ -803,9 +667,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardIfElse(String swfUsed) { - decompileMethod(swfUsed, "testIfElse", "var a:* = 5;\r\n" + @Test + public void testIfElse() { + decompileMethod("classic", "testIfElse", "var a:* = 5;\r\n" + "if(a == 7)\r\n" + "{\r\n" + "trace(\"onTrue\");\r\n" @@ -817,9 +681,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardIfInIf(String swfUsed) { - decompileMethod(swfUsed, "testIfInIf", "var k:int = 5;\r\n" + @Test + public void testIfInIf() { + decompileMethod("classic", "testIfInIf", "var k:int = 5;\r\n" + "if(k > 5 && k < 20)\r\n" + "{\r\n" + "trace(\"A\");\r\n" @@ -841,9 +705,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardInc2(String swfUsed) { - decompileMethod(swfUsed, "testInc2", "var a:* = [1];\r\n" + @Test + public void testInc2() { + decompileMethod("classic", "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" @@ -854,9 +718,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardIncDec(String swfUsed) { - decompileMethod(swfUsed, "testIncDec", "var a:* = 5;\r\n" + @Test + public void testIncDec() { + decompileMethod("classic", "testIncDec", "var a:* = 5;\r\n" + "var b:* = 0;\r\n" + "trace(\"++var\");\r\n" + "b = ++a;\r\n" @@ -893,9 +757,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardInlineFunctions(String swfUsed) { - decompileMethod(swfUsed, "testInlineFunctions", "var first:String = null;\r\n" + @Test + public void testInlineFunctions() { + decompileMethod("classic", "testInlineFunctions", "var first:String = null;\r\n" + "first = \"value1\";\r\n" + "var traceParameter:Function = function(aParam:String):String\r\n" + "{\r\n" @@ -915,9 +779,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardInnerFunctions(String swfUsed) { - decompileMethod(swfUsed, "testInnerFunctions", "var s:int = 0;\r\n" + @Test + public void testInnerFunctions() { + decompileMethod("classic", "testInnerFunctions", "var s:int = 0;\r\n" + "var innerFunc:Function = function(b:String):*\r\n" + "{\r\n" + "trace(b);\r\n" @@ -931,9 +795,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardInnerIf(String swfUsed) { - decompileMethod(swfUsed, "testInnerIf", "var a:* = 5;\r\n" + @Test + public void testInnerIf() { + decompileMethod("classic", "testInnerIf", "var a:* = 5;\r\n" + "var b:* = 4;\r\n" + "if(a == 5)\r\n" + "{\r\n" @@ -958,9 +822,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardInnerTry(String swfUsed) { - decompileMethod(swfUsed, "testInnerTry", "try\r\n" + @Test + public void testInnerTry() { + decompileMethod("classic", "testInnerTry", "try\r\n" + "{\r\n" + "try\r\n" + "{\r\n" @@ -983,9 +847,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardLogicalComputing(String swfUsed) { - decompileMethod(swfUsed, "testLogicalComputing", "var b:Boolean = false;\r\n" + @Test + public void testLogicalComputing() { + decompileMethod("classic", "testLogicalComputing", "var b:Boolean = false;\r\n" + "var i:* = 5;\r\n" + "var j:* = 7;\r\n" + "if(i > j)\r\n" @@ -997,16 +861,16 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardManualConvert(String swfUsed) { - decompileMethod(swfUsed, "testManualConvert", "trace(\"String(this).length\");\r\n" + @Test + public void testManualConvert() { + decompileMethod("classic", "testManualConvert", "trace(\"String(this).length\");\r\n" + "trace(String(this).length);\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardMissingDefault(String swfUsed) { - decompileMethod(swfUsed, "testMissingDefault", "var jj:int = 1;\r\n" + @Test + public void testMissingDefault() { + decompileMethod("classic", "testMissingDefault", "var jj:int = 1;\r\n" + "switch(jj)\r\n" + "{\r\n" + "case 1:\r\n" @@ -1021,9 +885,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardMultipleCondition(String swfUsed) { - decompileMethod(swfUsed, "testMultipleCondition", "var a:* = 5;\r\n" + @Test + public void testMultipleCondition() { + decompileMethod("classic", "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" @@ -1037,18 +901,18 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardNamedAnonFunctions(String swfUsed) { - decompileMethod(swfUsed, "testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + @Test + public void testNamedAnonFunctions() { + decompileMethod("classic", "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); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardNames(String swfUsed) { - decompileMethod(swfUsed, "testNames", "var ns:* = this.getNamespace();\r\n" + @Test + public void testNames() { + decompileMethod("classic", "testNames", "var ns:* = this.getNamespace();\r\n" + "var name:* = this.getName();\r\n" + "var a:* = ns::unnamespacedFunc();\r\n" + "var b:* = ns::[name];\r\n" @@ -1057,21 +921,21 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardParamNames(String swfUsed) { - decompileMethod(swfUsed, "testParamNames", "return firstp + secondp + thirdp;\r\n", + @Test + public void testParamNames() { + decompileMethod("classic", "testParamNames", "return firstp + secondp + thirdp;\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardParamsCount(String swfUsed) { - decompileMethod(swfUsed, "testParamsCount", "return firstp;\r\n", + @Test + public void testParamsCount() { + decompileMethod("classic", "testParamsCount", "return firstp;\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardPrecedence(String swfUsed) { - decompileMethod(swfUsed, "testPrecedence", "var a:* = 0;\r\n" + @Test + public void testPrecedence() { + decompileMethod("classic", "testPrecedence", "var a:* = 0;\r\n" + "a = (5 + 6) * 7;\r\n" + "a = 5 * (2 + 3);\r\n" + "a = 5 + 6 * 7;\r\n" @@ -1086,9 +950,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardPrecedenceX(String swfUsed) { - decompileMethod(swfUsed, "testPrecedenceX", "var a:* = 5;\r\n" + @Test + public void testPrecedenceX() { + decompileMethod("classic", "testPrecedenceX", "var a:* = 5;\r\n" + "var b:* = 2;\r\n" + "var c:* = 3;\r\n" + "var d:* = a << (b >>> c);\r\n" @@ -1096,9 +960,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardProperty(String swfUsed) { - decompileMethod(swfUsed, "testProperty", "var d:* = new TestClass1();\r\n" + @Test + public void testProperty() { + decompileMethod("classic", "testProperty", "var d:* = new TestClass1();\r\n" + "var k:* = 7 + 8;\r\n" + "if(k == 15)\r\n" + "{\r\n" @@ -1107,25 +971,25 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardRegExp(String swfUsed) { - decompileMethod(swfUsed, "testRegExp", "var a1:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" + @Test + public void testRegExp() { + decompileMethod("classic", "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(dataProvider = "standardSwfNamesProvider") - public void testStandardRest(String swfUsed) { - decompileMethod(swfUsed, "testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + @Test + public void testRest() { + decompileMethod("classic", "testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + "return firstp;\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardStrictEquals(String swfUsed) { - decompileMethod(swfUsed, "testStrictEquals", "var k:int = 6;\r\n" + @Test + public void testStrictEquals() { + decompileMethod("classic", "testStrictEquals", "var k:int = 6;\r\n" + "if(this.f() !== this.f())\r\n" + "{\r\n" + "trace(\"is eight\");\r\n" @@ -1133,18 +997,18 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardStringConcat(String swfUsed) { - decompileMethod(swfUsed, "testStringConcat", "var k:int = 8;\r\n" + @Test + public void testStringConcat() { + decompileMethod("classic", "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); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardStrings(String swfUsed) { - decompileMethod(swfUsed, "testStrings", "trace(\"hello\");\r\n" + @Test + public void testStrings() { + decompileMethod("classic", "testStrings", "trace(\"hello\");\r\n" + "trace(\"quotes:\\\"hello!\\\"\");\r\n" + "trace(\"backslash: \\\\ \");\r\n" + "trace(\"single quotes: \\'hello!\\'\");\r\n" @@ -1152,9 +1016,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardSwitch(String swfUsed) { - decompileMethod(swfUsed, "testSwitch", "var a:* = 5;\r\n" + @Test + public void testSwitch() { + decompileMethod("classic", "testSwitch", "var a:* = 5;\r\n" + "switch(a)\r\n" + "{\r\n" + "case 57 * a:\r\n" @@ -1171,9 +1035,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardSwitchComma(String swfUsed) { - decompileMethod(swfUsed, "testSwitchComma", "var b:int = 5;\r\n" + @Test + public void testSwitchComma() { + decompileMethod("classic", "testSwitchComma", "var b:int = 5;\r\n" + "var a:String = \"A\";\r\n" + "switch(a)\r\n" + "{\r\n" @@ -1188,9 +1052,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardSwitchDefault(String swfUsed) { - decompileMethod(swfUsed, "testSwitchDefault", "var a:* = 5;\r\n" + @Test + public void testSwitchDefault() { + decompileMethod("classic", "testSwitchDefault", "var a:* = 5;\r\n" + "switch(a)\r\n" + "{\r\n" + "case 57 * a:\r\n" @@ -1210,9 +1074,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardTernarOperator(String swfUsed) { - decompileMethod(swfUsed, "testTernarOperator", "var a:* = 5;\r\n" + @Test + public void testTernarOperator() { + decompileMethod("classic", "testTernarOperator", "var a:* = 5;\r\n" + "var b:* = 4;\r\n" + "var c:* = 4;\r\n" + "var d:* = 78;\r\n" @@ -1221,9 +1085,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardTry(String swfUsed) { - decompileMethod(swfUsed, "testTry", "var i:int = 0;\r\n" + @Test + public void testTry() { + decompileMethod("classic", "testTry", "var i:int = 0;\r\n" + "i = 7;\r\n" + "try\r\n" + "{\r\n" @@ -1246,9 +1110,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardTryReturn(String swfUsed) { - decompileMethod(swfUsed, "testTryReturn", "var i:int = 0;\r\n" + @Test + public void testTryReturn() { + decompileMethod("classic", "testTryReturn", "var i:int = 0;\r\n" + "var b:Boolean = false;\r\n" + "try\r\n" + "{\r\n" @@ -1274,9 +1138,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardTryReturn2(String swfUsed) { - decompileMethod(swfUsed, "testTryReturn2", "var c:Boolean = false;\r\n" + @Test + public void testTryReturn2() { + decompileMethod("classic", "testTryReturn2", "var c:Boolean = false;\r\n" + "trace(\"before\");\r\n" + "var a:Boolean = true;\r\n" + "var b:Boolean = false;\r\n" @@ -1317,9 +1181,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardUsagesTry(String swfUsed) { - decompileMethod(swfUsed, "testUsagesTry", "var k:int = 5;\r\n" + @Test + public void testUsagesTry() { + decompileMethod("classic", "testUsagesTry", "var k:int = 5;\r\n" + "switch(k)\r\n" + "{\r\n" + "case 0:\r\n" @@ -1351,9 +1215,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardVector(String swfUsed) { - decompileMethod(swfUsed, "testVector", "var v:Vector. = new Vector.();\r\n" + @Test + public void testVector() { + decompileMethod("classic", "testVector", "var v:Vector. = new Vector.();\r\n" + "v.push(\"hello\");\r\n" + "v[0] = \"hi\";\r\n" + "var a:int = 5;\r\n" @@ -1362,16 +1226,16 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardVector2(String swfUsed) { - decompileMethod(swfUsed, "testVector2", "var a:Vector.> = new Vector.>();\r\n" + @Test + public void testVector2() { + decompileMethod("classic", "testVector2", "var a:Vector.> = new Vector.>();\r\n" + "var b:Vector. = new [10,20,30];\r\n", false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardWhileAnd(String swfUsed) { - decompileMethod(swfUsed, "testWhileAnd", "var a:int = 5;\r\n" + @Test + public void testWhileAnd() { + decompileMethod("classic", "testWhileAnd", "var a:int = 5;\r\n" + "var b:int = 10;\r\n" + "while(a < 10 && b > 1)\r\n" + "{\r\n" @@ -1383,9 +1247,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardWhileContinue(String swfUsed) { - decompileMethod(swfUsed, "testWhileContinue", "var a:* = 5;\r\n" + @Test + public void testWhileContinue() { + decompileMethod("classic", "testWhileContinue", "var a:* = 5;\r\n" + "while(true)\r\n" + "{\r\n" + "if(a == 9)\r\n" @@ -1405,9 +1269,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardWhileTry(String swfUsed) { - decompileMethod(swfUsed, "testWhileTry", "while(true)\r\n" + @Test + public void testWhileTry() { + decompileMethod("classic", "testWhileTry", "while(true)\r\n" + "{\r\n" + "try\r\n" + "{\r\n" @@ -1429,9 +1293,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardWhileTry2(String swfUsed) { - decompileMethod(swfUsed, "testWhileTry2", "var j:* = undefined;\r\n" + @Test + public void testWhileTry2() { + decompileMethod("classic", "testWhileTry2", "var j:* = undefined;\r\n" + "for(var i:* = 0; i < 100; i++)\r\n" + "{\r\n" + "try\r\n" @@ -1455,9 +1319,9 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } - @Test(dataProvider = "standardSwfNamesProvider") - public void testStandardXml(String swfUsed) { - decompileMethod(swfUsed, "testXml", "var g:XML = null;\r\n" + @Test + public void testXml() { + decompileMethod("classic", "testXml", "var g:XML = null;\r\n" + "var name:String = \"ahoj\";\r\n" + "var myXML:XML = \r\n" + "\r\n" @@ -1570,323 +1434,4 @@ public class ActionScript3Test extends ActionScriptTestBase { + ";\r\n", false); } - - @Test - public void testAssembledDoubleDup() { - decompileMethod("assembled", "testDoubleDup", "var _loc10_:Rectangle = myprop(_loc5_);\r\n" - + "_loc10_.mymethod(-_loc10_.width,-_loc10_.height);\r\n", - false); - } - - @Test - public void testAssembledDup() { - decompileMethod("assembled", "testDup", "return 1 - (var _loc1_:Number = 1 - _loc1_ / _loc4_) * _loc1_;\r\n", - false); - } - - @Test - public void testAssembledDupAssignment() { - decompileMethod("assembled", "testDupAssignment", "var _loc1_:int = 0;\r\n" - + "var _loc2_:int = 10;\r\n" - + "if(_loc1_ = _loc2_)\r\n" - + "{\r\n" - + "trace(_loc2_);\r\n" - + "}\r\n", - false); - } - - @Test - public void testAssembledForEach() { - decompileMethod("assembled", "testForEach", "var _loc5_:* = undefined;\r\n" - + "var _loc2_:* = 0;\r\n" - + "var _loc3_:int = 0;\r\n" - + "for each(var _loc4_ in _loc5_)\r\n" - + "{\r\n" - + "if(_loc4_ != null)\r\n" - + "{\r\n" - + "_loc2_ = _loc4_;\r\n" - + "}\r\n" - + "}\r\n" - + "_loc3_ = 0;\r\n", - false); - } - - @Test - public void testAssembledForEachCoerced() { - decompileMethod("assembled", "testForEachCoerced", "for each(var _loc6_ in someprop)\r\n" - + "{\r\n" - + "_loc6_.methodname(_loc1_,_loc2_,_loc5_);\r\n" - + "}\r\n", - false); - } - - @Test - public void testAssembledIncrement() { - decompileMethod("assembled", "testIncrement", "super();\r\n" - + "b = a++;\r\n", - false); - } - - @Test - public void testAssembledIncrement2() { - decompileMethod("assembled", "testIncrement2", "if(++loadCount == 2)\r\n" - + "{\r\n" - + "somemethod();\r\n" - + "}\r\n", - false); - } - - @Test - public void testAssembledIncrement3() { - decompileMethod("assembled", "testIncrement3", "_loc1_.length--;\r\n", - false); - } - - @Test - public void testAssembledSetSlotDup() { - decompileMethod("assembled", "testSetSlotDup", "var _loc5_:int = 5;\r\n" - + "myname.somemethod(\"okay\",myslot = _loc5_);\r\n" - + "myname.start();\r\n", - false); - } - - @Test - public void testAssembledSetSlotFindProperty() { - decompileMethod("assembled", "testSetSlotFindProperty", "return var myprop:int = 50;\r\n", - false); - } - - @Test - public void testAssembledSwitch() { - decompileMethod("assembled", "testSwitch", "switch(int(somevar))\r\n" - + "{\r\n" - + "case 0:\r\n" - + "var _loc2_:String = \"X\";\r\n" - + "return;\r\n" - + "break;\r\n" - + "case 1:\r\n" - + "_loc2_ = \"A\";\r\n" - + "break;\r\n" - + "case 3:\r\n" - + "_loc2_ = \"B\";\r\n" - + "break;\r\n" - + "case 4:\r\n" - + "_loc2_ = \"C\";\r\n" - + "}\r\n" - + "_loc2_ = \"after\";\r\n", - false); - } - - @Test - public void testAssembledSwitchDefault() { - decompileMethod("assembled", "testSwitchDefault", "switch(5)\r\n" - + "{\r\n" - + "case 6:\r\n" - + "var _loc2_:int = 6;\r\n" - + "case 0:\r\n" - + "_loc2_ = 0;\r\n" - + "break;\r\n" - + "case 1:\r\n" - + "_loc2_ = 1;\r\n" - + "case 5:\r\n" - + "_loc2_ = 5;\r\n" - + "break;\r\n" - + "case 3:\r\n" - + "_loc2_ = 3;\r\n" - + "break;\r\n" - + "default:\r\n" - + "_loc2_ = 100;\r\n" - + "}\r\n", - false); - } - - @Test - public void testOptionalParameters() { - String methodName = "testOptionalParameters"; - String className = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); - - int clsIndex = -1; - DoABC2Tag tag = null; - ABC abc = null; - for (Tag t : swfMap.get("standard").getTags()) { - if (t instanceof DoABC2Tag) { - tag = (DoABC2Tag) t; - abc = tag.getABC(); - clsIndex = abc.findClassByName(new DottedChain(new String[]{"tests", className}, "")); - if (clsIndex > -1) { - break; - } - } - } - assertTrue(clsIndex > -1); - - int methodInfo = abc.findMethodInfoByName(clsIndex, "run"); - int bodyIndex = abc.findMethodBodyByName(clsIndex, "run"); - assertTrue(methodInfo > -1); - assertTrue(bodyIndex > -1); - HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); - abc.method_info.get(methodInfo).getParamStr(writer, abc.constants, abc.bodies.get(bodyIndex), abc, new ArrayList<>()); - String actualResult = writer.toString().replaceAll("[ \r\n]", ""); - String expectedResult = "p1:Event=null,p2:Number=1,p3:Number=-1,p4:Number=-1.1,p5:Number=-1.1,p6:String=\"a\""; - expectedResult = expectedResult.replaceAll("[ \r\n]", ""); - assertEquals(actualResult, expectedResult); - } - - @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" - + "}"); - } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3CrossCompileDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3CrossCompileDecompileTest.java new file mode 100644 index 000000000..f2208e7d7 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3CrossCompileDecompileTest.java @@ -0,0 +1,372 @@ +package com.jpexs.decompiler.flash; + +import java.io.IOException; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3CrossCompileDecompileTest extends ActionScript3DecompileTestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + addSwf("flex", "testdata/cross_compile/bin/Main.flex.swf"); + addSwf("air", "testdata/cross_compile/bin/Main.air.swf"); + } + + @DataProvider + public Object[][] swfNamesProvider() { + return new Object[][]{ + {"flex"}, + {"air"} + }; + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryCatch(String swfUsed) { + decompileMethod(swfUsed, "testTryCatch", "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryCatchExceptionUsage(String swfUsed) { + decompileMethod(swfUsed, "testTryCatchExceptionUsage", "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"catched exception: \" + e.message);\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryCatchIfInTry(String swfUsed) { + decompileMethod(swfUsed, "testTryCatchIfInTry", "var a:Boolean = true;\r\n" + + "trace(\"before\");\r\n" + + "try\r\n" + + "{\r\n" + + "if(a)\r\n" + + "{\r\n" + + "trace(\"ret\");\r\n" + + "return;\r\n" + + "}\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryCatchLoop(String swfUsed) { + decompileMethod(swfUsed, "testTryCatchLoop", "var j:int = 0;\r\n" + + "var i:int = 0;\r\n" + + "while(i < 100)\r\n" + + "{\r\n" + + "try\r\n" + + "{\r\n" + + "j = 0;\r\n" + + "while(j < 20)\r\n" + + "{\r\n" + + "trace(\"a\");\r\n" + + "j++;\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" + + "trace(\"after_try\");\r\n" + + "i++;\r\n" + + "}\r\n" + + "trace(\"end\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinally(String swfUsed) { + decompileMethod(swfUsed, "testTryFinally", "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyDirectReturnInFinally(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyDirectReturnInFinally", "var str:String = \"xxx\";\r\n" + + "try\r\n" + + "{\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"error\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"hi \");\r\n" + + "if(str == \"check\")\r\n" + + "{\r\n" + + "return str;\r\n" + + "}\r\n" + + "return \"hu\" + str;\r\n" + + "}\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyLoop(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyLoop", "var i:int = 0;\r\n" + + "while(i < 10)\r\n" + + "{\r\n" + + "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "if(i == 5)\r\n" + + "{\r\n" + + "i = i + 5;\r\n" + + "trace(\"continue while\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "i++;\r\n" + + "}\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyLoopInFinally(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyLoopInFinally", "var i:int = 0;\r\n" + + "while(i < 10)\r\n" + + "{\r\n" + + "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "if(i == 5)\r\n" + + "{\r\n" + + "i = i + 7;\r\n" + + "trace(\"continue while\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "i++;\r\n" + + "}\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyMultipleCatch(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyMultipleCatch", "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch Error\");\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + + "{\r\n" + + "trace(\"in catch EOFError\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyNoCatch(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyNoCatch", "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyReturn(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyReturn", "var a:int = 0;\r\n" + + "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "a = 5;\r\n" + + "if(a > 4)\r\n" + + "{\r\n" + + "return \"RET\";\r\n" + + "}\r\n" + + "trace(\"between\");\r\n" + + "if(a < 3)\r\n" + + "{\r\n" + + "return \"RE2\";\r\n" + + "}\r\n" + + "trace(\"in try2\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "return \"RETFINAL\";\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyReturnInFinally(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyReturnInFinally", "var a:int = 0;\r\n" + + "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "a = 5;\r\n" + + "if(a > 4)\r\n" + + "{\r\n" + + "return \"RET\";\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "if(a > 6)\r\n" + + "{\r\n" + + "return \"FINRET1\";\r\n" + + "}\r\n" + + "trace(\"xx\");\r\n" + + "if(a > 5)\r\n" + + "{\r\n" + + "return \"FINRET2\";\r\n" + + "}\r\n" + + "trace(\"nofinret\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "return \"RETEXIT\";\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyReturnNested(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyReturnNested", "var a:int = Math.random() * 5;\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"before try2\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try2\");\r\n" + + "if(a > 4)\r\n" + + "{\r\n" + + "return \"RET\";\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally2\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally1\");\r\n" + + "}\r\n" + + "return \"RETFINAL\";\r\n", + false); + } + + @Test(dataProvider = "swfNamesProvider") + public void testTryFinallyReturnVoid(String swfUsed) { + decompileMethod(swfUsed, "testTryFinallyReturnVoid", "var a:int = Math.random() * 5;\r\n" + + "trace(\"before try\");\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"in try\");\r\n" + + "if(a > 4)\r\n" + + "{\r\n" + + "return;\r\n" + + "}\r\n" + + "trace(\"in try2\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"in catch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"in finally\");\r\n" + + "}\r\n" + + "trace(\"after\");\r\n", + false); + } +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java new file mode 100644 index 000000000..6ba944cc1 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java @@ -0,0 +1,105 @@ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.abc.types.ConvertData; +import com.jpexs.decompiler.flash.abc.types.traits.Traits; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.helpers.NulWriter; +import com.jpexs.decompiler.flash.tags.ABCContainerTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.graph.DottedChain; +import com.jpexs.decompiler.graph.ScopeStack; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; + +/** + * + * @author JPEXS + */ +public abstract class ActionScript3DecompileTestBase extends ActionScriptTestBase { + + private final Map swfMap = new HashMap<>(); + + @BeforeClass + public void initConfiguration() throws IOException, InterruptedException { + Configuration.autoDeobfuscate.set(false); + Configuration.simplifyExpressions.set(false); + + Configuration.decompile.set(true); + Configuration.registerNameFormat.set("_loc%d_"); + Configuration.showMethodBodyId.set(false); + } + + protected void addSwf(String identifier, String path) throws FileNotFoundException, IOException, InterruptedException { + swfMap.put(identifier, new SWF(new BufferedInputStream(new FileInputStream(path)), false)); + } + + public SWF getSwf(String identifier) { + return swfMap.get(identifier); + } + + protected void decompileMethod(String swfIdentifier, String methodName, String expectedResult, boolean isStatic) { + String className = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); + + int clsIndex = -1; + int scriptIndex = -1; + + ABC abc = null; + SWF swf = getSwf(swfIdentifier); + List abcs = new ArrayList<>(); + for (ABCContainerTag abcTag : swf.getAbcList()) { + abcs.add(abcTag.getABC()); + } + ScriptPack scriptPack = null; + for (ABC a : abcs) { + scriptPack = a.findScriptPackByPath("tests." + className, abcs); + if (scriptPack != null) { + break; + } + } + assertNotNull(scriptPack); + abc = scriptPack.abc; + scriptIndex = scriptPack.scriptIndex; + + clsIndex = abc.findClassByName(new DottedChain(new String[]{"tests", className}, "")); + + assertTrue(clsIndex > -1); + assertTrue(scriptIndex > -1); + + int bodyIndex = abc.findMethodBodyByName(clsIndex, "run"); + + assertTrue(bodyIndex > -1); + HighlightedTextWriter writer; + try { + List ts = new ArrayList<>(); + ts.add(abc.instance_info.get(clsIndex).instance_traits); + abc.bodies.get(bodyIndex).convert(new ConvertData(), "run", ScriptExportMode.AS, isStatic, abc.bodies.get(bodyIndex).method_info, scriptIndex, clsIndex, abc, null, new ScopeStack(scriptIndex), 0, new NulWriter(), new ArrayList<>(), ts, true); + writer = new HighlightedTextWriter(new CodeFormatting(), false); + abc.bodies.get(bodyIndex).toString("run", ScriptExportMode.AS, abc, null, writer, new ArrayList<>()); + } catch (InterruptedException ex) { + fail(); + return; + } + String actualResult = cleanPCode(writer.toString()); + expectedResult = cleanPCode(expectedResult); + assertEquals(actualResult, expectedResult); + } + +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptinalParametersTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptinalParametersTest.java new file mode 100644 index 000000000..43b7594c8 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptinalParametersTest.java @@ -0,0 +1,57 @@ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.graph.DottedChain; +import java.io.IOException; +import java.util.ArrayList; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3OptinalParametersTest extends ActionScript3DecompileTestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + addSwf("standard", "testdata/flashdevelop/bin/flashdevelop.swf"); + } + @Test + public void testOptionalParameters() { + String methodName = "testOptionalParameters"; + String className = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); + + int clsIndex = -1; + DoABC2Tag tag = null; + ABC abc = null; + for (Tag t : getSwf("standard").getTags()) { + if (t instanceof DoABC2Tag) { + tag = (DoABC2Tag) t; + abc = tag.getABC(); + clsIndex = abc.findClassByName(new DottedChain(new String[]{"tests", className}, "")); + if (clsIndex > -1) { + break; + } + } + } + assertTrue(clsIndex > -1); + + int methodInfo = abc.findMethodInfoByName(clsIndex, "run"); + int bodyIndex = abc.findMethodBodyByName(clsIndex, "run"); + assertTrue(methodInfo > -1); + assertTrue(bodyIndex > -1); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + abc.method_info.get(methodInfo).getParamStr(writer, abc.constants, abc.bodies.get(bodyIndex), abc, new ArrayList<>()); + String actualResult = writer.toString().replaceAll("[ \r\n]", ""); + String expectedResult = "p1:Event=null,p2:Number=1,p3:Number=-1,p4:Number=-1.1,p5:Number=-1.1,p6:String=\"a\""; + expectedResult = expectedResult.replaceAll("[ \r\n]", ""); + assertEquals(actualResult, expectedResult); + } +} 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 5e84f4458..0acfabd45 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 @@ -50,7 +50,9 @@ import java.util.TreeMap; */ public class AS3Generator { - private static void useFile(StringBuilder s, File f, String identifier) throws FileNotFoundException, IOException, InterruptedException { + private static void useFile(String testClassName, String[][] swfAndIdentifierList, boolean multipleProviders) throws FileNotFoundException, IOException, InterruptedException { + StringBuilder s = new StringBuilder(); + File f = new File(swfAndIdentifierList[0][0]); SWF swf = new SWF(new BufferedInputStream(new FileInputStream(f)), false); DoABC2Tag tag = null; List scriptPacks = swf.getAS3Packs(); @@ -58,6 +60,46 @@ public class AS3Generator { for (ScriptPack pack : scriptPacks) { sortedPacks.put(pack.getClassPath().toRawString(), pack); } + s.append("package com.jpexs.decompiler.flash;\r\n"); + s.append("\r\n"); + s.append("import java.io.IOException;\r\n"); + s.append("import org.testng.annotations.BeforeClass;\r\n"); + if (multipleProviders) { + s.append("import org.testng.annotations.DataProvider;\r\n"); + } + s.append("import org.testng.annotations.Test;\r\n"); + + s.append("/**\r\n"); + s.append(" *\r\n"); + s.append(" * @author JPEXS\r\n"); + s.append(" */\r\n"); + s.append("public class ").append(testClassName).append(" extends ActionScript3DecompileTestBase {\r\n"); + + s.append("@BeforeClass\r\n"); + s.append("public void init() throws IOException, InterruptedException {\r\n"); + for (int i = 0; i < swfAndIdentifierList.length; i++) { + s.append("addSwf(\"").append(swfAndIdentifierList[i][1]).append("\", \"").append(swfAndIdentifierList[i][0].replace("\\", "\\\\")).append("\");\r\n"); + } + s.append("}\r\n"); + + if (multipleProviders) { + s.append("@DataProvider\r\n"); + s.append("public Object[][] swfNamesProvider() {\r\n"); + s.append("return new Object[][]{\r\n"); + + for (int i = 0; i < swfAndIdentifierList.length; i++) { + s.append("{\""); + s.append(swfAndIdentifierList[i][1]); + s.append("\"}"); + if (i < swfAndIdentifierList.length - 1) { + s.append(","); + } + s.append("\r\n"); + } + s.append("};\r\n"); + s.append("}\r\n"); + } + for (String packClassName : sortedPacks.keySet()) { ScriptPack pack = sortedPacks.get(packClassName); ABC abc = pack.abc; @@ -71,20 +113,20 @@ public class AS3Generator { String name = t.getName(abc).getName(abc.constants, null, true, true); String clsName = pack.getClassPath().className; String lower = clsName.substring(0, 1).toLowerCase() + clsName.substring(1); - String idUpper = identifier.substring(0, 1).toUpperCase() + identifier.substring(1); - String testMethodName = lower.replaceAll("^test", "test" + idUpper); + String identifier = swfAndIdentifierList[0][1]; + String testMethodName = lower; //lower.replaceAll("^test", "test" + idUpper); if (lower.equals("testOptionalParameters")) { //SPECIAL: ignored continue; } if (name.equals("run")) { - if (identifier.equals("standard")) { - s.append("@Test(dataProvider = \"standardSwfNamesProvider\")\r\n"); + if (multipleProviders) { + s.append("@Test(dataProvider = \"swfNamesProvider\")\r\n"); } else { s.append("@Test\r\n"); } s.append("public void "); s.append(testMethodName); - if (identifier.equals("standard")) { + if (multipleProviders) { s.append("(String swfUsed){\r\ndecompileMethod(swfUsed"); } else { s.append("(){\r\ndecompileMethod(\""); @@ -118,18 +160,23 @@ public class AS3Generator { } } } + + s.append("}\r\n"); + String testPath = "test/com/jpexs/decompiler/flash/"; + Helper.writeFile(testPath + testClassName + ".java", s.toString().getBytes("UTF-8")); } public static void main(String[] args) throws Exception { Configuration.autoDeobfuscate.set(false); - StringBuilder s = new StringBuilder(); + useFile("ActionScript3ClassicDecompileTest", new String[][]{{"testdata/flashdevelop/bin/flashdevelop.swf", "classic"}}, false); + useFile("ActionScript3CrossCompileDecompileTest", new String[][]{ + {"testdata/cross_compile/bin/Main.flex.swf", "flex"}, + {"testdata/cross_compile/bin/Main.air.swf", "air"} + }, true); + useFile("ActionScript3AssembledDecompileTest", new String[][]{{"testdata/custom/bin/custom.swf", "assembled"}}, false); - useFile(s, new File("testdata/flashdevelop/bin/flashdevelop.swf"), "standard"); - useFile(s, new File("testdata/custom/bin/custom.swf"), "assembled"); - - Helper.writeFile("as3_teststub.java", s.toString().getBytes("UTF-8")); System.exit(0); } } diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf index 2ada6378dcb87b270d1409e759eca1cb73bb35ae..1e837d9a9da90070e48cce3272d347b7c21ddcbd 100644 GIT binary patch literal 2872 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 literal 2760 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 O_CMoqgYX~G_{=3&m_8-| diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf index 948424409eb0fa0e261b92b092d2c60d3fc0679a..cfb3f5ceeacf0f58a99a400f605e7ff0c296c4db 100644 GIT binary patch literal 3856 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 Fsr006*vbF^ diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex_apache.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex_apache.swf index 6742e0bc561a1b670ef2be606a7403178cdc2a91..5737090546aee7f3cdd0f20714953f2d4cb79448 100644 GIT binary patch literal 3856 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 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf index 866fe6d15baa3adf5d61c89d93acf7e6de62b6e3..1fceba1defdab2a5ec26fbe650c68d201bc72e04 100644 GIT binary patch literal 1626 zcmV-g2BrB!S5pbt4FCXm+O1YgZyQwFBcB5%>sDh`|r2P56x82wYI(H0M>)HTaCtUtZi5pvW<2x z7p*4L*)ZL`rnBa>jmhp9o@J=lbQ=DGZ+)-sTDx`AW02|g-EMf+bhlNMH(q8uEi(8r z?`^P|wf>j6J_2Q>^|Iw?>y3TOT&P>S@uhv!aTl%Du6G*ED2Mg(q0l<9=D=K(tFE0n&%?KUmflwAlmWp7Zh$!xR5k3{un2Wq=JO0(?L8a9$$VAzUo*UPP) z>6*wI5i65(YWWMkv!!HjW^ZH{vP;=TbcT_6Mhc94z{oj9t}p_YYmA&_M$Zrx|{S;S$3W49_w$$M7VR-(~a?qn8i@J?eS@6-6CWWM5iDVhhXKhPNkf2Cj@TfeFh`*TpcqHdG@t}WdKgfeqf`V? zA4l0Jph1oXVt@>ehU0+p9F6FJMmaj02Qc0Vj4r^-O+gxppg2mR4C+Ti zD2L9V0y>W-Q4wLFEMYV(5j-SOGAKzjA<0r&Qsl72l!&CVsHCYeDWt`va7dRT;k*=$ zB&Aq1CBZR5$)e@!e05-WaUMkt|6$EC37&HoCnrQ7^@`Es zlImfV>Itw^CC`uqgX9%gdHDq2&1n~EM~NR`H`wxm5(!UD=V*B98t@7Sctw0(QLgJ! zudXA#M->6nafwG@Fu=Yx@>M3D%35X|h{Xc6;(jfiN`!uLTq;JYnCOLooKYcX!mIG4 zN()Gb6VN6ql#;@US1AS|6oM5yiNz3P{MVq2W9NqCJo;&?(wiErU} zIML+I1(_yq-Up)T0MU$3G|RR6#wY6b67AAYevN*jtEATz>vW|Li}~e5g^+)8Az$SD z#OItF0nWJ@i0cb*?)NzlaB)BGou!$;EG5M(<@hiQ?x{BtaE1EQm4lCYpfDJqFyvDh zrkK#VUJ6l8;Z^DRD*}=lfuuP<=?L%ZYuuA{3Yr3ir02;nLPf<-xynIC%o08FeAzCa z*12GBG()P-vKU?^+T9J1;cgAc<^yEU_+-!W!TIr3WOYuK4~cg&d`MQwTTN4&7GzVN z^V?V)@Y)(|Umsx`@@&K2WPt?ukCT({#4YukF`${bi_py6GBh(9Xr|ydbB-(jEi|*m zmNit6zi(B&hH~x3G*J?oO8Fa-){Q5YPWKqw4_v0avYKW(3?AE&u=k literal 1529 zcmVn+Ye|6qZ?@rA@qCSzXpN@de`S}GX) z*1iT`cEz{1VpV6e*>Z%9-dkFapZL#4@En(6bB5jY{JOW}6d+22faSH@*Kg9jy*I3DnrQzb22;ZOj| z%#yvmE}YZ6CeRWAa9Vn>wjMv}VJ;iwb!r7?&vv%`deggBppI8#yUlt{z3;c`-a}*E zY5VJ~{YBxb-l=}=*gkFTc=@P(DUAQ5U3utaqgQL2YaU=TYP;ENZYR5jWhvTt@9{>x z1$FK@{!YtV^SZ`NuaC$weA;yE{>jEx3|IO)CQk- z^(kn`ZdK}@eyh1#cNQD?pxXV28U-TZpfPTY?lHShW+IjY@m#LQQ5ehEOXE=U~;}XYH98YlkHpgX-XE~YU z_&irGarzFYmpQ${={(2d98Yq5fs^+*dw(W);Z$_;ye{T%;Ll$nPxvH<2u1`mjByf> zA`r_1(gflOKyiU$I-sOLi5Q@?KxQ0JpFmjy(11X>ETFtVL&Jb9fksk*3IdIpfW`$n zn+7x?(7B9;(G;RUPe%qyp$zIrgJ>9yqBE$7Cebv4%0mo37{Pf)NrEw|Glj*Ns>B&r z4W{ud)3sq1(^D)SGno-jvxJdh$;1qz(95s5Q?6~0neqcxkMsjxl|%*xlAHv zxr#)J<*E{?mdhpLma9pmS*|XTZn-guVwM}1C~moiM26)i0F^iT${YRVja+$Spu90y z-q7GKVadl$t{{X7A#}D={t}mzI~WuArtocM5hBFK!36_@hD{isxF&E~!FqpAp)g5^ zXPq?!nW)Hx0f1zLUOAm|D3WrliZ@3N9{+D*C6ZVT6LUfdUFwu4Yz*!LB6k&M;AaO; zeIoc7_T+>;i5AhIj4?R{Wwb~cJuDL=DxvL8`8+wWiC!he+F|B%h%TZ78|zhE>^sb4 zf}(?x!cSl~|2aA$=2%ddb;_oNkjBguoNWb;NjNGYhjb7|AdHwlLl~F}0sZv+Rg0$Q zSAkhP!psPnC4{m|rW8q!{R@}-$zIK zG|YggaYLbMd=zZy2!%{YAqxrV_hJxI_t;@(GtfQSJlK^dnQUN>b?u^2^AhmuD$}zF zFHwg4fz2ObD1zX?!gYlXEZhfzeG!8FA;Fx`=n?K=`0Xi%J>s#Kh$q{LAGc%X<<1C( zQog^0d=avbLbBsUAUl2;Tm~X!2Sc($Le0-kFVAdbc`|Z&M#b7nzS&n2ZH0#GWWmQZ zppcJH7!E0n2nvtzDGukcE#}CcipEQ7n0!@$emP@$7~JK0?(~!8f29#?A>UGbmFRcx z0pq(hAZta)j)r8%#BhIk5m{4^6*CM(6f;~UuQlv0Ey$)m6>myuC}=C+U2AC@4s0XA z{6PZz=h4y6@(l``v7niYm!O%8%g{_A(#)B#nX{qtBG+iQ8@;ESY$(0fz2n(_YbHdHbm7M?Tq;jvSLPM?_!xW|E-)UCFfN9S&k4rP3)I(7UW}DDT85RVdJ_>Y flOdNW@YcFU_ 4) { return "RET"; diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as index c18fb4b7e..b5f57ccb9 100644 --- a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as @@ -9,11 +9,11 @@ package tests public function run() : void { + var a:int = Math.random() * 5; trace("before try"); try { trace("in try"); - var a:int = 5; if (a > 4) { return;