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');
+ }
}
}