This is an automated email from the ASF dual-hosted git repository.
harbs 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 dd9be56 Added arraysMatch and objectsMatch
dd9be56 is described below
commit dd9be568413b2a51dd5436edbffdc1f962b20e49
Author: Harbs <[email protected]>
AuthorDate: Sat Jan 15 23:46:00 2022 +0200
Added arraysMatch and objectsMatch
---
.../projects/Core/src/main/royale/CoreClasses.as | 3 +
.../org/apache/royale/utils/array/arraysMatch.as} | 54 ++++----
.../org/apache/royale/utils/object/objectsMatch.as | 138 +++++++++++++++++++++
.../test/royale/flexUnitTests/ObjectUtilsTest.as | 48 +++++++
4 files changed, 215 insertions(+), 28 deletions(-)
diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as
b/frameworks/projects/Core/src/main/royale/CoreClasses.as
index b506982..ebb47c4 100644
--- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
@@ -336,6 +336,9 @@ internal class CoreClasses
import org.apache.royale.utils.transformValueFromRange;
transformValueFromRange;
import org.apache.royale.utils.array.rangeCheck; rangeCheck;
+ import org.apache.royale.utils.array.arraysMatch; arraysMatch;
+
+ import org.apache.royale.utils.object.objectsMatch; objectsMatch;
import org.apache.royale.utils.string.Base64;
org.apache.royale.utils.string.Base64;
import org.apache.royale.utils.Base64; org.apache.royale.utils.Base64;
diff --git
a/frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/array/arraysMatch.as
similarity index 56%
copy from
frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
copy to
frameworks/projects/Core/src/main/royale/org/apache/royale/utils/array/arraysMatch.as
index 010025d..54e27b4 100644
--- a/frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
+++
b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/array/arraysMatch.as
@@ -16,39 +16,37 @@
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
-package flexUnitTests
+package org.apache.royale.utils.array
{
- import org.apache.royale.core.Strand;
- import org.apache.royale.test.asserts.*;
- import org.apache.royale.utils.object.classFromInstance;
- public class ObjectUtilsTest
+ import org.apache.royale.utils.object.objectsMatch;
+
+ /**
+ * Checks that all items in an array match.
+ * If deep is true, it will recursively compare properties of all
items.
+ * level is used to track the level of nesting to prevent an endless
loop
+ * @langversion 3.0
+ * @productversion Royale 0.9.9
+ * @royalesuppressexport
+ */
+ public function
arraysMatch(first:Array,second:Array,deep:Boolean=false,level:int=0):Boolean
{
- [Before]
- public function setUp():void
- {
- }
-
- [After]
- public function tearDown():void
- {
- }
-
- [BeforeClass]
- public static function setUpBeforeClass():void
- {
- }
+ if(first.length != second.length)
+ return false;
- [AfterClass]
- public static function tearDownAfterClass():void
+ var len:int = first.length;
+ for(var i:int=0; i<len; i++)
{
+ if(deep)
+ {
+ if(!objectsMatch(first[i], second[i], deep,
level+1))
+ return false;
+
+ }
+ else if(first[i] !== second[i])
+ return false;
+
}
-
- [Test]
- public function testClass():void
- {
- var strand:Strand = new Strand();
- assertEquals(classFromInstance(strand), Strand, "Error
finding class from instance.");
- }
+ return true;
}
}
\ No newline at end of file
diff --git
a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/objectsMatch.as
b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/objectsMatch.as
new file mode 100644
index 0000000..ec71da5
--- /dev/null
+++
b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/objectsMatch.as
@@ -0,0 +1,138 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.utils.object
+{
+
+ import org.apache.royale.utils.array.arraysMatch;
+
+ /**
+ * Checks whether objects of any type match.
+ * If deep is true, it will recursively check objects.
+ * level is used to prevent an endless loop with circular references.
+ * Maximum level of nesting is 100
+ * @langversion 3.0
+ * @productversion Royale 0.9.9
+ * @royaleignorecoercion Array
+ * @royaleignorecoercion Date
+ * @royalesuppressexport
+ */
+ public function objectsMatch(first:*, second:*,
deep:Boolean=false,level:int=0):Boolean
+ {
+ if(level > _MAX_LEVEL_)
+ return false;
+
+ if(first == null || second == null)
+ return first === second;
+
+
+ COMPILE::SWF
+ {
+ if(first is Array)
+ {
+ if(!(second is Array))
+ return false;
+
+ return arraysMatch(first as Array,second as
Array, deep, level+1);
+ }
+
+ //TODO Vectors
+ //TODO XML
+ if(first is String || first is int || first is uint ||
first is Number || first is Boolean || first is Class)
+ {
+ return first === second;
+ }
+ else if (first is Date)
+ {
+ if(!(second is Date))
+ return false;
+
+ return (first as Date).getTime() == (second as
Date).getTime();
+ }
+ //TODO make sure that all object properties match
+ for(var x:String in first)
+ {
+ if(deep)
+ {
+ if(!objectsMatch(first[x], second[x],
deep, level+1))
+ return false;
+ }
+ else if(first[x] !== second[x])
+ return false;
+
+ }
+ return true;
+
+ }
+ COMPILE::JS
+ {
+ var firstType:String = typeof first;
+ var secondType:String = typeof second;
+ if(firstType != secondType)
+ return false;
+
+ if(firstType == 'object' && secondType == 'object')
+ {
+
+ // treat all array-like objects as arrays
+ if(first.constructor.name.indexOf("Array") !=
-1 &&
+ first.constructor.name.indexOf("Array")
!= -1 &&
+ first.propertyIsEnumerable("length") &&
+ second.propertyIsEnumerable("length"))
+ {
+ return arraysMatch(first as Array,
second as Array, deep, level+1);
+ }
+ // TODO Vectors that are not compiled as Arrays
+
+ // TODO XML
+ if (first is Date)
+ {
+ if(!(second is Date))
+ return false;
+
+ return (first as Date).getTime() ==
(second as Date).getTime();
+ }
+
+ var firstKeys:Array = Object.keys(first);
+ var secondKeys:Array = Object.keys(second);
+ if(!arraysMatch(firstKeys,secondKeys))
+ return false;
+
+ for(var x:String in first)
+ {
+ if(deep)
+ {
+
if(!objectsMatch(first[x],second[x],deep,level+1))
+ return false;
+ }
+ else
+ {
+ if(first[x] !== second[x])
+ return false;
+ }
+ }
+ return true;
+ }
+ else
+ return first === second;
+
+ }
+ }
+}
+
+internal const _MAX_LEVEL_:int = 100;
diff --git
a/frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
b/frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
index 010025d..1e37b30 100644
--- a/frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
+++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/ObjectUtilsTest.as
@@ -21,6 +21,10 @@ package flexUnitTests
import org.apache.royale.core.Strand;
import org.apache.royale.test.asserts.*;
import org.apache.royale.utils.object.classFromInstance;
+ import org.apache.royale.utils.object.objectsMatch;
+ import org.apache.royale.test.asserts.assertFalse;
+ import org.apache.royale.test.asserts.assertTrue;
+ import org.apache.royale.utils.array.arraysMatch;
public class ObjectUtilsTest
{
@@ -50,5 +54,49 @@ package flexUnitTests
var strand:Strand = new Strand();
assertEquals(classFromInstance(strand), Strand, "Error
finding class from instance.");
}
+ [Test]
+ public function testObjectsMatch():void
+ {
+ var first:Object =
{name:"foo",age:10,human:false,children:[{name:"bar",age:1},{name:"baz",age:2}]}
+ var second:Object =
{name:"foo",age:10,human:false,children:[{name:"bar",age:1},{name:"baz",age:2}]}
+ assertTrue(objectsMatch(first,second,true),"deep
comparison of objects should match");
+ assertFalse(objectsMatch(first,second,false),"shallow
comparison of objects should not match");
+ }
+ [Test]
+ public function testArraysMatch():void
+ {
+ var firstArray:Array = [1,2,3,4,"5",6];
+ var secondArray:Array = [1,2,3,"4",5,6];
+
+
assertFalse(arraysMatch(firstArray,secondArray,true),"deep comparison of
mismatched simple array values should not match");
+
assertFalse(arraysMatch(firstArray,secondArray,false),"shallow comparison of
mismatched simple array values should not match");
+ //
assertFalse(objectsMatch(firstArray,secondArray,true),"deep comparison of
mismatched simple array values should not match (using objectMatch)");
+ //
assertFalse(objectsMatch(firstArray,secondArray,false),"shallow comparison of
mismatched simple array values should not match (using objectMatch)");
+
+
+ firstArray = [1,2,3,4,5,6];
+ secondArray = [1,2,3,4,5,6];
+
assertTrue(arraysMatch(firstArray,secondArray,true),"deep comparison of like
number values should match");
+
assertTrue(arraysMatch(firstArray,secondArray,false),"shallow comparison of
like number values should match");
+
assertTrue(objectsMatch(firstArray,secondArray,true),"deep comparison of like
number values should match (using objectMatch)");
+
assertTrue(objectsMatch(firstArray,secondArray,false),"shallow comparison of
like number values should match (using objectMatch)");
+
+ secondArray.push(7);
+
assertFalse(arraysMatch(firstArray,secondArray,true),"deep comparison should
not match when lengths are different");
+
assertFalse(arraysMatch(firstArray,secondArray,false),"shallow comparison
should not match when lengths are different");
+ //
assertFalse(objectsMatch(firstArray,secondArray,true),"deep comparison should
not match when lengths are different (using objectMatch)");
+ //
assertFalse(objectsMatch(firstArray,secondArray,false),"shallow comparison
should not match when lengths are different (using objectMatch)");
+
+ var first:Object =
{name:"foo",age:10,human:false,children:[{name:"bar",age:1},{name:"baz",age:2}]}
+ var second:Object =
{name:"foo",age:10,human:false,children:[{name:"bar",age:1},{name:"baz",age:2}]}
+ firstArray = [1,2,3,"4",5,first];
+ secondArray = [1,2,3,"4",5,second];
+
+
assertTrue(arraysMatch(firstArray,secondArray,true),"deep array comparison with
nested object should match");
+
assertFalse(arraysMatch(firstArray,secondArray,false),"shallow array comparison
with nested object should not match");
+ //
assertTrue(objectsMatch(firstArray,secondArray,true),"deep array comparison
with nested object should match (using objectMatch)");
+ //
assertFalse(objectsMatch(firstArray,secondArray,false),"shallow array
comparison with nested object should not match (using objectMatch)");
+
+ }
}
}
\ No newline at end of file