From b85b396b2a5463bfd15ddec24cb94f535dfbc573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Thu, 28 Feb 2013 22:16:22 +0100 Subject: [PATCH] AS3: Tests --- ...{TestABCStream.java => ABCStreamTest.java} | 10 +- .../decompiler/flash/ActionScript3Test.java | 799 +++++++++++ .../com/jpexs/decompiler/flash/Generator.java | 64 + ...{TestRecompile.java => RecompileTest.java} | 13 +- ...{TestSWFStream.java => SWFStreamTest.java} | 30 +- trunk/testdata/as3/TestMovie.as | 36 +- trunk/testdata/as3/TestMovie.fla | Bin 0 -> 4602 bytes trunk/testdata/as3/TestMovie.swf | Bin 2487 -> 9091 bytes trunk/testdata/as3/classes/Test.as | 1211 +++++++++++------ trunk/testdata/as3/classes/TestClass1.as | 19 +- trunk/testdata/as3/classes/TestClass2.as | 20 + trunk/testdata/as3/classes/TestClass3.as | 8 + trunk/testdata/as3/classes/myInternal.as | 4 + 13 files changed, 1753 insertions(+), 461 deletions(-) rename trunk/test/com/jpexs/decompiler/flash/{TestABCStream.java => ABCStreamTest.java} (84%) create mode 100644 trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java create mode 100644 trunk/test/com/jpexs/decompiler/flash/Generator.java rename trunk/test/com/jpexs/decompiler/flash/{TestRecompile.java => RecompileTest.java} (81%) rename trunk/test/com/jpexs/decompiler/flash/{TestSWFStream.java => SWFStreamTest.java} (82%) create mode 100644 trunk/testdata/as3/TestMovie.fla create mode 100644 trunk/testdata/as3/classes/TestClass2.as create mode 100644 trunk/testdata/as3/classes/TestClass3.as create mode 100644 trunk/testdata/as3/classes/myInternal.as diff --git a/trunk/test/com/jpexs/decompiler/flash/TestABCStream.java b/trunk/test/com/jpexs/decompiler/flash/ABCStreamTest.java similarity index 84% rename from trunk/test/com/jpexs/decompiler/flash/TestABCStream.java rename to trunk/test/com/jpexs/decompiler/flash/ABCStreamTest.java index a75401297..058daff99 100644 --- a/trunk/test/com/jpexs/decompiler/flash/TestABCStream.java +++ b/trunk/test/com/jpexs/decompiler/flash/ABCStreamTest.java @@ -5,10 +5,14 @@ import com.jpexs.decompiler.flash.abc.ABCOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import junit.framework.TestCase; -import org.junit.Test; +import static org.testng.Assert.*; +import org.testng.annotations.Test; -public class TestABCStream extends TestCase { +/** + * + * @author JPEXS + */ +public class ABCStreamTest { @Test public void testU30() { try { diff --git a/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java new file mode 100644 index 000000000..d6917b7e1 --- /dev/null +++ b/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -0,0 +1,799 @@ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.graph.GraphTargetItem; +import com.jpexs.decompiler.flash.tags.DoABCTag; +import com.jpexs.decompiler.flash.tags.Tag; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Stack; +import static org.testng.Assert.*; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3Test { + + private SWF swf; + private int clsIndex; + private ABC abc; + + @BeforeClass + public void init() throws IOException { + swf = new SWF(new FileInputStream("testdata/as3/TestMovie.swf")); + DoABCTag tag = null; + for (Tag t : swf.tags) { + if (t instanceof DoABCTag) { + tag = (DoABCTag) t; + break; + } + } + assertNotNull(tag); + clsIndex = tag.abc.findClassByName("classes.Test"); + assertTrue(clsIndex > -1); + this.abc = tag.abc; + } + + private void decompileMethod(String methodName, String expectedResult, boolean isStatic) { + int bodyIndex = abc.findMethodBodyByName(clsIndex, methodName); + assertTrue(bodyIndex > -1); + String actualResult = abc.bodies[bodyIndex].toString(methodName, false, isStatic, clsIndex, abc, abc.constants, abc.method_info, new Stack(), false, false, new ArrayList(), abc.instance_info[clsIndex].instance_traits); + actualResult = actualResult.replaceAll("[ \r\n]", ""); + expectedResult = expectedResult.replaceAll("[ \r\n]", ""); + assertEquals(expectedResult, actualResult); + } + + @Test + public void testHello() { + decompileMethod("testHello", "trace(\"hello\");\r\n", false); + } + + @Test + public void testIncDec() { + decompileMethod("testIncDec", "var a:* = 5;\r\n" + + "var b:* = 0;\r\n" + + "trace(\"++var\");\r\n" + + "b=++a;\r\n" + + "trace(\"var++\");\r\n" + + "b=a++;\r\n" + + "trace(\"--var\");\r\n" + + "b=--a;\r\n" + + "trace(\"var--\");\r\n" + + "b=a--;\r\n" + + "var c:* = [1,2,3,4,5];\r\n" + + "trace(\"++arr\");\r\n" + + "b=++c[2];\r\n" + + "trace(\"arr++\");\r\n" + + "b=c[2]++;\r\n" + + "trace(\"--arr\");\r\n" + + "b=--c[2];\r\n" + + "trace(\"arr--\");\r\n" + + "b=c[2]--;\r\n" + + "var d:* = new TestClass1();\r\n" + + "trace(\"++property\");\r\n" + + "trace(++d.attrib);\r\n" + + "trace(\"property++\");\r\n" + + "trace(d.attrib++);\r\n" + + "trace(\"--property\");\r\n" + + "trace(--d.attrib);\r\n" + + "trace(\"property--\");\r\n" + + "trace(d.attrib--);\r\n" + + "trace(\"arr[e++]\");\r\n" + + "var chars:Array = new Array(36);\r\n" + + "var index:uint = 0;\r\n" + + "chars[index++]=5;\r\n" + + "trace(\"arr[++e]\");\r\n" + + "chars[++index]=5;\r\n", false); + } + + @Test + public void testDoWhile() { + decompileMethod("testDoWhile", "var a:* = 8;\r\n" + + "do\r\n" + + "{\r\n" + + "trace(\"a=\"+a);\r\n" + + "a++;\r\n" + + "}\r\n" + + "while(a>=20);\r\n", false); + } + + @Test + public void testInnerTry() { + decompileMethod("testInnerTry", "try\r\n" + + "{\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"try body 1\");\r\n" + + "}\r\n" + + "catch(e:DefinitionError)\r\n" + + "{\r\n" + + "trace(\"catched DefinitionError\");\r\n" + + "}\r\n" + + "trace(\"after try 1\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"catched Error\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"finally block\");\r\n" + + "}\r\n", false); + } + + @Test + public void testWhileContinue() { + decompileMethod("testWhileContinue", "var a:* = 5;\r\n" + + "while(true)\r\n" + + "{\r\n" + + "if(a==9)\r\n" + + "{\r\n" + + "if(a==8)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(a==9)\r\n" + + "{\r\n" + + "return;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"hello 1\");\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "trace(\"hello2\");\r\n" + + "continue loop0;\r\n", false); + } + + @Test + public void testPrecedence() { + decompileMethod("testPrecedence", "var a:* = 0;\r\n" + + "a=(5+6)*7;\r\n" + + "a=5*(2+3);\r\n" + + "a=5+6*7;\r\n" + + "a=5*2+2;\r\n" + + "trace(\"a=\"+a);\r\n", false); + } + + @Test + public void testStrings() { + decompileMethod("testStrings", "trace(\"hello\");\r\n" + + "trace(\"quotes:\\\"hello!\\\"\");\r\n" + + "trace(\"backslash: \\\\ \");\r\n" + + "trace(\"single quotes: \\'hello!\\'\");\r\n" + + "trace(\"new line \\r\\n hello!\");\r\n", false); + } + + @Test + public void testContinueLevels() { + decompileMethod("testContinueLevels", "var b:* = undefined;\r\n" + + "var c:* = undefined;\r\n" + + "var d:* = undefined;\r\n" + + "var e:* = undefined;\r\n" + + "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57*a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "b=0;\r\n" + + "while(b>=50)\r\n" + + "{\r\n" + + "if(b==10)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(b==15)\r\n" + + "{\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "b=b+1;\r\n" + + "continue;\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"default clause\");\r\n" + + "}\r\n" + + "c=0;\r\n" + + "loop0:\r\n" + + "for(;c>=8;c=c+1)\r\n" + + "{\r\n" + + "d=0;\r\n" + + "while(d>=25)\r\n" + + "{\r\n" + + "e=0;\r\n" + + "if(e>=50)\r\n" + + "{\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(e==9)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(e==20)\r\n" + + "{\r\n" + + "continue loop0;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(e==8)\r\n" + + "{\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "break loop0;\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "d++;\r\n" + + "}\r\n" + + "trace(\"hello\");\r\n" + + "}\r\n", false); + } + + @Test + public void testSwitchDefault() { + decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57*a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"default clause\");\r\n" + + "}\r\n", false); + } + + @Test + public void testMultipleCondition() { + decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" + + "var b:* = 8;\r\n" + + "var c:* = 9;\r\n" + + "if((a<=4||b<=8)&&c==7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", false); + } + + @Test + public void testForBreak() { + decompileMethod("testForBreak", "var a:* = 0;\r\n" + + "while(a>=10)\r\n" + + "{\r\n" + + "if(a==5)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"hello:\"+a);\r\n" + + "a++;\r\n" + + "continue;\r\n" + + "}\r\n" + + "}\r\n", false); + } + + @Test + public void testIf() { + decompileMethod("testIf", "var a:* = 5;\r\n" + + "if(a==7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n", false); + } + + @Test + public void testIfElse() { + decompileMethod("testIfElse", "var a:* = 5;\r\n" + + "if(a==7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", false); + } + + @Test + public void testFor() { + decompileMethod("testFor", "var a:* = 0;\r\n" + + "while(a>=10)\r\n" + + "{\r\n" + + "trace(\"a=\"+a);\r\n" + + "a++;\r\n" + + "}\r\n", false); + } + + @Test + public void testForContinue() { + decompileMethod("testForContinue", "var a:* = 0;\r\n" + + "for(;a>=10;a=a+1)\r\n" + + "{\r\n" + + "if(a==9)\r\n" + + "{\r\n" + + "if(a==5)\r\n" + + "{\r\n" + + "trace(\"part1\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"a=\"+a);\r\n" + + "if(a==7)\r\n" + + "{\r\n" + + "trace(\"part2\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"part3\");\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"part4\");\r\n" + + "}\r\n" + + "trace(\"part5\");\r\n" + + "}\r\n", false); + } + + @Test + public void testTry() { + decompileMethod("testTry", "var i:int = 0;\r\n" + + "i=7;\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"try body\");\r\n" + + "}\r\n" + + "catch(e:DefinitionError)\r\n" + + "{\r\n" + + "trace(\"catched DefinitionError\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"Error message:\"+e.message);\r\n" + + "trace(\"Stacktrace:\"+e.getStackTrace());\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"Finally part\");\r\n" + + "}\r\n", false); + } + + @Test + public void testSwitch() { + decompileMethod("testSwitch", "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57*a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "}\r\n", false); + } + + @Test + public void testTernarOperator() { + decompileMethod("testTernarOperator", "var a:* = 5;\r\n" + + "var b:* = 4;\r\n" + + "var c:* = 4;\r\n" + + "var d:* = 78;\r\n" + + "var e:* = a==b?true:3;\r\n" + + "trace(\"e=\"+e);\r\n", false); + } + + @Test + public void testInnerIf() { + decompileMethod("testInnerIf", "var a:* = 5;\r\n" + + "var b:* = 4;\r\n" + + "if(a==5)\r\n" + + "{\r\n" + + "if(b==6)\r\n" + + "{\r\n" + + "trace(\"b==6\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"b!=6\");\r\n" + + "}\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(b==7)\r\n" + + "{\r\n" + + "trace(\"b==7\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"b!=7\");\r\n" + + "}\r\n" + + "}\r\n" + + "trace(\"end\");\r\n", false); + } + + @Test + public void testVector() { + decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" + + "v.push(\"hello\");\r\n" + + "v[0]=\"hi\";\r\n" + + "v[5*8-39]=\"hi2\";\r\n" + + "trace(v[0]);\r\n", false); + } + + @Test + public void testProperty() { + decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" + + "var k:* = 7+8;\r\n" + + "if(k==15)\r\n" + + "{\r\n" + + "d.method(d.attrib*5);\r\n" + + "}\r\n", false); + } + + @Test + public void testRest() { + decompileMethod("testRest", "trace(\"firstRest:\"+restval[0]);\r\n" + + "return firstp;\r\n", false); + } + + @Test + public void testParamNames() { + decompileMethod("testParamNames", "return firstp+secondp+thirdp;\r\n", false); + } + + @Test + public void testForEach() { + decompileMethod("testForEach", "var list:Array = null;\r\n" + + "var item:* = undefined;\r\n" + + "list=new Array();\r\n" + + "list[0]=\"first\";\r\n" + + "list[1]=\"second\";\r\n" + + "list[2]=\"third\";\r\n" + + "for each (item in list)\r\n" + + "{\r\n" + + "trace(\"item #\"+item);\r\n" + + "}\r\n", false); + } + + @Test + public void testForEachObjectArray() { + decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" + + "var test:Array = null;\r\n" + + "list=new Array();\r\n" + + "list[0]=\"first\";\r\n" + + "list[1]=\"second\";\r\n" + + "list[2]=\"third\";\r\n" + + "test=new Array();\r\n" + + "test[0]=0;\r\n" + + "for each (test[0] in list)\r\n" + + "{\r\n" + + "trace(\"item #\"+test[0]);\r\n" + + "}\r\n", false); + } + + @Test + public void testForEachObjectAttribute() { + decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" + + "list=new Array();\r\n" + + "list[0]=\"first\";\r\n" + + "list[1]=\"second\";\r\n" + + "list[2]=\"third\";\r\n" + + "for each (this.testPriv in list)\r\n" + + "{\r\n" + + "trace(\"item #\"+this.testPriv);\r\n" + + "}\r\n", false); + } + + @Test + public void testParamsCount() { + decompileMethod("testParamsCount", "return firstp;\r\n", false); + } + + @Test + public void testInlineFunctions() { + decompileMethod("testInlineFunctions", "var first:String = null;\r\n" + + "first=\"value1\";\r\n" + + "var traceParameter:Function = new function(aParam:String):String\r\n" + + "{\r\n" + + "var second:String = null;\r\n" + + "second=\"value2\";\r\n" + + "second=second+\"cc\";\r\n" + + "var traceParam2:Function = new function(bParam:String):String\r\n" + + "{\r\n" + + "trace(bParam+\",\"+aParam);\r\n" + + "return first+second+aParam+bParam;\r\n" + + "};\r\n" + + "trace(second);\r\n" + + "traceParam2(aParam);\r\n" + + "return first;\r\n" + + "};\r\n" + + "traceParameter(\"hello\");\r\n", false); + } + + @Test + public void testMissingDefault() { + decompileMethod("testMissingDefault", "var jj:* = 1;\r\n" + + "switch(jj)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "jj=1;\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "jj=2;\r\n" + + "break;\r\n" + + "default:\r\n" + + "jj=3;\r\n" + + "}\r\n", false); + } + + @Test + public void testChainedAssignments() { + decompileMethod("testChainedAssignments", "var a:* = 0;\r\n" + + "var b:* = 0;\r\n" + + "var c:* = 0;\r\n" + + "var d:* = 0;\r\n" + + "d=c=b=a=5;\r\n" + + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" + + "e.attrib1=e.attrib2=e.attrib3=this.getCounter();\r\n" + + "this.traceIt(e.toString());\r\n", false); + } + + @Test + public void testFinallyZeroJump() { + decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" + + "try\r\n" + + "{\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"error is :\"+e.message);\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"hi \");\r\n" + + "return \"hu\"+str;\r\n" + + "}\r\n", false); + } + + @Test + public void testInnerFunctions() { + decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" + + "var innerFunc:Function = new function(b:String):*\r\n" + + "{\r\n" + + "trace(b);\r\n" + + "};\r\n" + + "var k:int = 5;\r\n" + + "if(k==6)\r\n" + + "{\r\n" + + "s=8;\r\n" + + "}\r\n" + + "innerFunc(a);\r\n", false); + } + + @Test + public void testDeclarations() { + decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" + + "var vstr:String = null;\r\n" + + "var vint:* = 0;\r\n" + + "var vuint:uint = 0;\r\n" + + "var vclass:TestClass1 = null;\r\n" + + "var vnumber:* = NaN;\r\n" + + "var vobject:Object = null;\r\n" + + "vall=6;\r\n" + + "vstr=\"hello\";\r\n" + + "vuint=7;\r\n" + + "vint=-4;\r\n" + + "vclass=new TestClass1();\r\n" + + "vnumber=0.5;\r\n" + + "vnumber=6;\r\n" + + "vobject=vclass;\r\n", false); + } + + @Test + public void testForIn() { + decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" + + "var item:Object = null;\r\n" + + "for (item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n" + + "for each (item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n", false); + } + + @Test + public void testNames() { + decompileMethod("testNames", "var ns:* = this.getNamespace();\r\n" + + "var name:* = this.getName();\r\n", false); + } + + @Test + public void testComplexExpressions() { + decompileMethod("testComplexExpressions", "var i:* = 0;\r\n" + + "var j:* = 0;\r\n" + + "j=i=i+(i=i+i++);\r\n", false); + } + + @Test + public void testExpressions() { + decompileMethod("testExpressions", "var arr:Array = null;\r\n" + + "var i:* = 5;\r\n" + + "var j:* = 5;\r\n" + + "if((i=i=i/2)==1||i==2)\r\n" + + "{\r\n" + + "arguments.concat(i);\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "if(i==0)\r\n" + + "{\r\n" + + "i=j++;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "arr[0]();\r\n" + + "}\r\n" + + "}\r\n" + + "return i==0;\r\n", false); + } + + @Test + public void testArguments() { + decompileMethod("testArguments", "return arguments[0];\r\n", false); + } + + @Test + public void testLogicalComputing() { + decompileMethod("testLogicalComputing", "var b:* = false;\r\n" + + "var i:* = 5;\r\n" + + "var j:* = 7;\r\n" + + "if(i>j)\r\n" + + "{\r\n" + + "j=9;\r\n" + + "b=true;\r\n" + + "}\r\n" + + "b=(i==0||i==1)&&j==0;\r\n", false); + } + + @Test + public void testInc2() { + decompileMethod("testInc2", "var a:* = [1];\r\n" + + "a[this.getInt()]++;\r\n" + + "var d:* = a[this.getInt()]++;\r\n" + + "var e:* = ++a[this.getInt()];\r\n" + + "var b:* = 1;\r\n" + + "b++;\r\n" + + "var c:* = 1;\r\n" + + "b=c++;\r\n", false); + } + + @Test + public void testDecl2() { + decompileMethod("testDecl2", "var k:* = 0;\r\n" + + "var i:* = 5;\r\n" + + "i=i+7;\r\n" + + "if(i==5)\r\n" + + "{\r\n" + + "if(i<8)\r\n" + + "{\r\n" + + "k=6;\r\n" + + "}\r\n" + + "}\r\n" + + "k=7;\r\n", false); + } + + @Test + public void testChain2() { + decompileMethod("testChain2", "var g:Array = null;\r\n" + + "var h:* = false;\r\n" + + "var extraLine:* = false;\r\n" + + "var r:* = 7;\r\n" + + "var t:* = 0;\r\n" + + "t=this.getInt();\r\n" + + "if(t+1=0)\r\n" + + "{\r\n" + + "trace(\"ch\");\r\n" + + "}\r\n", false); + } + + @Test + public void testDoWhile2() { + decompileMethod("testDoWhile2", "var k:* = 5;\r\n" + + "do\r\n" + + "{\r\n" + + "k++;\r\n" + + "if(k==7)\r\n" + + "{\r\n" + + "k=5*k;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "k=5-k;\r\n" + + "}\r\n" + + "k--;\r\n" + + "}\r\n" + + "while(k>=9);\r\n" + + "return 2;\r\n", false); + } + + @Test + public void testWhileAnd() { + decompileMethod("testWhileAnd", "var a:* = 5;\r\n" + + "var b:* = 10;\r\n" + + "while(a>10&&b<1)\r\n" + + "{\r\n" + + "a++;\r\n" + + "b--;\r\n" + + "}\r\n" + + "a=7;\r\n" + + "b=9;\r\n", false); + } + + @Test + public void testNamedAnonFunctions() { + decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + + "{\r\n" + + "return (param1 as TestClass2).attrib1==5;\r\n" + + "};\r\n", false); + } + + @Test + public void testStringConcat() { + decompileMethod("testStringConcat", "var k:* = 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); + } +} diff --git a/trunk/test/com/jpexs/decompiler/flash/Generator.java b/trunk/test/com/jpexs/decompiler/flash/Generator.java new file mode 100644 index 000000000..184072e26 --- /dev/null +++ b/trunk/test/com/jpexs/decompiler/flash/Generator.java @@ -0,0 +1,64 @@ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.graph.GraphTargetItem; +import com.jpexs.decompiler.flash.tags.DoABCTag; +import com.jpexs.decompiler.flash.tags.Tag; +import java.io.FileInputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Stack; + +/** + * + * Generates stub for ActionScript3Test + * + * @author JPEXS + */ +public class Generator { + public static void main(String[] args) throws Exception { + SWF swf=new SWF(new FileInputStream("testdata/as3/TestMovie.swf")); + DoABCTag tag = null; + for (Tag t : swf.tags) { + if (t instanceof DoABCTag) { + tag = (DoABCTag) t; + break; + } + } + ABC abc=tag.abc; + int classId=abc.findClassByName("classes.Test"); + StringBuilder s=new StringBuilder(); + for(Trait t:abc.instance_info[classId].instance_traits.traits){ + if(t instanceof TraitMethodGetterSetter){ + String name=t.getName(abc).getName(abc.constants, new ArrayList()); + if(name.startsWith("test")){ + s.append("@Test\r\npublic void "); + s.append(name); + s.append("(){\r\ndecompileMethod(\""); + s.append(name); + s.append("\", "); + String src=abc.findBody(((TraitMethodGetterSetter)t).method_info).toString("", false, false, classId, abc, abc.constants, abc.method_info, new Stack(), false, false, new ArrayList(), abc.instance_info[classId].instance_traits); + String srcs[]=src.split("[\r\n]+"); + for(int i=0;i - - - - - -delete myXML.node1.* -trace(myXML); - - var t:Test=new Test(); + var t:Test = new Test(); t.testHello(); } + + public static var staticVariable:int = 5; + public static var staticVariable2:int = 5; + + public function testStatic2():int + { + return TestMovie.staticVariable + TestMovie.staticVariable2; + } + + public function testStatic():void + { + var testFunction:Function = function(name:String):* + { + return TestMovie[name]; + }; + trace(testFunction("staticVariable")); + } } } \ No newline at end of file diff --git a/trunk/testdata/as3/TestMovie.fla b/trunk/testdata/as3/TestMovie.fla new file mode 100644 index 0000000000000000000000000000000000000000..f581ef8c82006da6a61c2d8c39cc93e79752d363 GIT binary patch literal 4602 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 literal 0 HcmV?d00001 diff --git a/trunk/testdata/as3/TestMovie.swf b/trunk/testdata/as3/TestMovie.swf index f0d5acb2d861195627578033b2161c3f4dffe77f..efe5dca3cdcad458f7d5e0235a966ae38bd07047 100644 GIT binary patch literal 9091 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 B(h&dv literal 2487 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 B_5}a{ diff --git a/trunk/testdata/as3/classes/Test.as b/trunk/testdata/as3/classes/Test.as index f9bc3ed44..9d7304a46 100644 --- a/trunk/testdata/as3/classes/Test.as +++ b/trunk/testdata/as3/classes/Test.as @@ -1,422 +1,797 @@ -package classes { -public class Test { - private var testPriv:int=5; - protected var testProt:int=9; - public var vec:Vector.=new Vector.(); +package classes +{ + import flash.utils.Dictionary; + import classes.myInternal; - public function testHello(){ - trace("hello"); + public class Test + { + private var testPriv:int = 5; + protected var testProt:int = 9; + public var t3:TestClass3; + public static const p:int = 8; + + public function testHello() + { + trace("hello"); + } + + public function testIncDec() + { + var a = 5; + var b = 0; + trace("++var"); + b = ++a; + trace("var++"); + b = a++; + trace("--var"); + b = --a; + trace("var--"); + b = a--; + var c = [1, 2, 3, 4, 5]; + trace("++arr"); + b = ++c[2]; + trace("arr++"); + b = c[2]++; + trace("--arr"); + b = --c[2]; + trace("arr--"); + b = c[2]--; + + var d = new TestClass1(); + trace("++property"); + trace(++d.attrib); + trace("property++"); + trace(d.attrib++); + trace("--property"); + trace(--d.attrib); + trace("property--"); + trace(d.attrib--); + + trace("arr[e++]"); + + var chars:Array = new Array(36); + var index:uint = 0; + + chars[index++] = 5; + + trace("arr[++e]"); + chars[++index] = 5; + return; + } + + public function testDoWhile() + { + var a = 8; + do + { + trace("a=" + a); + a++; + } while (a < 20); + return; + } + + public function testInnerTry() + { + try + { + try + { + trace("try body 1"); + } + catch (e:DefinitionError) + { + trace("catched DefinitionError"); + } + trace("after try 1"); + } + catch (e:Error) + { + trace("catched Error"); + } + finally + { + trace("finally block"); + } + } + + public function testWhileContinue() + { + var a = 5; + while (true) + { + if (a == 9) + { + if (a == 8) + { + continue; + } + if (a == 9) + { + break; + } + trace("hello 1"); + } + trace("hello2"); + } + return; + } + + public function testPrecedence() + { + var a = 0; + a = (5 + 6) * 7; + a = 5 * (2 + 3); + a = 5 + 6 * 7; + a = 5 * 2 + 2; + trace("a=" + a); + return; + } + + public function testStrings() + { + trace("hello"); + trace("quotes:\"hello!\""); + trace("backslash: \\ "); + trace("single quotes: \'hello!\'"); + trace("new line \r\n hello!"); + } + + public function testContinueLevels() + { + var a = 5; + loop123: switch (a) + { + case 57 * a: + trace("fiftyseven multiply a"); + var b = 0; + while (b < 50) + { + if (b == 10) + { + break; + } + if (b == 15) + { + break loop123; + } + b = b + 1; + } + break; + case 13: + trace("thirteen"); + case 14: + trace("fourteen"); + break; + case 89: + trace("eightynine"); + break; + default: + trace("default clause"); + } + + loop182: for (var c = 0; c < 8; c = c + 1) + { + + loop165: for (var d = 0; d < 25; d++) + { + + for (var e = 0; e < 50; e++) + { + if (e == 9) + { + break loop165; + } + if (e == 20) + { + continue loop182; + } + if (e == 8) + { + break; + } + break loop182; + } + } + trace("hello"); + } + } + + public function testSwitchDefault() + { + var a = 5; + switch (a) + { + case 57 * a: + trace("fiftyseven multiply a"); + break; + case 13: + trace("thirteen"); + case 14: + trace("fourteen"); + break; + case 89: + trace("eightynine"); + break; + default: + trace("default clause"); + } + } + + public function testMultipleCondition() + { + var a = 5; + var b = 8; + var c = 9; + if ((a <= 4 || b <= 8) && c == 7) + { + trace("onTrue"); + } + else + { + trace("onFalse"); + } + } + + public function testForBreak() + { + for (var a = 0; a < 10; a++) + { + if (a == 5) + { + break; + } + trace("hello:" + a); + } + } + + public function testIf() + { + var a = 5; + if (a == 7) + { + trace("onTrue"); + } + } + + public function testIfElse() + { + var a = 5; + if (a == 7) + { + trace("onTrue"); + } + else + { + trace("onFalse"); + } + } + + public function testFor() + { + for (var a = 0; a < 10; a++) + { + trace("a=" + a); + } + } + + public function testForContinue() + { + for (var a = 0; a < 10; a = a + 1) + { + if (a == 9) + { + if (a == 5) + { + trace("part1"); + continue; + } + trace("a=" + a); + if (a == 7) + { + trace("part2"); + continue; + } + trace("part3"); + } + else + { + trace("part4"); + } + trace("part5"); + } + } + + public function testTry() + { + var i:int; + i = 7; + try + { + trace("try body"); + } + catch (e:DefinitionError) + { + trace("catched DefinitionError"); + } + catch (e:Error) + { + trace("Error message:" + e.message); + trace("Stacktrace:" + e.getStackTrace()); + } + finally + { + trace("Finally part"); + } + } + + public function testSwitch() + { + var a = 5; + switch (a) + { + case 57 * a: + trace("fiftyseven multiply a"); + break; + case 13: + trace("thirteen"); + case 14: + trace("fourteen"); + break; + case 89: + trace("eightynine"); + break; + } + } + + public function testTernarOperator() + { + var a = 5; + var b = 4; + var c = 4; + var d = 78; + var e = (a == b) ? ((c == d) ? 1 : 7) : 3; + trace("e=" + e); + } + + public function testInnerIf() + { + var a = 5; + var b = 4; + if (a == 5) + { + if (b == 6) + { + trace("b==6"); + } + else + { + trace("b!=6"); + } + } + else + { + if (b == 7) + { + trace("b==7"); + } + else + { + trace("b!=7"); + } + } + trace("end"); + } + + public function testVector() + { + var v:Vector. = new Vector.(); + v.push("hello"); + v[0] = "hi"; + v[5 * 8 - 39] = "hi2"; + trace(v[0]); + } + + public function testProperty() + { + var d = new TestClass1(); + var k = 7 + 8; + if (k == 15) + { + d.method(d.attrib * 5); + } + } + + public function testRest(firstp:int, ... restval):int + { + trace("firstRest:" + restval[0]); + return firstp; + } + + public function testParamNames(firstp:int, secondp:int, thirdp:int):int + { + return firstp + secondp + thirdp; + } + + public function testForEach() + { + var list:Array; + list = new Array(); + list[0] = "first"; + list[1] = "second"; + list[2] = "third"; + for each (var item in list) + { + trace("item #" + item); + } + } + + public function testForEachObjectArray() + { + var list:Array; + list = new Array(); + list[0] = "first"; + list[1] = "second"; + list[2] = "third"; + var test:Array; + test = new Array(); + test[0] = 0; + for each (test[0]in list) + { + trace("item #" + test[0]); + } + } + + public function testForEachObjectAttribute() + { + var list:Array; + list = new Array(); + list[0] = "first"; + list[1] = "second"; + list[2] = "third"; + for each (testPriv in list) + { + trace("item #" + testPriv); + } + } + + public function testParamsCount(firstp:int, secondp:int, thirdp:int):int + { + return firstp; + } + + public function testInlineFunctions() + { + var first:String = "value1"; + var traceParameter:Function = function(aParam:String):String + { + var second:String = "value2"; + second = second + "cc"; + var traceParam2:Function = function(bParam:String):String + { + trace(bParam + "," + aParam); + return first + second + aParam + bParam; + } + trace(second); + traceParam2(aParam); + return first; + }; + traceParameter("hello"); + } + + public function testMissingDefault() + { + var jj:int = 1; + switch (jj) + { + case 1: + jj = 1; + break; + case 2: + jj = 2; + break; + default: + jj = 3; + } + } + + private function traceIt(s:String) + { + trace(s); + } + + private static var counter:int; + + private function getCounter():int + { + counter++; + return counter; + } + + public function testChainedAssignments() + { + var a:int; + var b:int; + var c:int; + var d:int; + d = c = b = a = 5; + var e:TestClass2 = TestClass2.createMe("test"); + e.attrib1 = e.attrib2 = e.attrib3 = getCounter(); + traceIt(e.toString()); + } + + private function testFinallyZeroJump(param1:String):String + { + var str:String = param1; + try + { + return str; + } + catch (e:Error) + { + trace("error is :" + e.message); + } + finally + { + trace("hi "); + if (5 == 4) + { + return str; + } + else + { + return "hu" + str; + } + } + } + + public function testInnerFunctions(a:String) + { + var k:int = 5; + if (k == 6) + { + var s:int = 8; + } + function innerFunc(b:String) + { + trace(b); + } + innerFunc(a); + } + + public function testDeclarations() + { + var vall:*; + var vstr:String; + var vint:int; + var vuint:uint; + var vclass:TestClass1; + var vnumber:Number; + var vobject:Object; + + vall = 6; + vstr = "hello"; + vuint = 7; + vint = -4; + vclass = new TestClass1(); + vnumber = 0.5; + vnumber = 6; + vobject = vclass; + } + + public function testForIn() + { + var dic:Dictionary; + var item:Object; + for (item in dic) + { + trace(item); + } + for each (item in dic) + { + trace(item); + } + } + + myInternal function namespacedFunc() + { + trace("hello"); + } + + function unnamespacedFunc() + { + trace("hello2"); + } + + function getNamespace():Namespace + { + return null; //myInternal; + } + + function getName():String + { + return "unnamespacedFunc"; + } + + function testNames() + { + var ns = getNamespace(); + var name = getName(); + //var a=ns::unnamespacedFunc(); + //var b=ns::[name]; + //trace(b.c); + } + + function testComplexExpressions() + { + var i:int; + var j:int; + j = (i = i + (i += i++)); + } + + function testExpressions() + { + var i:int = 5; + var j:int = 5; + var arr:Array; + + if ((i = i /= 2) == 1 || i == 2) + { + arguments.concat(i); + } + else if (i == 0) + { + i = j++; + } + else + { + arr[0](); + } + + return i == 0; + } + + public function testArguments(a:int):String + { + return arguments[0]; + } + + public function println(str:String):void + { + trace(arguments.callee == this.println); + trace(arguments.length); + trace(arguments[0]); + trace(str); + } + + public function testLogicalComputing() + { + var i = 5; + var j = 7; + if (i > j) + { + j = 9; + var b:Boolean = true; + } + b = (i == 0 || i == 1) && j == 0; + } + + private function getInt():int + { + return counter++; + } + + public function testInc2() + { + var a = [1]; + a[getInt()]++; + var d = a[getInt()]++; + + var e = ++a[getInt()]; + var b = 1; + b++; + var c = 1; + b = c++; + } + + protected function testDecl2() + { + var i:int = 5; + i += 7; + if (i == 5) + { + if (i < 8) + { + var k:int = 6; + } + } + k = 7; + } + + public function testChain2() + { + var g:Array; + var h:Boolean; + var r:int = 7; + var t:int = 0; + t = this.getInt(); + var extraLine:Boolean; + if (t + 1 < g.length) + { + t++; + h = true; + } + if (t >= 0) + { + trace("ch"); + } + + } + + public function textXML() + { + var name = "ahoj"; + var myXML:XML = + + + {name} + + ; + + var k = myXML.@id; + var all = myXML.@*.toXMLString(); + k = myXML.book; + k = myXML.book.(@isbn = "12345"); + + var g:XML = new XML(""); + } + + public function testDoWhile2():int + { + var k:int = 5; + do + { + k++; + if (k == 7) + { + k = 5 * k; + } + else + { + k = 5 - k; + } + k-- + } while (k < 9); + return 2; + } + + public function testWhileAnd() + { + var a:int = 5; + var b:int = 10; + while ((a < 10) && (b > 1)) + { + a++; + b--; + } + a = 7; + b = 9; + } + + public function testNamedAnonFunctions() + { + var test=new function testFunc(param1:*, param2:int, param3:Array):Boolean + { + return (param1 as TestClass2).attrib1==5; + } + } + + public function testStringConcat() + { + var k:int = 8; + traceIt("hello"+5*6); + traceIt("hello"+(k-1)); + traceIt("hello"+5+6); + } } - - public function testIncDec() { - var a=5; - var b=0; - trace("++var"); - b=++a; - trace("var++"); - b=a++; - trace("--var"); - b=--a; - trace("var--"); - b=a--; - var c=[1,2,3,4,5]; - trace("++arr"); - b=++c[2]; - trace("arr++"); - b=c[2]++; - trace("--arr"); - b=--c[2]; - trace("arr--"); - b=c[2]--; - - var d=new TestClass1(); - trace("++property"); - trace(++d.attrib); - trace("property++"); - trace(d.attrib++); - trace("--property"); - trace(--d.attrib); - trace("property--"); - trace(d.attrib--); - return; - } - public function testDoWhile() { - var a=8; - do - { - trace("a="+a); - a++; - } - while(a<20); - return; - } - public function testInnerTry(){ - try - { - try - { - trace("try body 1"); - } - catch(e:DefinitionError) - { - trace("catched DefinitionError"); - } - trace("after try 1"); - } - catch(e:Error) - { - trace("catched Error"); - } - finally - { - trace("finally block"); - } - } - public function testWhileContinue() { - var a=5; - while(true) - { - if(a==9) - { - if(a==8) - { - continue; - } - if(a==9) - { - break; - } - trace("hello 1"); - } - trace("hello2"); - } - return; - } - public function testPrecedence() { - var a=0; - a=(5+6)*7; - a=5*(2+3); - a=5+6*7; - a=5*2+2; - trace("a="+a); - return; - } - public function testStrings() { - trace("hello"); - trace("quotes:\"hello!\""); - trace("backslash: \\ "); - trace("single quotes: \'hello!\'"); - trace("new line \r\n hello!"); - } - public function testContinueLevels() { - var a=5; - loop123: - switch(a) - { - case 57*a: - trace("fiftyseven multiply a"); - var b=0; - while(b<50) - { - if(b==10) - { - break; - } - if(b==15) - { - break loop123; - } - b=b+1; - } - break; - case 13: - trace("thirteen"); - case 14: - trace("fourteen"); - break; - case 89: - trace("eightynine"); - break; - default: - trace("default clause"); - } - - loop182: - for(var c=0;c<8;c=c+1) - { - - loop165: - for(var d=0;d<25;d++) - { - - for(var e=0;e<50;e++) - { - if(e==9) - { - break loop165; - } - if(e==20) - { - continue loop182; - } - if(e==8) - { - break; - } - break loop182; - } - } - trace("hello"); - } - } - public function testSwitchDefault(){ - var a=5; - switch(a) - { - case 57*a: - trace("fiftyseven multiply a"); - break; - case 13: - trace("thirteen"); - case 14: - trace("fourteen"); - break; - case 89: - trace("eightynine"); - break; - default: - trace("default clause"); - } - } - public function testMultipleCondition(){ - var a=5; - var b=8; - var c=9; - if((a<=4||b<=8)&&c==7) - { - trace("onTrue"); - } - else - { - trace("onFalse"); - } - } - public function testForBreak(){ - for(var a=0;a<10;a++) - { - if(a==5) - { - break; - } - trace("hello:"+a); - } - } - - public function testIf(){ - var a=5; - if(a==7) - { - trace("onTrue"); - } - } - - public function testIfElse(){ - var a=5; - if(a==7) - { - trace("onTrue"); - } - else - { - trace("onFalse"); - } - } - public function testFor() { - for(var a=0;a<10;a++) - { - trace("a="+a); - } - } - public function testForContinue() { - for(var a=0;a<10;a=a+1) - { - if(a==9) - { - if(a==5) - { - trace("part1"); - continue; - } - trace("a="+a); - if(a==7) - { - trace("part2"); - continue; - } - trace("part3"); - } - else - { - trace("part4"); - } - trace("part5"); - } - } - public function testTry() { - var i:int; - i=7; - try - { - trace("try body"); - } - catch(e:DefinitionError) - { - trace("catched DefinitionError"); - } - catch(e:Error) - { - trace("Error message:"+e.message); - trace("Stacktrace:"+e.getStackTrace()); - } - finally - { - trace("Finally part"); - } - } - public function testSwitch(){ - var a=5; - switch(a) - { - case 57*a: - trace("fiftyseven multiply a"); - break; - case 13: - trace("thirteen"); - case 14: - trace("fourteen"); - break; - case 89: - trace("eightynine"); - break; - } - } - public function testTernarOperator(){ - var a=5; - var b=4; - var c=4; - var d=78; - var e=(a==b) - ?((c==d)?1 - :7 - ): - 3; - trace("e="+e); - } - - public function testInnerIf(){ - var a=5; - var b=4; - if(a==5){ - if(b==6){ - trace("b==6"); - }else{ - trace("b!=6"); - } - }else{ - if(b==7){ - trace("b==7"); - }else{ - trace("b!=7"); - } - } - trace("end"); - } - - public function testVector(){ - var v:Vector. = new Vector.(); - v.push("hello"); - v[0]="hi"; - v[5*8-39]="hi2"; - trace(v[0]); - - vec.push("atributte hello"); - vec[2*6-11]="atributte hi"; - } - - public function testProperty(){ - var d=new TestClass1(); - var k=7+8; - if(k==15) - { - d.metoda(d.attrib*5); - } - } - - public function testRest(firstp:int,...restval):int{ - trace("firstRest:"+restval[0]); - return firstp; - } - - public function testParamNames(firstp:int,secondp:int,thirdp:int):int{ - return firstp+secondp+thirdp; - } - - public function testForEach(){ - var list:Array; - list=new Array(); - list[0]="first"; - list[1]="second"; - list[2]="third"; - for each(var item in list){ - trace("item #"+item); - } - } - - public function testForEachObjectArray(){ - var list:Array; - list=new Array(); - list[0]="first"; - list[1]="second"; - list[2]="third"; - var test:Array; - test=new Array(); - test[0]=0; - for each(test[0] in list){ - trace("item #"+test[0]); - } - } - - public function testForEachObjectAttribute(){ - var list:Array; - list=new Array(); - list[0]="first"; - list[1]="second"; - list[2]="third"; - for each(testPriv in list){ - trace("item #"+testPriv); - } - } - - public function testParamsCount(firstp:int,secondp:int,thirdp:int):int - { - return firstp; - } - - - public function testCalcStackSize() { - var a=[1]; - var b=[2]; - a[0]++; - b[0]++; - //b=c[2]++; - /*trace("--arr"); - b=--c[2]; - trace("arr--"); - b=c[2]--;*/ - - return; - } - - } } \ No newline at end of file diff --git a/trunk/testdata/as3/classes/TestClass1.as b/trunk/testdata/as3/classes/TestClass1.as index 18e5379a6..870ea7c4f 100644 --- a/trunk/testdata/as3/classes/TestClass1.as +++ b/trunk/testdata/as3/classes/TestClass1.as @@ -1,14 +1,19 @@ -package classes{ - public dynamic class TestClass1{ - public var attrib:int=5; - - public function testHello(){ +package classes +{ + + public dynamic class TestClass1 + { + public var attrib:int = 5; + public var sons:Array; + + public function testHello() + { trace("hello2"); } - public function metoda(i:int):int + public function method(i:int):int { - trace("metoda"); + trace("method"); return 7; } } diff --git a/trunk/testdata/as3/classes/TestClass2.as b/trunk/testdata/as3/classes/TestClass2.as new file mode 100644 index 000000000..f672c273a --- /dev/null +++ b/trunk/testdata/as3/classes/TestClass2.as @@ -0,0 +1,20 @@ +package classes +{ + + public dynamic class TestClass2 + { + public var attrib1:int; + public var attrib2:int; + public var attrib3:int; + + public function TestClass2(a1:String) + { + trace("Class2 construct"); + } + + public static function createMe(a1:String):TestClass2 + { + return new TestClass2(a1); + } + } +} \ No newline at end of file diff --git a/trunk/testdata/as3/classes/TestClass3.as b/trunk/testdata/as3/classes/TestClass3.as new file mode 100644 index 000000000..cc06b6f30 --- /dev/null +++ b/trunk/testdata/as3/classes/TestClass3.as @@ -0,0 +1,8 @@ +package classes +{ + + public class TestClass3 + { + + } +} diff --git a/trunk/testdata/as3/classes/myInternal.as b/trunk/testdata/as3/classes/myInternal.as new file mode 100644 index 000000000..65ab4e45f --- /dev/null +++ b/trunk/testdata/as3/classes/myInternal.as @@ -0,0 +1,4 @@ +package classes { + public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples"; +} + \ No newline at end of file