This is an automated email from the ASF dual-hosted git repository. gregdove pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit e52954b22a4599c75ba242955273627867e00e4d Author: greg-dove <[email protected]> AuthorDate: Sun Sep 29 15:16:21 2019 +1300 RoyaleArrayLike support (IArrayList and BinaryData) --- frameworks/projects/Collections/pom.xml | 14 ++ .../src/main/config/compile-swf-config.xml | 1 + .../src/main/royale/CollectionsClasses.as | 2 + .../org/apache/royale/collections/ArrayList.as | 2 +- .../org/apache/royale/collections/IArrayList.as | 13 +- frameworks/projects/Core/pom.xml | 19 +- .../Core/src/main/config/compile-swf-config.xml | 6 +- .../projects/Core/src/main/royale/CoreClasses.as | 3 + .../royale/org/apache/royale/utils/BinaryData.as | 11 +- .../Language/src/main/royale/LanguageClasses.as | 2 +- .../apache/royale/language/iterator/arrayLike.as | 73 +++++++ .../main/royale/flexUnitTests/LanguageTester.as | 8 +- .../language/LanguageTesterTestArraylikeGetSet.as | 227 +++++++++++++++++++++ .../language/LanguageTesterTestForEach.as | 205 +++++++++++++++++++ .../language/support/checkArrayLikeFunc.as | 30 +-- 15 files changed, 587 insertions(+), 29 deletions(-) diff --git a/frameworks/projects/Collections/pom.xml b/frameworks/projects/Collections/pom.xml index a105423..59cb218 100644 --- a/frameworks/projects/Collections/pom.xml +++ b/frameworks/projects/Collections/pom.xml @@ -60,6 +60,20 @@ <dependencies> <dependency> <groupId>org.apache.royale.framework</groupId> + <artifactId>Language</artifactId> + <version>0.9.6-SNAPSHOT</version> + <type>swc</type> + <classifier>swf</classifier> + </dependency> + <dependency> + <groupId>org.apache.royale.framework</groupId> + <artifactId>Language</artifactId> + <version>0.9.6-SNAPSHOT</version> + <type>swc</type> + <classifier>js</classifier> + </dependency> + <dependency> + <groupId>org.apache.royale.framework</groupId> <artifactId>Core</artifactId> <version>0.9.6-SNAPSHOT</version> <type>swc</type> diff --git a/frameworks/projects/Collections/src/main/config/compile-swf-config.xml b/frameworks/projects/Collections/src/main/config/compile-swf-config.xml index 6116aec..1c00110 100644 --- a/frameworks/projects/Collections/src/main/config/compile-swf-config.xml +++ b/frameworks/projects/Collections/src/main/config/compile-swf-config.xml @@ -31,6 +31,7 @@ <external-library-path> <path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element> <path-element>../../../../../libs/Core.swc</path-element> + <path-element>../../../../../libs/Language.swc</path-element> </external-library-path> <mxml> diff --git a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as index fe946df..ecc1033 100644 --- a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as +++ b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as @@ -43,6 +43,8 @@ internal class CollectionsClasses import org.apache.royale.collections.SortField; SortField; import org.apache.royale.collections.SortFieldCompareTypes; SortFieldCompareTypes; import org.apache.royale.collections.CompareUtils; CompareUtils; + + import org.apache.royale.language.iterator.arrayLike;arrayLike; } diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as index 38164aa..75ea856 100644 --- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as +++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as @@ -34,7 +34,6 @@ package org.apache.royale.collections import flash.utils.IDataInput; import flash.utils.IDataOutput; } - //-------------------------------------- // Events @@ -90,6 +89,7 @@ package org.apache.royale.collections * @productversion Royale 0.0 */ [Event(name="itemUpdated", type="org.apache.royale.events.CollectionEvent")] + /** * The ArrayList class provides an event-driven wrapper for the diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as index 32638b0..454d27f 100644 --- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as +++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as @@ -27,8 +27,17 @@ package org.apache.royale.collections import org.apache.royale.collections.converters.IItemConverter; //-------------------------------------- - - + + /** + * Support for Arraylike access (typed index access via []) and also via iteration when used with for-each loops. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.0 + */ + [RoyaleArrayLike(getValue="getItemAt",setValue="setItemAt",setterArgSequence="value,index",length="length",lengthAccess="getter")] + /** * The ArrayList class provides an event-driven wrapper for the * standard Array. Events are dispatched when items are added, removed, diff --git a/frameworks/projects/Core/pom.xml b/frameworks/projects/Core/pom.xml index 947ce17..49b3b6f 100644 --- a/frameworks/projects/Core/pom.xml +++ b/frameworks/projects/Core/pom.xml @@ -68,5 +68,22 @@ </plugin> </plugins> </build> - + <dependencies> + <!-- Language is included to permit a concrete reference + to the arrayLike iterator to be re-exported, so that it is always available --> + <dependency> + <groupId>org.apache.royale.framework</groupId> + <artifactId>Language</artifactId> + <version>0.9.6-SNAPSHOT</version> + <type>swc</type> + <classifier>swf</classifier> + </dependency> + <dependency> + <groupId>org.apache.royale.framework</groupId> + <artifactId>Language</artifactId> + <version>0.9.6-SNAPSHOT</version> + <type>swc</type> + <classifier>js</classifier> + </dependency> + </dependencies> </project> diff --git a/frameworks/projects/Core/src/main/config/compile-swf-config.xml b/frameworks/projects/Core/src/main/config/compile-swf-config.xml index 265d4d8..4d0d2a7 100644 --- a/frameworks/projects/Core/src/main/config/compile-swf-config.xml +++ b/frameworks/projects/Core/src/main/config/compile-swf-config.xml @@ -31,7 +31,11 @@ <external-library-path> <path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element> </external-library-path> - + + <library-path> + <path-element>../../../../../libs/Language.swc</path-element> + </library-path> + <allow-subclass-overrides>true</allow-subclass-overrides> <mxml> diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as b/frameworks/projects/Core/src/main/royale/CoreClasses.as index 4e258c7..6d03a3b 100644 --- a/frameworks/projects/Core/src/main/royale/CoreClasses.as +++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as @@ -324,6 +324,9 @@ internal class CoreClasses import org.apache.royale.core.TextLineMetrics; TextLineMetrics; import org.apache.royale.utils.ClassSelectorList; ClassSelectorList; + + //explicit support for RoyaleArrayLike for each iteration (BinaryData) + import org.apache.royale.language.iterator.arrayLike;arrayLike; } } diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as index 2143d31..483bfb1 100644 --- a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as +++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as @@ -27,7 +27,16 @@ COMPILE::JS { import goog.DEBUG; } - + +/** + * Support for Arraylike access (typed index access via []) and also iteration when used with for-each loops. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.0 + */ +[RoyaleArrayLike(getValue="readByteAt",setValue="writeByteAt",setterArgSequence="index,value",length="length",lengthAccess="getter")] /** * The BinaryData class is a class that represents binary data. The way diff --git a/frameworks/projects/Language/src/main/royale/LanguageClasses.as b/frameworks/projects/Language/src/main/royale/LanguageClasses.as index 2d4388e..f0e5ed3 100644 --- a/frameworks/projects/Language/src/main/royale/LanguageClasses.as +++ b/frameworks/projects/Language/src/main/royale/LanguageClasses.as @@ -31,10 +31,10 @@ internal class LanguageClasses import org.apache.royale.utils.Language; Language; import QName; QName; import Namespace; Namespace; - } import org.apache.royale.language.string.match; match; import org.apache.royale.language.string.search; search; + import org.apache.royale.language.iterator.arrayLike; arrayLike; } } diff --git a/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as new file mode 100644 index 0000000..38b1c65 --- /dev/null +++ b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as @@ -0,0 +1,73 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.royale.language.iterator +{ + /** + * Used by the compiler for classes with [RoyaleArrayLike] metadata when processing for each loops + * @param forInstance the instance to be checked + * @param lengthCheck either a string that represents a property to return length value, or a function method reference, e.g. instance.length() + * @param getAt the String name of the accessor for the item at index... e.g. 'getItemAt'. If null it will default to Array Access [] + * @param lengthIsMethodCall true if the length accessor is an explicit method call instead of a getter + * @return a lightweight iterator Object with hasNext() and next() methods + * + * @royalesuppressexport + */ + public function arrayLike(forInstance:Object, lengthCheck:String, getAt:String, lengthIsMethodCall:Boolean):Object{ + if (forInstance) { + var i:int = 0; + var ret:Object = { }; + if (lengthIsMethodCall) { + ret['hasNext'] = function():Boolean{ + return i < forInstance[lengthCheck](); + } + } else { + ret['hasNext'] = function():Boolean{ + return i < forInstance[lengthCheck] + } + } + if (getAt != null){ + ret['next'] = function():*{ + return forInstance[getAt](i++); + } + } else { + ret['next'] = function():*{ + return forInstance[i++]; + } + } + } else { + //no need to create a new instance: + ret = NULL_ITERABLE; + } + return ret; + } +} +/** + * @royalesuppressexport + */ +const NULL_ITERABLE:* = { + 'hasNext':function():Boolean{ + return false; + }, + 'next':function():*{ + //this should never be called in compiler-generated code in any case + throw new TypeError('Cannot iterate over a null object reference'); + } +}; + + diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as index 441932b..52337ba 100644 --- a/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as @@ -30,7 +30,7 @@ package flexUnitTests public function LanguageTester() { // see notes in CoreTester - var arr:Array = [LanguageTesterTestIs, LanguageTesterIntUint, LanguageTesterTestVector,LanguageTesterTestClass]; + // var arr:Array = [LanguageTesterTestIs, LanguageTesterIntUint, LanguageTesterTestVector,LanguageTesterTestClass]; } public var languageTestIs:LanguageTesterTestIs; @@ -40,5 +40,11 @@ package flexUnitTests public var languageTestVector:LanguageTesterTestVector; public var languageTestClass:LanguageTesterTestClass; + + public var languageTestForeach:LanguageTesterTestForEach; + + public var languageTestgetSet:LanguageTesterTestArraylikeGetSet + + } } diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as new file mode 100644 index 0000000..8ff14fe --- /dev/null +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as @@ -0,0 +1,227 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package flexUnitTests.language +{ + + + import org.apache.royale.test.asserts.*; + + import flexUnitTests.language.support.*; + import org.apache.royale.collections.ArrayList; + import org.apache.royale.collections.ArrayListView; + import org.apache.royale.collections.IArrayList; + import org.apache.royale.utils.BinaryData; + import testshim.RoyaleUnitTestRunner; + + /** + * @royalesuppresspublicvarwarning + */ + public class LanguageTesterTestArraylikeGetSet + { + + public static var isJS:Boolean = COMPILE::JS; + + [BeforeClass] + public static function setUpBeforeClass():void + { + + } + + [AfterClass] + public static function tearDownAfterClass():void + { + } + + [Before] + public function setUp():void + { + arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']); + } + + [After] + public function tearDown():void + { + } + + + /*public function LanguageTesterTestArraylikeGetSet(){ + + }*/ + + public var arrayList:ArrayList; + + /* [Test] + public function testImpl():void + { + var other:ArrayList = new ArrayList([1,2,3]); + var local:ArrayList = new ArrayList(['gerbil','something else']); + arrayList[0] = local[0]; + assertEquals(arrayList.getItemAt(0),'gerbil', 'unexpected get/set result') + //RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); + arrayList.setItemAt('manually assigned gerbil',0); + RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); + if (arrayList[0] == 'manually assigned gerbil') { + arrayList[0] = local[1]; + } + assertEquals(arrayList.getItemAt(0),'something else', 'unexpected get/set result'); + var collect:Array = []; + for(var i:int =0; i<other[2];i++) { // 'getItemAt' used in here + collect.push(other[i]); //'getItemAt' + } + assertEquals(collect.toString(),'1,2,3', 'unexpected loop result'); + + if (arrayList[0] == 'not the value') { + arrayList[0] = 'bad assignment'; + } else { + arrayList[0] = 'correct assignment'; + } + assertEquals(arrayList.getItemAt(0),'correct assignment', 'unexpected assignment result in else block'); + RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); + + try{ + arrayList[0] = "inside try"; + } catch (e:Error) + { + //no error + } finally{ + arrayList[1] = "inside finally"; + } + assertEquals(arrayList.getItemAt(0),'inside try', 'unexpected try/catch/finally result'); + assertEquals(arrayList.getItemAt(1),'inside finally', 'unexpected try/catch/finally result'); + + } + + [Test] + public function testSubClass():void{ + //test 'inheritance' via class (ArrayListView in this case) + arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']); + var other:ArrayList = new ArrayList([1,2,3]); + var local:ArrayList = new ArrayList(['gerbil','something else']); + + var alv:ArrayListView = new ArrayListView(arrayList); + var alv1:ArrayListView = new ArrayListView(other); + var alv2:ArrayListView = new ArrayListView(local); + alv[0] = alv2[0]; + assertEquals(alv.getItemAt(0),'gerbil', 'unexpected get/set result'); + //RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); + alv.setItemAt('manually assigned gerbil',0); + RoyaleUnitTestRunner.consoleOut(alv.source.toString()); + if (alv[0] == 'manually assigned gerbil') { + alv[0] = alv2[1]; + } + assertEquals(alv.getItemAt(0),'something else', 'unexpected get/set result'); + var collect:Array = []; + for(var i:int =0; i<alv1[2];i++) { // 'getItemAt' used in here + collect.push(alv1[i]); //'getItemAt' + } + assertEquals(collect.toString(),'1,2,3', 'unexpected loop result'); + + if (alv[0] == 'not the value') { + alv[0] = 'bad assignment'; + } else { + alv[0] = 'correct assignment'; + } + assertEquals(alv.getItemAt(0),'correct assignment', 'unexpected assignment result in else block'); + RoyaleUnitTestRunner.consoleOut(alv.source.toString()); + + try{ + alv[0] = "inside try"; + } catch (e:Error) + { + //no error + } finally{ + alv[1] = "inside finally"; + } + assertEquals(alv.getItemAt(0),'inside try', 'unexpected try/catch/finally result'); + assertEquals(alv.getItemAt(1),'inside finally', 'unexpected try/catch/finally result'); + } + */ + + [Test] + public function testNested():void + { + arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']); + + var f:Function = function something():String{ + arrayList[1] = 'another dog'; + return arrayList[1] as String; + }; + + var f2:Function = function():String{ + arrayList[1] = 'yet another dog'; + return arrayList[1] as String; + }; + + var check:String = f(); + assertEquals(check,'another dog', 'unexpected get/set result'); + + assertEquals(arrayList.getItemAt(1),'another dog', 'unexpected get/set result'); + + check = f2(); + assertEquals(check,'yet another dog', 'unexpected get/set result'); + + assertEquals(arrayList.getItemAt(1),'yet another dog', 'unexpected get/set result'); + + } + + private function localReturn(val:ArrayList):String{ + val[0] = 'get and set from localMethod'; + return val[0] as String; + } + + [Test] + public function testLocalMethodReturn():void{ + arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']); + + var check:String = localReturn(arrayList); + assertEquals(check,'get and set from localMethod', 'unexpected get/set result'); + assertEquals(arrayList.getItemAt(0),'get and set from localMethod', 'unexpected get/set result'); + } + + + [Test] + public function testExternalFunc():void{ + arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']); + + var check:String = checkArrayLikeFunc(arrayList); + assertEquals(check,'get and set from checkArrayLikeFunc', 'unexpected get/set result'); + assertEquals(arrayList.getItemAt(0),'get and set from checkArrayLikeFunc', 'unexpected get/set result'); + } + + + public function testBinaryData():void{ + var bd:BinaryData = new BinaryData(); + bd.length = 100; + var checkVal:uint = 0; + for (var i:uint=0;i<100;i++) { + checkVal += i; + bd[i] = i; + } + var summationCheck:uint=0; + for each(var byte:uint in bd) { + summationCheck += byte; + } + assertEquals(bd[99], 99, 'unexpected value at index'); + assertEquals(summationCheck, checkVal, 'unexpected check on result') + } + + + + } +} diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as new file mode 100644 index 0000000..2a2c2e2 --- /dev/null +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as @@ -0,0 +1,205 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package flexUnitTests.language +{ + + + import org.apache.royale.test.asserts.*; + + import flexUnitTests.language.support.*; + import org.apache.royale.collections.ArrayList; + import org.apache.royale.collections.IArrayList; + + import testshim.RoyaleUnitTestRunner; + + /** + * @royalesuppresspublicvarwarning + */ + public class LanguageTesterTestForEach + { + /*import org.apache.royale.language.iterator.arrayLike;*/ + + public static var isJS:Boolean = COMPILE::JS; + + [BeforeClass] + public static function setUpBeforeClass():void + { + + } + + [AfterClass] + public static function tearDownAfterClass():void + { + } + + [Before] + public function setUp():void + { + _myList = new ArrayList(['dog', 'cat','mouse','gerbil']) + } + + [After] + public function tearDown():void + { + } + private var _animal:String; + private var _char:String; + private var _myList:ArrayList + + + [Test] + public function testNested1():void + { + var arrayList:ArrayList = new ArrayList(['dog', 'cat','mouse','gerbil']); + + var foundItems:Array = []; + var charItems:Array = []; + for each(var animal:String in arrayList) { + foundItems.push(animal); + var deepList:ArrayList = new ArrayList(animal.split('')); + for each(var char:String in deepList) { + // RoyaleUnitTestRunner.consoleOut(char); + charItems.push(char); + } + } + // RoyaleUnitTestRunner.consoleOut(value + ''); + assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 'unexpected for each result'); + //check nested loop content + assertEquals(charItems.toString(), 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); + } + + + + [Test] + public function testNested1a():void + { + var array:Array=['dog', 'cat','mouse','gerbil']; + + var foundItems:Array = []; + var charItems:Array = []; + for each(_animal in array) { + foundItems.push(_animal); + var deepList:Array = _animal.split(''); + for each(_char in deepList) { + // RoyaleUnitTestRunner.consoleOut(char); + charItems.push(_char); + } + } + // RoyaleUnitTestRunner.consoleOut(value + ''); + assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 'unexpected for each result'); + //check nested loop content + assertEquals(charItems.toString(), 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); + } + + [Test] + public function testNested1b():void + { + //using a target referenced externally + var foundItems:Array = []; + var charItems:Array = []; + for each(_animal in _myList) { + foundItems.push(_animal); + var deepList:ArrayList = new ArrayList(_animal.split('')); + for each(_char in deepList) { + // RoyaleUnitTestRunner.consoleOut(char); + charItems.push(_char); + } + } + // RoyaleUnitTestRunner.consoleOut(value + ''); + assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 'unexpected for each result'); + //check nested loop content + assertEquals(charItems.toString(), 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); + } + + + [Test] + public function testNested2():void + { + var arrayList:ArrayList = new ArrayList(['dog', 'cat','mouse','gerbil']); + + var foundItems:Array = []; + var charItems:Array = []; + for each(_animal in arrayList) { + foundItems.push(_animal); + var deepList:ArrayList = new ArrayList(_animal.split('')); + for each(_char in deepList) { + // RoyaleUnitTestRunner.consoleOut(char); + charItems.push(_char); + } + } + // RoyaleUnitTestRunner.consoleOut(value + ''); + assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 'unexpected for each result'); + //check nested loop content + assertEquals(charItems.toString(), 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); + } + + + [Test] + public function testNested3():void + { + var arrayList:IArrayList = new ArrayList(['dog', 'cat','mouse','gerbil']); + + var foundItems:Array = []; + var charItems:Array = []; + for each(_animal in arrayList) { + foundItems.push(_animal); + var deepList:IArrayList = new ArrayList(_animal.split('')); + for each(_char in deepList) { + // RoyaleUnitTestRunner.consoleOut(char); + charItems.push(_char); + } + } + // RoyaleUnitTestRunner.consoleOut(value + ''); + assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 'unexpected for each result'); + //check nested loop content + assertEquals(charItems.toString(), 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); + } + + + [Test] + public function testXML():void{ + var xm:XML = <test><child><child/></child></test>; + RoyaleUnitTestRunner.consoleOut('xml' ); + for each(var xml:XML in xm..child) { + RoyaleUnitTestRunner.consoleOut(xml.toXMLString() ); + } + RoyaleUnitTestRunner.consoleOut('thing' ); + for each(var thing:XML in xm) { + RoyaleUnitTestRunner.consoleOut(thing.toXMLString() ); + } + assertTrue(true) + } + + + [Test] + public function tesTargetMutation():void{ + var arrayList:ArrayList = new ArrayList(['dog', 'cat','mouse','gerbil']); + + var foundItems:Array = []; + var charItems:Array = []; + for each(_animal in arrayList) { + foundItems.push(_animal); + if (arrayList.length) arrayList.removeAll();//should stop iterating after first item + } + assertEquals(foundItems.toString(), 'dog', 'unexpected for each result'); + } + + + } +} diff --git a/frameworks/projects/Language/src/main/royale/LanguageClasses.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as similarity index 66% copy from frameworks/projects/Language/src/main/royale/LanguageClasses.as copy to manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as index 2d4388e..11ae093 100644 --- a/frameworks/projects/Language/src/main/royale/LanguageClasses.as +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as @@ -16,26 +16,14 @@ // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// -package { - -/** - * @private - * This class is used to link additional classes into Language.swc - * beyond those that are found by dependency analysis starting - * from the classes specified in manifest.xml. - */ -internal class LanguageClasses +package flexUnitTests.language.support { - COMPILE::JS - { - import org.apache.royale.utils.Language; Language; - import QName; QName; - import Namespace; Namespace; - - } - import org.apache.royale.language.string.match; match; - import org.apache.royale.language.string.search; search; + import org.apache.royale.collections.ArrayList; + + public function checkArrayLikeFunc(val:ArrayList):String + { + val[0] = 'get and set from checkArrayLikeFunc'; + return val[0] as String; + // return val.getItemAt(0) as String; + } } - -} -
