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


The following commit(s) were added to refs/heads/develop by this push:
     new 9b7d888  Various fixes and improvements to XML/XMLList, with 
additional tests added (requires latest compiler update)
9b7d888 is described below

commit 9b7d888d0c22f8261d68cdf32319c0487ea04150
Author: greg-dove <[email protected]>
AuthorDate: Wed Jan 19 11:49:30 2022 +1300

    Various fixes and improvements to XML/XMLList, with additional tests added 
(requires latest compiler update)
---
 frameworks/projects/XML/src/main/royale/XML.as     | 108 +++++++++++----------
 frameworks/projects/XML/src/main/royale/XMLList.as |  79 ++++++++++-----
 .../flexUnitTests/xml/XMLListTesterGeneralTest.as  |  81 ++++++++++++++++
 .../flexUnitTests/xml/XMLTesterGeneralTest.as      |  36 ++++++-
 4 files changed, 224 insertions(+), 80 deletions(-)

diff --git a/frameworks/projects/XML/src/main/royale/XML.as 
b/frameworks/projects/XML/src/main/royale/XML.as
index 6586ebf..dc636bf 100644
--- a/frameworks/projects/XML/src/main/royale/XML.as
+++ b/frameworks/projects/XML/src/main/royale/XML.as
@@ -1232,7 +1232,15 @@ package
                        list.targetObject = this;
                        return list;
                }
-               
+
+               /**
+                *
+                * @param list
+                * @return an XMLList representing the concatenation of this 
XML instance and either another XML instance or an XMLList
+                *
+                * @royaleignorecoercion XMLList
+                * @royaleignorecoercion XML
+                */
                public function concat(list:*):XMLList
                {
                        if(list is XML)
@@ -1247,7 +1255,8 @@ package
                        var retVal:XMLList = new XMLList();
                        retVal.append(this);
                        var item:XML;
-                       for each(item in list)
+
+                       for each(item in (list as XMLList))
                                retVal.append(item);
                        
                        return retVal;
@@ -1416,6 +1425,12 @@ package
                {
                        return [0];
                }
+
+               /**
+                *
+                * @private
+                * @royaleignorecoercion XML
+                */
                public function equals(xml:*):Boolean
                {
                        /*
@@ -1442,27 +1457,27 @@ package
                        
                        if(!(xml is XML))
                                return false;
-                       
-                       if(xml.getNodeRef() != getNodeRef())
+                       var typedXML:XML = xml as XML;
+                       if(typedXML.getNodeRef() != getNodeRef())
                                return false;
                        
-                       if(!name().equals(xml.name()))
+                       if(!name().equals(typedXML.name()))
                                return false;
                        var selfAttrs:Array = getAttributeArray();
-                       var xmlAttrs:Array = xml.getAttributeArray();
+                       var xmlAttrs:Array = typedXML.getAttributeArray();
                        if(selfAttrs.length != xmlAttrs.length)
                                return false;
                        //length comparison should not be necessary because xml 
always has a length of 1
-                       if(getValue() != xml.getValue())
+                       if(getValue() != typedXML.getValue())
                                return false;
                        
                        for(i=0;i<selfAttrs.length;i++)
                        {
-                               if(!xml.hasAttribute(selfAttrs[i]))
+                               if(!typedXML.hasAttribute(selfAttrs[i]))
                                        return false;
                        }
                        var selfChldrn:Array = getChildrenArray();
-                       var xmlChildren:Array = xml.getChildrenArray();
+                       var xmlChildren:Array = typedXML.getChildrenArray();
                        if(selfChldrn.length != xmlChildren.length)
                                return false;
                        
@@ -2103,7 +2118,7 @@ package
                {
                        var list:XMLList = new XMLList();
                        list.append(this);
-                       return list.plus(rightHand);
+                       return list.concat(rightHand);
                }
                
                private function xmlFromStringable(value:*):XML
@@ -2129,21 +2144,26 @@ package
                        normalize();
                        return this;
                }
-               
+
+               /**
+                *
+                * @royaleignorecoercion XML
+                * @royaleignorecoercion XMLList
+                */
                private function prependChildInternal(child:*):void
                {
                        if(child is XMLList)
                        {
-                               var len:int = child.length();
+                               var len:int = (child as XMLList).length();
                                for(var i:int=0; i<len; i++)
                                {
-                                       prependChildInternal(child[0]);
+                                       prependChildInternal((child as 
XMLList)[0]);
                                }
                        }
                        else
                        {
                                assertType(child,XML,"Type must be XML");
-                               child.setParent(this);
+                               (child as XML).setParent(this);
                                getChildren().unshift(child);
                        }
                }
@@ -2240,7 +2260,7 @@ package
                        var idx:int = getIndexOf(child);
                        if(idx < 0)
                                return false;
-                       removed = _children.splice(idx,1);
+                       /*removed =*/ _children.splice(idx,1);
                        child._parent = null;
                        xml$_notify("nodeRemoved", this, child, null);
                        return true;
@@ -2255,16 +2275,16 @@ package
                {
                        var i:int;
                        var len:int;
-                       name = toXMLName(name);
+                       var qName:QName = toXMLName(name);
                        var child:XML;
                        var removedItem:Boolean = false;
-                       if(name.isAttribute)
+                       if(qName.isAttribute)
                        {
                                len = attributeLength() -1;
                                for(i=len;i>=0;i--)
                                {
                                        child = _attributes[i] as XML;
-                                       if(name.matches(child.name()))
+                                       if(qName.matches(child.name()))
                                        {
                                                child = _attributes[i];
                                                child._parent = null;
@@ -2281,11 +2301,12 @@ package
                        for(i=len;i>=0;i--)
                        {
                                child = _children[i] as XML;
-                               if(child.getNodeRef() != ELEMENT){
+                               if(child.getNodeRef() != ELEMENT && /* Not a 
wildcard removal */ qName.localName != '*'){
+                                       //skip this non-element child, unless 
we are removing via wildcard name selector
                                        continue;
                                }
                                
-                               if(name.matches(child.name()))
+                               if(qName.matches(child.name()))
                                {
                                        child = _children[i];
                                        child._parent = null;
@@ -2493,25 +2514,25 @@ package
                        {
                                if((v as XML).getNodeRef() == ELEMENT && 
(v==this || isAncestor(v)) )
                                        throw new TypeError("cannot assign 
parent xml as child");
-                               v.setParent(this);
+                               (v as XML).setParent(this);
                                if(_children[idx])
-                                       removeChild(_children[idx]);
-                               insertChildAt(v,idx);
+                                       removeChild((_children[idx] as XML));
+                               insertChildAt((v as XML),idx);
                        }
                        else if(v is XMLList)
                        {
                                len = (v as XMLList).length();
                                //6.
                                if(_children[idx])
-                                       _children[idx]._parent = null;
+                                       (_children[idx] as XML)._parent = null;
                                if (len)  {
-                                       v[0].setParent(this);
+                                       (v[0] as XML).setParent(this);
                                        _children[idx] = v[0];
                                        var listIdx:int = 1;
-                                       var chld:XML = v[0];
+                                       var chld:XML = (v[0] as XML);
                                        while(listIdx < len)
                                        {
-                                               chld = v[listIdx];
+                                               chld = v[listIdx] as XML;
                                                insertChildAt(chld,idx+listIdx);
                                                listIdx++;
                                        }
@@ -2561,15 +2582,15 @@ package
                                        var len:int = attributeLength();
                                        for(i=0;i<len;i++)
                                        {
-                                               
if(_attributes[i].name().equals(attr.name()))
+                                               if((_attributes[i]as 
XML).name().equals(attr.name()))
                                                {
                                                        var oldValue:String = 
_attributes[i].getValue();
-                                                       
_attributes[i].setValue(value);
-                                                       
xml$_notify("attributeChanged", this, attr.name().toString(), oldValue);
+                                                       (_attributes[i]as 
XML).setValue(value);
+                                                       
xml$_notify("attributeChanged", this, (attr as XML).name().toString(), 
oldValue);
                                                        return value;
                                                }
                                        }
-                                       attr.setValue(value);
+                                       (attr as XML).setValue(value);
                                        addChild(attr);
                                }
                                return value;
@@ -2595,10 +2616,10 @@ package
                                len = attributeLength();
                                for(i=0;i<len;i++)
                                {
-                                       
if(_attributes[i].name().equals(attrXML.name()))
+                                       if((_attributes[i]as 
XML).name().equals(attrXML.name()))
                                        {
-                                               var oldValueX:String = 
_attributes[i].getValue();
-                                               _attributes[i].setValue(value);
+                                               var oldValueX:String = 
(_attributes[i]as XML).getValue();
+                                               (_attributes[i]as 
XML).setValue(value);
                                                xml$_notify("attributeChanged", 
this, attrXML.name().toString(), oldValueX);
                                                return value;
                                        }
@@ -3388,24 +3409,7 @@ package
                        
                        return strArr.join("");
                }
-               
-               /**
-                * Returns the XML object.
-                *
-                * @return
-                *
-                */
-               override public function valueOf():*
-               {
-                       var str:String = this.toString();
-                       if(str == "")
-                               return str;
-                       var num:Number = Number(str);
-                       if("" + num == str){
-                               return  num;
-                       }
-                       return str;
-               }
+
                
                ////////////////////////////////////////////////////////////////
                ///
diff --git a/frameworks/projects/XML/src/main/royale/XMLList.as 
b/frameworks/projects/XML/src/main/royale/XMLList.as
index cad5577..305492c 100644
--- a/frameworks/projects/XML/src/main/royale/XMLList.as
+++ b/frameworks/projects/XML/src/main/royale/XMLList.as
@@ -50,22 +50,26 @@ package
         
         /**
          * @royaleignorecoercion String
+                * @royaleignorecoercion XMLList
+                * @royaleignorecoercion XML
          */
                private function parseExpression(expression:Object):void
                {
                        if(expression is XMLList)
                        {
-                               targetObject = expression.targetObject;
-                               targetProperty = expression.targetProperty;
+                               targetObject = (expression as 
XMLList).targetObject;
+                               targetProperty = (expression as 
XMLList).targetProperty;
 
-                               var len:int = expression.length();
+                               var len:int = (expression as XMLList).length();
                                for(var i:int=0;i<len;i++){
-                                       this[i] = expression[i];
+                                       append(expression[i] as XML);
+                                       //this[i] = expression[i];
                                }
                        }
                        else if(expression is XML)
                        {
-                               this[0] = expression;
+                               //this[0] = expression;
+                               append(expression as XML);
                        }
                        else 
             {
@@ -80,7 +84,8 @@ package
                 {
                                        var item:XML = new XML(expression);
                                        if (item.nodeKind() == 'text' && 
item.getValue() == '') return;
-                               this[0] = item;
+                               //this[0] = item;
+                                       append(item);
                 }
                 catch (e:Error)
                 {
@@ -97,7 +102,8 @@ package
                             var m:int = list.length();
                             for (var j:int = 0; j < m; j++)
                             {
-                                this[j] = list[j];
+                                //this[j] = list[j];
+                                                               append(list[j] 
as XML);
                             }
                         }
                         catch (e2:Error)
@@ -314,19 +320,22 @@ package
                 * Calls the attribute() method of each XML object and returns 
an XMLList object of the results.
                 * 
                 * @param attributeName
-                * @return 
+                * @return an XMLList of matching attributes
+                *
+                *
+                * @royaleignorecoercion XML
                 * 
                 */
                public function attribute(attributeName:*):XMLList
                {
                        if(isSingle())
-                               return _xmlArray[0].attribute(attributeName);
+                               return (_xmlArray[0] as 
XML).attribute(attributeName);
 
                        var retVal:XMLList = new XMLList();
                        var len:int = _xmlArray.length;
                        for (var i:int=0;i<len;i++)
                        {
-                               var list:XMLList = 
_xmlArray[i].attribute(attributeName);
+                               var list:XMLList = (_xmlArray[i] as 
XML).attribute(attributeName);
                                if(list.length())
                                        retVal.concat(list);
                        }
@@ -439,24 +448,42 @@ package
                        }
                        return retVal;
                }
+
+               /**
+                *
+                * @param list
+                * @return this list concatenated with the contents of the list 
argument
+                *
+                * @private
+                * @royaleignorecoercion XMLList
+                * @royaleignorecoercion XML
+                */
                
                public function concat(list:*):XMLList
                {
                        if(list is XML)
                        {
-                               var newList:XMLList = new XMLList();
+                               /*var newList:XMLList = new XMLList();
                                newList.append(list);
-                               list = newList;
+                               list = newList;*/
+                               append (list as XML);
+                       } else {
+                               if(!(list is XMLList))
+                                       throw new TypeError("invalid type");
+                               var otherListContents:Array = (list as 
XMLList)._xmlArray;
+                               var l:uint = otherListContents.length;
+                               for (var i:uint=0;i<l;i++) {
+                                       append(otherListContents[i] as XML);
+                               }
                        }
-                       if(!(list is XMLList))
-                               throw new TypeError("invalid type");
 
-                       var item:XML;
+
+                       /*var item:XML;
                        //work-around for FLEX-35070
                        var len:int = list.length();
                        var i:int=0;
                        while(i<len)
-                               append(list[i++]);
+                               append(list[i++]);*/
 
 //                     var xmlList:XMLList = list;
 //                     for each(item in xmlList)
@@ -768,7 +795,7 @@ package
                                Semantics
                                The production AdditiveExpression : 
AdditiveExpression + MultiplicativeExpression is evaluated as follows:
                                
-                               1. Let a be the result of evalutating 
AdditiveExpression
+                               1. Let a be the result of evaluating 
AdditiveExpression
                                2. Let left = GetValue(a)
                                3. Let m be the result of evaluating 
MultiplicativeExpression
                                4. Let right = GetValue(m)
@@ -801,9 +828,11 @@ package
                                return this.toString() + rightHand;
                        if(rightHand is Number && isNaN(rightHand))
                                return NaN;
-                       if(isNaN(Number( this.toString() )) || isNaN(Number( 
rightHand.toString() )))
-                               return this.toString() + rightHand.toString();
-                       return Number(this.toString()) + rightHand;
+                       var thisString:String = this.toString();
+                       var rhsString:String = rightHand.toString();
+                       if(isNaN(Number( thisString )) || isNaN(Number( 
rhsString )))
+                               return thisString + rhsString;
+                       return Number(thisString) + rightHand;
                }
                
                /**
@@ -917,7 +946,7 @@ package
                                                
_xmlArray.splice(idx+i,0,child[i]);
                                }
                        }
-                       // add indexes as necessary
+                       // add indexes as necessary @todo check, should it be 
<= below:
                        while(idx++ < _xmlArray.length)
                        {
                                if(!this.hasOwnProperty(idx))
@@ -929,7 +958,7 @@ package
                /**
                 * @private
                 * 
-                * Internally used to store an associated XML or XMLList object 
which will be effected by operations
+                * Internally used to store an associated XML or XMLList object 
which will be affected by operations
                 */
                public function set targetObject(value:*):void
                {
@@ -974,10 +1003,10 @@ package
                                var xmlStr:String = "<";
                                if(_targetProperty is QName)
                                {
-                                       if(_targetProperty.prefix)
-                                               xmlStr += 
_targetProperty.prefix + "::";
+                                       if(QName(_targetProperty).prefix)
+                                               xmlStr += 
QName(_targetProperty).prefix + "::";
 
-                                       xmlStr += _targetProperty.localName + 
"/>";
+                                       xmlStr += 
QName(_targetProperty).localName + "/>";
                                }
                                else
                                {
diff --git 
a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLListTesterGeneralTest.as
 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLListTesterGeneralTest.as
index 139dafd..bdeebfd 100644
--- 
a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLListTesterGeneralTest.as
+++ 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLListTesterGeneralTest.as
@@ -243,5 +243,86 @@ package flexUnitTests.xml
             assertStrictlyEquals(alt[0], source, 'unexpected XMLList content 
strict equality');
 
         }
+
+
+        [Test]
+        public function testAddition():void{
+
+            var list:XMLList = new XMLList('<?xml version="1.0" 
encoding="utf-8"?><success>false</success><retryable>false</retryable><localStatus>SESSION_NO_SUCH_CUSTOMER</localStatus>');
+            assertEquals(list.length(), 3, 'unexpected parsing result for list 
content');
+            var something:XML = <something>something</something>;
+            var prepend:Object = something;
+            var origList:XMLList;
+            var newList:XMLList;
+
+            newList = XMLList(prepend) + list;
+
+
+
+
+            assertEquals(newList.toString(),
+                    '<something>something</something>\n' +
+                    '<success>false</success>\n' +
+                    '<retryable>false</retryable>\n' +
+                    '<localStatus>SESSION_NO_SUCH_CUSTOMER</localStatus>', 
'unexpected list concatenation result');
+
+            var orig:XML = something;
+            var newList2:XMLList ;
+            newList2 = something + list;
+
+
+            assertStrictlyEquals(orig, something,'should be the same 
instance');
+
+            assertEquals(newList2.toString(),
+                    '<something>something</something>\n' +
+                    '<success>false</success>\n' +
+                    '<retryable>false</retryable>\n' +
+                    '<localStatus>SESSION_NO_SUCH_CUSTOMER</localStatus>', 
'unexpected list concatenation result');
+
+            origList = list;
+
+            list += newList;
+
+            //in XMLList case, +=, to be explicit, does not append to the 
original instance, it creates a new instance
+            assertNotEquals(origList, list,'should be a new instance');
+
+            assertEquals(list.toString(),
+                    '<success>false</success>\n' +
+                    '<retryable>false</retryable>\n' +
+                    '<localStatus>SESSION_NO_SUCH_CUSTOMER</localStatus>\n' +
+                    '<something>something</something>\n' +
+                    '<success>false</success>\n' +
+                    '<retryable>false</retryable>\n' +
+                    '<localStatus>SESSION_NO_SUCH_CUSTOMER</localStatus>', 
'unexpected list concatenation result');
+
+
+            var source:XML = <xml><child name="1"><item id="item1" 
category="unknown"/></child><child name="2"><item id="item2" 
category="unknown"/></child><child name="3"><item id="item3" 
category="unknown"/></child><child name="4"><item id="item4" 
category="unknown"/></child></xml>;
+
+
+            var itemIds:XMLList = source.child.item.@id;
+
+            var childList:XMLList = source.child;
+
+
+            var combined:XMLList = childList+itemIds;
+
+            assertEquals(combined.toString(),
+                    '<child name="1">\n' +
+                    '  <item id="item1" category="unknown"/>\n' +
+                    '</child>\n' +
+                    '<child name="2">\n' +
+                    '  <item id="item2" category="unknown"/>\n' +
+                    '</child>\n' +
+                    '<child name="3">\n' +
+                    '  <item id="item3" category="unknown"/>\n' +
+                    '</child>\n' +
+                    '<child name="4">\n' +
+                    '  <item id="item4" category="unknown"/>\n' +
+                    '</child>\n' +
+                    'item1\n' +
+                    'item2\n' +
+                    'item3\n' +
+                    'item4', 'unexpected list concatenation result');
+        }
     }
 }
diff --git 
a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterGeneralTest.as
 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterGeneralTest.as
index cc82b5e..39b0b7d 100644
--- 
a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterGeneralTest.as
+++ 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLTesterGeneralTest.as
@@ -1212,9 +1212,21 @@ package flexUnitTests.xml
             assertEquals(xml.toString(),'<root><baz name="baz2"/></root>',"the 
first baz element should have been removed.");
             xml = <root name="foo"><baz name="baz1"/><baz name="baz2"/></root>;
             delete xml.baz;
-            // delete xml.baz[0];
-            assertEquals(xml.toXMLString(),'<root name="foo"/>',"the first baz 
element should have been removed.");
-            XML.setSettings(XML.defaultSettings());
+            assertEquals(xml.toXMLString(),'<root name="foo"/>',"the baz 
elements should have been removed.");
+            xml = <root name="foo"><baz name="baz1"/><baz name="baz2"/></root>;
+            delete xml['baz'];
+            assertEquals(xml.toXMLString(),'<root name="foo"/>',"the baz 
elements should have been removed.");
+            xml = <root name="foo"><baz name="baz1"/><baz name="baz2"/><notBaz 
name="notbaz"/></root>;
+            delete xml.*;
+            assertEquals(xml.toXMLString(),'<root name="foo"/>',"all child 
elements should have been removed.");
+            xml = <root name="foo"><baz name="baz1"/><baz name="baz2"/><notBaz 
name="notbaz"/></root>;
+            delete xml['*'];
+            assertEquals(xml.toXMLString(),'<root name="foo"/>',"all child 
elements should have been removed.");
+            xml = <root>text<other/></root>;
+            delete xml.*;
+            assertEquals(xml.toXMLString(),'<root/>',"all child elements 
should have been removed.");
+
+               XML.setSettings(XML.defaultSettings());
         }
 
         [Test]
@@ -1414,5 +1426,23 @@ package flexUnitTests.xml
             var xml:XML = XML('<test 1="23"/>');
             assertEquals(xml.toXMLString(), '<test 1="23"/>', 'roundtripping 
with numeric attributes did not work');
         }*/
+
+
+        [Test]
+        public function testMixedAddition():void{
+            var xml:XML = <root>1</root>;
+            var num:uint = 9;
+
+            var val:uint = xml + num;
+
+            assertStrictlyEquals(val,19,'unexpected numeric addition result');
+
+            val = Number(xml) + num;
+
+            assertStrictlyEquals(val,10,'unexpected numeric addition result');
+
+            var obj:Object = xml + num;
+            assertStrictlyEquals(obj,"19",'unexpected untyped addition 
result');
+        }
     }
 }

Reply via email to