You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2022/01/18 22:51:55 UTC

[royale-asjs] branch develop updated: Various fixes and improvements to XML/XMLList, with additional tests added (requires latest compiler update)

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 <gr...@gmail.com>
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');
+        }
     }
 }