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 b686cb183779e90208c55bc0c2d96fc248ba6313
Author: greg-dove <greg.d...@gmail.com>
AuthorDate: Tue Oct 29 15:24:21 2019 +1300

    Updates to support MXRoyale/ mx.utils.ObjectUtil tests
---
 frameworks/build.xml                               |   5 +
 .../projects/MXRoyaleJS/src/test/royale/build.xml  | 196 +++++++++++
 .../projects/Language/src/main/royale/QName.as     |  13 +-
 frameworks/projects/MXRoyale/build.xml             |   9 +
 .../src/main/royale/mx/utils/ObjectUtil.as         |  86 ++++-
 .../royale/FlexUnitRoyaleApplication-config.xml    | 113 +++++++
 .../src/test/royale/FlexUnitRoyaleApplication.mxml |  82 +++++
 .../{XML => MXRoyale}/src/test/royale/build.xml    |  15 +-
 .../test}/royale/flexUnitTests/MXRoyaleTester.as   |  13 +-
 .../mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as   | 187 +++++++++++
 .../FlexSDK_ObjectUtil_FLEX_34852_Tests.as         | 165 +++++++++
 .../mxroyale/FlexSDK_ObjectUtil_Tests.as           | 374 +++++++++++++++++++++
 .../flexUnitTests/mxroyale/ObjectUtilTest.as       |   9 +-
 .../flexUnitTests/mxroyale/support/TestClass1.as   |  18 +-
 .../flexUnitTests/mxroyale/support/TestClass2.as   |  16 +-
 .../flexUnitTests/mxroyale/support/TestClass3.as   |  25 +-
 .../flexUnitTests/mxroyale/support/TestClass4.as   |   9 +-
 .../flexUnitTests/mxroyale/support/TestClass5.as   |   6 +-
 .../flexUnitTests/mxroyale/support/TestClass6.as   |  43 ++-
 .../mxroyale/support/testnamespace.as              |   9 +-
 .../apache/royale/reflection/getDynamicFields.as   |  46 ++-
 .../apache/royale/reflection/isDynamicObject.as    |   6 +-
 frameworks/projects/XML/src/test/royale/build.xml  |   7 +-
 .../XML/src/test/royale/flexUnitTests/XMLTester.as |   2 +-
 .../royale/flexUnitTests/xml/XMLNamespaceTest.as   |  50 ++-
 .../main/royale/flexUnitTests/MXRoyaleTester.as    |  11 +-
 .../mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as   | 187 +++++++++++
 .../FlexSDK_ObjectUtil_FLEX_34852_Tests.as         | 165 +++++++++
 .../mxroyale/FlexSDK_ObjectUtil_Tests.as           | 374 +++++++++++++++++++++
 .../flexUnitTests/mxroyale/ObjectUtilTest.as       |   7 +
 .../flexUnitTests/mxroyale/support/TestClass3.as   |  17 +-
 .../flexUnitTests/mxroyale/support/TestClass4.as   |  15 +-
 .../network/AMFBinaryDataTesterTest.as             |   8 +-
 33 files changed, 2198 insertions(+), 90 deletions(-)

diff --git a/frameworks/build.xml b/frameworks/build.xml
index e3c5a47..48a41d1 100644
--- a/frameworks/build.xml
+++ b/frameworks/build.xml
@@ -155,6 +155,7 @@
         <antcall target="NetworkTest"/>
         <antcall target="XMLTest"/>
         <antcall target="CollectionsTest"/>
+        <antcall target="MXRoyaleTest"/>
     </target>
 
     <target name="fonts">
@@ -385,6 +386,10 @@
     <target name="MXRoyale" description="Clean build of MXRoyale.swc">
         <ant dir="${basedir}/projects/MXRoyale"/>
     </target>
+    <target name="MXRoyaleTest" description="Test of MXRoyale.swc">
+        <ant dir="${basedir}/projects/MXRoyale" target="test"/>
+    </target>
+
     <target name="SparkRoyale" description="Clean build of SparkRoyale.swc">
         <ant dir="${basedir}/projects/SparkRoyale"/>
     </target>
diff --git a/frameworks/js/projects/MXRoyaleJS/src/test/royale/build.xml 
b/frameworks/js/projects/MXRoyaleJS/src/test/royale/build.xml
new file mode 100644
index 0000000..923fb36
--- /dev/null
+++ b/frameworks/js/projects/MXRoyaleJS/src/test/royale/build.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0"?>
+<!--
+
+  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.
+
+-->
+
+
+<project name="MXRoyaleJS.test" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../../../../../.."/>
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/local.properties"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${env.ROYALE_HOME}"/>
+    <property name="ROYALE_SWF_COMPILER_HOME" 
value="${env.ROYALE_SWF_COMPILER_HOME}"/>
+    <property name="target.name" value="MXRoyaleJS-${release.version}.swc" />
+
+    <!--
+        Windows browser:
+            try chrome first because it's the most popular browser
+            otherwise, try to fall back to firefox
+            DON'T use internet explorer! it cannot run scripts in local pages
+    -->
+    <condition property="royaleunit.browser" 
value="${env.ProgramFiles}/Google/Chrome/Application/chrome.exe">
+        <and>
+            <os family="windows"/>
+            <available 
file="${env.ProgramFiles}/Google/Chrome/Application/chrome.exe"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" 
value="${env.ProgramFiles(x86)}/Google/Chrome/Application/chrome.exe">
+        <and>
+            <os family="windows"/>
+            <available 
file="${env.ProgramFiles(x86)}/Google/Chrome/Application/chrome.exe"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" 
value="${env.ProgramFiles}/Mozilla Firefox/firefox.exe">
+        <and>
+            <os family="windows"/>
+            <available file="${env.ProgramFiles}/Mozilla Firefox/firefox.exe"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" 
value="${env.ProgramFiles(x86)}/Mozilla Firefox/firefox.exe">
+        <and>
+            <os family="windows"/>
+            <available file="${env.ProgramFiles(x86)}/Mozilla 
Firefox/firefox.exe"/>
+        </and>
+    </condition>
+
+    <!--
+        macOS browser:
+            try chrome first because it's the most popular browser
+            otherwise, try to fall back to firefox
+            DON'T use safari! it asks the user to confirm opening local pages
+    -->
+    <condition property="royaleunit.browser" value="/Applications/Google 
Chrome.app/Contents/MacOS/Google Chrome">
+        <and>
+            <os family="mac"/>
+            <available file="/Applications/Google 
Chrome.app/Contents/MacOS/Google Chrome"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" 
value="/Applications/Firefox.app/Contents/MacOS/firefox">
+        <and>
+            <os family="mac"/>
+            <available 
file="/Applications/Firefox.app/Contents/MacOS/firefox"/>
+        </and>
+    </condition>
+
+    <!--
+        Linux/Unix browser
+    -->
+    <condition property="royaleunit.browser" value="/usr/bin/firefox">
+        <and>
+            <os family="unix"/>
+            <available file="/usr/bin/firefox"/>
+        </and>
+    </condition>
+
+    <property name="report.dir" value="${basedir}/out" />
+
+    <target name="main" depends="clean,compile,test" description="Clean test 
of ${target.name}">
+    </target>
+
+    <target name="clean">
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${basedir}/target">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${report.dir}">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+    </target>
+    
+    <path id="lib.path">
+      <fileset dir="${ROYALE_COMPILER_HOME}/lib" 
includes="compiler-royaleTasks.jar"/>
+      <fileset dir="${ROYALE_COMPILER_HOME}/lib" 
includes="royaleUnitTasks.jar"/>
+    </path>
+
+    <target name="compile" description="Cross-compiles tests">
+        <echo message="Cross-compiling tests"/>
+        <echo message="ROYALE_HOME: ${ROYALE_HOME}"/>
+        <echo message="ROYALE_SWF_COMPILER_HOME: ${ROYALE_SWF_COMPILER_HOME}"/>
+        <echo message="playerglobal.version: ${playerglobal.version}"/>
+
+        <!-- Load the <compc> task. We can't do this at the <project> level -->
+        <!-- because targets that run before flexTasks.jar gets built would 
fail. -->
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+        <!--
+            Link in the classes (and their dependencies) for the MXML tags
+            listed in this project's manifest.xml.
+            Also link the additional classes (and their dependencies)
+            listed in RoyaleUIClasses.as,
+            because these aren't referenced by the manifest classes.
+            Keep the standard metadata when compiling.
+            Include the appropriate CSS files and assets in the SWC.
+            Don't include any resources in the SWC.
+            Write a bundle list of referenced resource bundles
+            into the file bundles.properties in this directory.
+        -->
+        <mxmlc fork="true"
+            
file="${basedir}/../../../../../../projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication.mxml">
+            <jvmarg line="${mxmlc.jvm.args}"/>
+            <!--
+            <jvmarg value="-Xdebug" />
+            <jvmarg value="-Xnoagent" />
+            <jvmarg 
value="-Xrunjdwp:transport=dt_socket,address=8763,server=y,suspend=y" />
+             -->
+            <arg 
value="-compiler.exclude-defaults-css-files=MXRoyale-0.9.7-SNAPSHOT-js.swc:defaults.css"
 />
+            <arg 
value="-compiler.exclude-defaults-css-files=MXRoyale-0.9.7-SNAPSHOT-swf.swc:defaults.css"
 />
+            <arg 
value="-compiler.exclude-defaults-css-files=MXRoyaleJS.swc:defaults.css" />
+            <arg value="-debug" />
+            <arg value="-compiler.targets=JSRoyale" />
+            <arg value="-js-output=target" />
+            <arg value="+playerglobal.version=${playerglobal.version}" />
+            <arg value="+env.PLAYERGLOBAL_HOME=${env.PLAYERGLOBAL_HOME}" />
+        </mxmlc>
+    </target>
+
+    <target name="check-royaleunit-browser" if="royaleunit.browser" 
unless="skip-tests">
+        <!--
+            if the royaleunit.browser property was provided manually,
+            check if the file actually exists
+        -->
+        <condition property="royaleunit.browser.exists">
+            <and>
+                <isset property="royaleunit.browser" />
+                <available file="${royaleunit.browser}" type="file" />
+            </and>
+        </condition>
+        
+        <fail unless="royaleunit.browser.exists" message="Invalid 
royaleunit.browser path: &quot;${royaleunit.browser}&quot;. To skip RoyaleUnit 
tests, use -Dskip-tests." />
+    </target>
+
+    <target name="test" depends="check-royaleunit-browser" 
if="royaleunit.browser.exists" unless="skip-tests">
+        <!-- Load the <royaleunit> task. We can't do this at the <project> 
level -->
+        <!-- because targets that run before royaleUnitTasks.jar gets built 
would fail. -->
+        <taskdef resource="royaleUnitTasks.tasks" classpathref="lib.path"/>
+               <mkdir dir="${report.dir}" />
+               <royaleunit
+            player="html"
+            swf="${basedir}/target/bin/js-debug/index.html"
+            command="${royaleunit.browser}"
+                   workingDir="${basedir}"
+                   toDir="${report.dir}"
+                       haltonfailure="true"
+                       verbose="true"
+                       localTrusted="true"
+                       timeout="90000" />
+        
+               <!-- Generate readable JUnit-style reports -->
+               <junitreport todir="${report.dir}">
+                       <fileset dir="${report.dir}">
+                               <include name="TEST-*.xml" />
+                       </fileset>
+                       <report format="frames" todir="${report.dir}/html" />
+               </junitreport>
+        
+    </target>
+</project>
diff --git a/frameworks/projects/Language/src/main/royale/QName.as 
b/frameworks/projects/Language/src/main/royale/QName.as
index 14e88b6..6871a9b 100644
--- a/frameworks/projects/Language/src/main/royale/QName.as
+++ b/frameworks/projects/Language/src/main/royale/QName.as
@@ -60,11 +60,14 @@ package
                 * a QName instance
                 */
                public static function getAsObjectAccessFormat(uri:String, 
localName:String):String{
-                       var uriVal:String = uri ? uri : "*";
-                       uriVal = uriVal.replace(/:/g, "_");
-                       uriVal = uriVal.replace(/\./g, "_");
-                       uriVal = uriVal.replace(/\//g, "$");
-                       return uriVal + "__" + localName;
+                       var uriVal:String = uri;
+                       if (uriVal) {
+                               uriVal = uriVal.replace(/:/g, "_");
+                               uriVal = uriVal.replace(/\./g, "_");
+                               uriVal = uriVal.replace(/\//g, "$");
+                               return uriVal + "__" + localName;
+                       }
+                       return localName;
                }
                
                
diff --git a/frameworks/projects/MXRoyale/build.xml 
b/frameworks/projects/MXRoyale/build.xml
index b4d0665..c409762 100644
--- a/frameworks/projects/MXRoyale/build.xml
+++ b/frameworks/projects/MXRoyale/build.xml
@@ -66,6 +66,15 @@
     
     <target name="test" depends="check-for-tests,check-compiler" 
unless="skip-tests">
         <ant dir="src/test/royale" />
+        <antcall target="test-js" />
+    </target>
+
+    <target name="test-js">
+        <ant 
dir="${ROYALE_HOME}/frameworks/js/projects/${ant.project.name}JS/" 
inheritAll="false" target="test">
+            <property name="ROYALE_SWF_COMPILER_HOME" 
value="${ROYALE_SWF_COMPILER_HOME}"/>
+            <property name="ROYALE_COMPILER_HOME" 
value="${ROYALE_COMPILER_HOME}"/>
+            <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+        </ant>
     </target>
     
     <target name="clean">
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/utils/ObjectUtil.as 
b/frameworks/projects/MXRoyale/src/main/royale/mx/utils/ObjectUtil.as
index c7ae1f0..55a7480 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/utils/ObjectUtil.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/utils/ObjectUtil.as
@@ -824,7 +824,7 @@ public class ObjectUtil
     }
     /**
      *  @royaleignorecoercion WeakMap
-     *
+     *  @royaleignorecoercion BinaryData
      */
     private static function internalCompare(a:Object, b:Object,
                                             currentDepth:int, desiredDepth:int,
@@ -869,7 +869,12 @@ public class ObjectUtil
 
                 case "object":
                     var newDepth:int = desiredDepth > 0 ? desiredDepth -1 : 
desiredDepth;
-
+                    COMPILE::SWF{
+                        const byteArrayClass:Class = flash.utils.ByteArray;
+                    }
+                    COMPILE::JS{
+                        const byteArrayClass:Class = BinaryData;
+                    }
                     // refs help us avoid circular reference infinite 
recursion.
                     var aRef:Object = getRef(a,refs);
                     var bRef:Object = getRef(b,refs);
@@ -911,6 +916,50 @@ public class ObjectUtil
                     {
                         result = listCompare(a as IList, b as IList, 
currentDepth, desiredDepth, refs);
                     }
+                    else if ((a is byteArrayClass) && (b is byteArrayClass))
+                    {
+                        COMPILE::SWF{
+                            result = byteArrayCompare(a as 
flash.utils.ByteArray, b as flash.utils.ByteArray);
+                        }
+                        COMPILE::JS{
+                            result = byteArrayCompare(a as BinaryData, b as 
BinaryData);
+                        }
+                        
+                    }
+                    else if (getQualifiedClassName(a) == 
getQualifiedClassName(b))
+                    {
+                        var aProps:Array = getClassInfo(a).properties;
+                        var bProps:Array;
+    
+                        // if the objects are dynamic they could have different
+                        // # of properties and should be treated on that basis 
first
+                        var isObjectDynamic:Boolean = isDynamicObject(a);
+    
+                        // if it's dynamic, check to see that they have all 
the same properties
+                        if (isObjectDynamic)
+                        {
+                            bProps = getClassInfo(b).properties;
+                            result = arrayCompare(aProps, bProps, 
currentDepth, newDepth, refs);
+                            if (result != 0)
+                                return result;
+                        }
+    
+                        // now that we know we have the same properties, let's 
compare the values
+                        var propName:QName;
+                        var aProp:Object;
+                        var bProp:Object;
+                        for (var i:int = 0; i < aProps.length; i++)
+                        {
+                            propName = aProps[i];
+                            aProp = a[propName];
+                            bProp = b[propName];
+                            result = internalCompare(aProp, bProp, 
currentDepth+1, newDepth, refs);
+                            if (result != 0)
+                            {
+                                return result;
+                            }
+                        }
+                    }
                     else
                     {
                         // We must be unequal, so return 1
@@ -1618,7 +1667,7 @@ public class ObjectUtil
      */
     public static function getEnumerableProperties(object:Object):Array
     {
-        return getDynamicFields(object);
+        return getDynamicFields(object, null, true, true);
     }
 
 
@@ -1691,8 +1740,17 @@ public class ObjectUtil
 
         var result:* = obj;
         var i:int = -1;
-        while(++i < path.length && result)
-            result = result.hasOwnProperty(path[i]) ? result[path[i]] : 
undefined;
+        COMPILE::SWF{
+            while(++i < path.length && result)
+                result = result.hasOwnProperty(path[i]) ? result[path[i]] : 
undefined;
+        }
+        COMPILE::JS{
+            while(++i < path.length && result) {
+                //@todo: this works for public accessors, but need to use 
reflection here for safety (including vars)
+                result = path[i] in result ? result[path[i]] : undefined;
+            }
+            
+        }
 
         return result;
     }
@@ -1724,10 +1782,20 @@ public class ObjectUtil
             return false;
 
         var secondToLastLink:* = getValue(obj, path.slice(0, -1));
-        if(secondToLastLink && 
secondToLastLink.hasOwnProperty(path[path.length - 1]))
-        {
-            secondToLastLink[path[path.length - 1]] = newValue;
-            return true;
+        COMPILE::SWF{
+            if(secondToLastLink && 
secondToLastLink.hasOwnProperty(path[path.length - 1]))
+            {
+                secondToLastLink[path[path.length - 1]] = newValue;
+                return true;
+            }
+        }
+        COMPILE::JS{
+            //@todo: this works for public accessors, but need to use 
reflection here for safety (including vars)
+            if(secondToLastLink && (path[path.length - 1] in secondToLastLink))
+            {
+                secondToLastLink[path[path.length - 1]] = newValue;
+                return true;
+            }
         }
 
         return false;
diff --git 
a/frameworks/projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication-config.xml
 
b/frameworks/projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication-config.xml
new file mode 100644
index 0000000..c9b75b6
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication-config.xml
@@ -0,0 +1,113 @@
+<!--
+
+  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.
+
+-->
+<royale-config>
+
+    <compiler>
+        <accessible>false</accessible>
+        
+        <targets>
+            <target>SWF</target>
+        </targets>
+        <strict-xml>true</strict-xml>
+
+        <external-library-path>
+            
<path-element>{playerglobalHome}/{targetPlayerMajorVersion}.{targetPlayerMinorVersion}/playerglobal.swc</path-element>
+        </external-library-path>
+        
+        <js-external-library-path>
+            <path-element>../../../../../../js/libs/js.swc</path-element>
+            <path-element>../../../../../../js/libs/gcl.swc</path-element>
+        </js-external-library-path>
+        
+        <library-path>
+            <path-element>../../../../../libs/Basic.swc</path-element>
+            <path-element>../../../../../libs/Binding.swc</path-element>
+            <path-element>../../../../../libs/Core.swc</path-element>
+            <path-element>../../../../../libs/Graphics.swc</path-element>
+            <path-element>../../../../../libs/Collections.swc</path-element>
+            <path-element>../../../../../libs/Language.swc</path-element>
+            <path-element>../../../../../libs/Reflection.swc</path-element>
+            <path-element>../../../../../libs/Network.swc</path-element>
+            <path-element>../../../../../libs/MXRoyale.swc</path-element>
+            <path-element>../../../../../libs/RoyaleUnit.swc</path-element>
+        </library-path>
+        
+        <js-library-path>
+            <path-element>../../../../../js/libs/BasicJS.swc</path-element>
+            <path-element>../../../../../js/libs/BindingJS.swc</path-element>
+            <path-element>../../../../../js/libs/CoreJS.swc</path-element>
+            <path-element>../../../../../js/libs/GraphicsJS.swc</path-element>
+            
<path-element>../../../../../js/libs/CollectionsJS.swc</path-element>
+            <path-element>../../../../../js/libs/LanguageJS.swc</path-element>
+            
<path-element>../../../../../js/libs/ReflectionJS.swc</path-element>
+            <path-element>../../../../../js/libs/NetworkJS.swc</path-element>
+            <path-element>../../../../../js/libs/XMLJS.swc</path-element>
+            <path-element>../../../../../js/libs/MXRoyaleJS.swc</path-element>
+            
<path-element>../../../../../js/libs/RoyaleUnitJS.swc</path-element>
+        </js-library-path>
+
+        <allow-subclass-overrides>true</allow-subclass-overrides>
+
+        <mxml>
+            <children-as-data>true</children-as-data>
+        </mxml>
+        
<binding-value-change-event>org.apache.royale.events.ValueChangeEvent</binding-value-change-event>
+        
<binding-value-change-event-kind>org.apache.royale.events.ValueChangeEvent</binding-value-change-event-kind>
+        
<binding-value-change-event-type>valueChange</binding-value-change-event-type>
+        <fxg-base-class>flash.display.Sprite</fxg-base-class>
+
+        <keep-as3-metadata>
+          <name>Bindable</name>
+          <name>Managed</name>
+          <name>ChangeEvent</name>
+          <name>NonCommittingChangeEvent</name>
+          <name>Transient</name>
+          <name>SWFOverride</name>
+
+          <!-- RoyaleUnit -->
+          <name>Test</name>
+          <name>Before</name>
+          <name>After</name>
+          <name>BeforeClass</name>
+          <name>AfterClass</name>
+          <name>Ignore</name>
+          <name>Suite</name>
+          <name>RunWith</name>
+
+            <!--Reflection testing Meta -->
+            <name>TestMeta</name>
+        </keep-as3-metadata>
+    
+        <locale/>
+        
+        <library-path/>
+
+        <namespaces>
+            <!--<namespace>
+                <uri>library://ns.apache.org/royale/basic</uri>
+                <manifest>../../main/resources/basic-manifest.xml</manifest>
+            </namespace>-->
+        </namespaces>
+        
+        <warn-no-constructor>false</warn-no-constructor>
+    </compiler>
+    
+    <target-player>${playerglobal.version}</target-player>
+
+</royale-config>
diff --git 
a/frameworks/projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication.mxml 
b/frameworks/projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication.mxml
new file mode 100644
index 0000000..71176c5
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/FlexUnitRoyaleApplication.mxml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+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.
+
+-->
+
+<js:Application xmlns:fx="http://ns.adobe.com/mxml/2009";
+                   xmlns:js="library://ns.apache.org/royale/basic" 
+                   xmlns:test="org.apache.royale.test.*" 
+                   applicationComplete="runTests()"
+                   >
+    <fx:Declarations>
+        <test:RoyaleUnitCore id="core"/>
+    </fx:Declarations>
+    <fx:Script>
+        <![CDATA[
+            COMPILE::SWF
+            {
+                import flash.system.fscommand;
+            }
+
+            import flexUnitTests.MXRoyaleTester;
+            
+            import org.apache.royale.events.Event;
+            import org.apache.royale.test.listeners.CIListener;
+            import org.apache.royale.test.Runtime;
+
+            //account for swf version variance in some test results due to 
fixed player bugs etc
+            public function getSwfVersion():uint{
+                COMPILE::SWF{
+                    return this.stage.loaderInfo.bytes[3];
+
+                }
+                return 0;
+            }
+
+            public function getPlayerVersion():String{
+                COMPILE::SWF{
+                    import flash.system.Capabilities;
+                    return Capabilities.version;
+                }
+                return '';
+            }
+
+            public function runTests():void
+            {
+                Runtime.swfVersion = getSwfVersion();
+                core.addListener(new CIListener());
+                core.addEventListener(Event.COMPLETE, core_completeHandler);
+                core.runClasses(MXRoyaleTester);
+            }
+
+            private function core_completeHandler(event:Event):void
+            {
+                COMPILE::SWF
+                {
+                    fscommand("quit");
+                }
+            }
+            
+        ]]>
+    </fx:Script>
+    <js:valuesImpl>
+        <!-- for such a simple app, we just set values to an empty array so it 
thinks it doesn't have any values -->
+        <js:SimpleValuesImpl values="[]"/>
+    </js:valuesImpl>
+
+</js:Application>
diff --git a/frameworks/projects/XML/src/test/royale/build.xml 
b/frameworks/projects/MXRoyale/src/test/royale/build.xml
similarity index 83%
copy from frameworks/projects/XML/src/test/royale/build.xml
copy to frameworks/projects/MXRoyale/src/test/royale/build.xml
index 98b4945..8755bd2 100644
--- a/frameworks/projects/XML/src/test/royale/build.xml
+++ b/frameworks/projects/MXRoyale/src/test/royale/build.xml
@@ -19,7 +19,7 @@
 -->
 
 
-<project name="XML.test" default="main" basedir=".">
+<project name="MXRoyale.test" default="main" basedir=".">
     <property name="ROYALE_HOME" location="../../../../../.."/>
     
     <property file="${ROYALE_HOME}/env.properties"/>
@@ -28,7 +28,7 @@
     <property file="${ROYALE_HOME}/build.properties"/>
     <property name="ROYALE_HOME" value="${env.ROYALE_HOME}"/>
     <property name="ROYALE_SWF_COMPILER_HOME" 
value="${env.ROYALE_SWF_COMPILER_HOME}"/>
-    <property name="target.name" value="XML-${release.version}.swc" />
+    <property name="target.name" value="MXRoyale-${release.version}.swc" />
 
     <property name="report.dir" value="${basedir}/out" />
 
@@ -83,7 +83,11 @@
             <jvmarg value="-Xnoagent" />
             <jvmarg 
value="-Xrunjdwp:transport=dt_socket,address=8763,server=y,suspend=y" />
              -->
-            <arg value="-debug" />
+            <!--<arg 
value="-compiler.exclude-defaults-css-files=MXRoyale-0.9.7-SNAPSHOT-js.swc:defaults.css"
 />
+            <arg 
value="-compiler.exclude-defaults-css-files=MXRoyale-0.9.7-SNAPSHOT-swf.swc:defaults.css"
 />-->
+            <arg 
value="-compiler.exclude-defaults-css-files=MXRoyale.swc:defaults.css" />
+            <!-- this swf test is not run in a debug build, because there are 
too many strange metadata tags added-->
+            <!--<arg value="-debug" />-->
             <arg value="-compiler.targets=SWF" />
             <arg value="+playerglobal.version=${playerglobal.version}" />
             <arg value="+env.PLAYERGLOBAL_HOME=${env.PLAYERGLOBAL_HOME}" />
@@ -95,7 +99,12 @@
         <!-- because targets that run before royaleUnitTasks.jar gets built 
would fail. -->
         <taskdef resource="royaleUnitTasks.tasks" classpathref="lib.path"/>
                <mkdir dir="${report.dir}" />
+        <!-- Use the env var if it is set, otherwise default to 'system' flash 
debugger  -->
+        <condition property="command" value="${env.FLASHPLAYER_DEBUGGER}" 
else="">
+            <isset property="env.FLASHPLAYER_DEBUGGER" />
+        </condition>
                <royaleunit
+            command="${command}"
             swf="${basedir}/FlexUnitRoyaleApplication.swf"
                    workingDir="${basedir}"
                    toDir="${report.dir}"
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/MXRoyaleTester.as
similarity index 78%
copy from manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/MXRoyaleTester.as
index 7f34909..510a492 100644
--- a/manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/MXRoyaleTester.as
@@ -21,7 +21,7 @@ package flexUnitTests
     import flexUnitTests.mxroyale.*
     
     [Suite]
-    [RunWith("org.flexunit.runners.Suite")]
+    [RunWith("org.apache.royale.test.runners.SuiteRunner")]
     /**
      * @royalesuppresspublicvarwarning
      */
@@ -29,12 +29,15 @@ package flexUnitTests
     {
         public function MXRoyaleTester()
         {
-            // for JS, force-link these classes in the output
-//            var arr:Array = [XMLTesterGeneralTest, XMLTesterStringifyTest, 
XMLListTesterGeneralTest, XMLNamespaceTest];
-        }
+           }
         
         
         public var objectUtilTest:ObjectUtilTest;
-       
+        public var flexSDK_ObjectUtilTests:FlexSDK_ObjectUtil_Tests;
+        public var 
flexSDK_ObjectUtil_FLEX_34852_Tests:FlexSDK_ObjectUtil_FLEX_34852_Tests;
+        public var 
flexSDK_ObjectUtil_Compare_Tests:FlexSDK_ObjectUtil_Compare_Tests;
+        
     }
+    
+    
 }
diff --git 
a/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as
new file mode 100644
index 0000000..fe2e50a
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as
@@ -0,0 +1,187 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.mxroyale
+{
+   // import testshim.RoyaleUnitTestRunner;
+    
+    import org.apache.royale.test.asserts.assertEquals;
+    
+    import org.apache.royale.test.asserts.assertFalse;
+    import org.apache.royale.test.asserts.assertTrue;
+    
+    import mx.utils.*;
+    
+    public class FlexSDK_ObjectUtil_Compare_Tests
+    {
+        private static const A_SMALLER_THAN_B:int = -1;
+        private static const A_LARGER_THAN_B:int = 1;
+        private static const A_EQUAL_TO_B:int = 0;
+    
+        [Test]
+        public function 
test_object_is_smaller_when_first_property_smaller_even_if_second_property_larger():void
+        {
+            //given
+           // var objectA:Object = {propertyA:1, propertyB:23};
+           // var objectB:Object = {propertyA:45, propertyB:2};
+    
+            var objectA:Object = {'propertyA':1, 'propertyB':23};
+            var objectB:Object = {'propertyA':45, 'propertyB':2};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_object_is_larger_when_first_property_larger_even_if_second_property_smaller():void
+        {
+            //given
+           // var objectA:Object = {propertyA:45, propertyB:2};
+           // var objectB:Object = {propertyA:1, propertyB:23};
+    
+            var objectA:Object = {'propertyA':45, 'propertyB':2};
+            var objectB:Object = {'propertyA':1, 'propertyB':23};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_LARGER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_object_is_smaller_even_when_common_properties_equal_but_missing_extra_properties():void
+        {
+            //given
+            //var objectA:Object = {propertyA:45};
+            //var objectB:Object = {propertyA:45, propertyB:2};
+    
+            var objectA:Object = {'propertyA':45};
+            var objectB:Object = {'propertyA':45, 'propertyB':2};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_object_is_smaller_even_when_common_property_larger_but_missing_extra_properties():void
+        {
+            //given
+            //var objectA:Object = {propertyA:46};
+            //var objectB:Object = {propertyA:45, propertyB:2};
+    
+            var objectA:Object = {'propertyA':46};
+            var objectB:Object = {'propertyA':45, 'propertyB':2};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_sealed_class_instance_larger_than_anonymous_object_with_same_properties_and_same_values():void
+        {
+            //given
+            var objectA:PersonVO = new PersonVO("John", 23);
+            var objectB:Object = {name:"John", age:23};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_LARGER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_sealed_class_instance_larger_than_dynamic_class_instance_with_same_properties_and_same_values():void
+        {
+            //given
+            var objectA:PersonVO = new PersonVO("John", 23);
+            var objectB:DynamicPersonVO = new DynamicPersonVO("John", 23);
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_LARGER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function test_null_and_undefined_are_seen_equal():void
+        {
+            //given
+            //var objectA:Object = {propertyA:45, propertyB:null};
+            //var objectB:Object = {propertyA:45, propertyB:undefined};
+    
+            var objectA:Object = {'propertyA':45, 'propertyB':null};
+            var objectB:Object = {'propertyA':45, 'propertyB':undefined};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_EQUAL_TO_B, compareResult);
+        }
+    
+        [Test]
+        public function test_NaN_seen_larger_than_largest_number():void
+        {
+            //given
+            //var objectA:Object = {propertyA:Number.MAX_VALUE};
+           // var objectB:Object = {propertyA:NaN};
+    
+            var objectA:Object = {'propertyA':Number.MAX_VALUE};
+            var objectB:Object = {'propertyA':NaN};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    }
+}
+
+class PersonVO
+{
+    public var name:String;
+    public var age:uint;
+    
+    public function PersonVO(name:String, age:uint)
+    {
+        this.name = name;
+        this.age = age;
+    }
+}
+
+dynamic class DynamicPersonVO extends PersonVO
+{
+    public function DynamicPersonVO(name:String, age:uint)
+    {
+        super(name, age);
+    }
+}
+
diff --git 
a/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_FLEX_34852_Tests.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_FLEX_34852_Tests.as
new file mode 100644
index 0000000..517076f
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_FLEX_34852_Tests.as
@@ -0,0 +1,165 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.mxroyale
+{
+    import flexUnitTests.mxroyale.support.TestClass3;
+    
+    //import testshim.RoyaleUnitTestRunner;
+    
+    
+    import org.apache.royale.test.asserts.assertEquals;
+    import org.apache.royale.test.asserts.assertTrue;
+    
+    import mx.utils.*;
+    
+    public class FlexSDK_ObjectUtil_FLEX_34852_Tests
+    {
+    
+        [Test]
+        public function test_getValue_for_two_field_path_non_fileprivate():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:TestClass3 = new TestClass3(index, "SomeObject", 
streetPrefix);
+        
+            //when
+            var streetName:String = ObjectUtil.getValue(obj, ["address", 
"street"]) as String;
+        
+            //then
+            assertEquals(streetPrefix + index, streetName);
+        }
+    
+        [Test]
+        public function test_getValue_for_one_field_path_non_fileprivate():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:TestClass3 = new TestClass3(index, "SomeObject", 
streetPrefix);
+        
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address"]);
+        
+            //then
+            assertEquals(obj.address, result);
+        }
+        
+        
+        
+        [Test]
+        public function test_getValue_for_two_field_path():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:ObjectUtil_FLEX_34852_VO = new 
ObjectUtil_FLEX_34852_VO(index, "SomeObject", streetPrefix);
+            
+            //when
+            var streetName:String = ObjectUtil.getValue(obj, ["address", 
"street"]) as String;
+            
+            //then
+            assertEquals(streetPrefix + index, streetName);
+        }
+        
+        [Test]
+        public function test_getValue_for_one_field_path():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:ObjectUtil_FLEX_34852_VO = new 
ObjectUtil_FLEX_34852_VO(index, "SomeObject", streetPrefix);
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address"]);
+            
+            //then
+            assertEquals(obj.address, result);
+        }
+        
+        [Test]
+        public function 
test_getValue_for_zero_field_path_returns_parameter():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(1, 
"SomeObject", "Street no. ");
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, null);
+            
+            //then
+            assertEquals(obj, result);
+        }
+        
+        [Test]
+        public function test_getValue_for_null_object_returns_undefined():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = null;
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address", "street"]);
+            
+            //then
+            assertTrue(result === undefined);
+        }
+        
+        [Test]
+        public function test_getValue_for_wrong_path_returns_undefined():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(1, 
"SomeObject", "Street no. ");
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address", "name"]);
+            
+            //then
+            assertTrue(result === undefined);
+        }
+    }
+}
+
+class ObjectUtil_FLEX_34852_VO
+{
+    [Bindable]
+    public var name:String;
+    
+    [Bindable]
+    public var address:ObjectUtil_FLEX_34852_AddressVO;
+    
+    [Bindable]
+    public var index:Number;
+    
+    public function ObjectUtil_FLEX_34852_VO(index:Number, namePrefix:String, 
streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new ObjectUtil_FLEX_34852_AddressVO(streetPrefix + 
index);
+    }
+}
+
+class ObjectUtil_FLEX_34852_AddressVO
+{
+    [Bindable]
+    public var street:String;
+    
+    public function ObjectUtil_FLEX_34852_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
diff --git 
a/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Tests.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Tests.as
new file mode 100644
index 0000000..e86f66f
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Tests.as
@@ -0,0 +1,374 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.mxroyale
+{
+    //import testshim.RoyaleUnitTestRunner;
+    
+    COMPILE::SWF{
+        import flash.utils.Dictionary;
+        import flash.utils.Proxy;
+    }
+    
+    
+
+    import org.apache.royale.test.asserts.assertEquals;
+    
+    import org.apache.royale.test.asserts.assertFalse;
+    import org.apache.royale.test.asserts.assertTrue;
+    
+    import mx.utils.*;
+    
+    public class FlexSDK_ObjectUtil_Tests
+    {
+        
//--------------------------------------------------------------------------
+        //
+        //  isDynamicObject()
+        //
+        
//--------------------------------------------------------------------------
+        
+        [Test]
+        public function 
test_dynamic_class_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_class_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject({name:"John"}));
+        }
+        
+        [Test]
+        public function test_array_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject([]));
+        }
+        
+        [Test]
+        public function test_XML_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new XML()));
+        }
+        
+        [Test]
+        public function 
test_Proxy_instance_recognized_as_sealed_object_instance():void
+        {
+            //then
+            COMPILE::SWF{
+                assertFalse(ObjectUtil.isDynamicObject(new Proxy()));
+            }
+            COMPILE::JS{
+                const ProxyClass:Object = window['Proxy'];
+                /*if (ProxyClass)
+                    assertFalse(ObjectUtil.isDynamicObject(new ProxyClass()));
+                else {
+                    assertTrue(false, "this browser target does not have 
native Proxy support");
+                }*/
+                //@todo
+                assertTrue(true, 'Proxy not yet emulated on JS');
+            }
+        }
+        
+        [Test]
+        public function 
test_ObjectProxy_with_implicit_target_object_instance_recognized_as_dynamic_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new ObjectProxy()));
+        }
+        
+        [Test]
+        public function 
test_ObjectProxy_with_explicit_target_object_instance_recognized_as_dynamic_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new ObjectProxy({})));
+        }
+        
+        [Test]
+        public function 
test_dictionary_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            COMPILE::SWF{
+                assertTrue(ObjectUtil.isDynamicObject(new Dictionary()));
+            }
+            COMPILE::JS{
+                assertTrue(ObjectUtil.isDynamicObject(new Map()));
+            }
+        }
+        
+        [Test]
+        public function 
test_sealed_class_instance_recognized_as_non_dynamic_object():void
+        {
+            //then
+            assertFalse(ObjectUtil.isDynamicObject(new NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function test_null_does_not_throw_fatal():void
+        {
+            //then
+            assertFalse(ObjectUtil.isDynamicObject(null));
+        }
+        
+        
//--------------------------------------------------------------------------
+        //
+        //  getEnumerableProperties()
+        //
+        
//--------------------------------------------------------------------------
+        
+        [Test]
+        public function test_enumerable_properties_of_anonymous_object():void
+        {
+            //given
+            //var object:Object = {name:"John", age:32}; // Does not survive 
minification in JS
+            var object:Object = {'name':"John", 'age':32}; //Safe on JS and SWF
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+           // 
RoyaleUnitTestRunner.consoleOut('test_enumerable_properties_of_anonymous_object:'+enumerableProperties.join(','))
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["age", "name"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_null():void
+        {
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(null);
+            
+            //then
+            assertEquals(0, enumerableProperties.length);
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_dictionary():void
+        {
+            //given
+            COMPILE::SWF{
+                var object:Dictionary = new Dictionary(false);
+                object["name"] = "John";
+                object["age"] = 9;
+            }
+            COMPILE::JS{
+                var object:Map = new Map();
+                object.set("name", "John");
+                object.set("age", 9);
+            }
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["age", "name"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function 
test_enumerable_properties_of_dynamic_class_instance():void
+        {
+            //given
+            var object:DynamicVO = new DynamicVO("John");
+            object["age"] = 9;
+            object["height"] = 6.1;
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["height", "age"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_associative_array():void
+        {
+            //given
+            var object:Array = [];
+            object["age"] = 9;
+            object["name"] = "John";
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["age", "name"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_indexed_array():void
+        {
+            //given
+            var object:Array = [9, "John"];
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
//RoyaleUnitTestRunner.consoleOut('test_enumerable_properties_of_indexed_array 
:'+enumerableProperties.join(","))
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch([0, 1], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function 
test_enumerable_properties_of_manually_indexed_array():void
+        {
+            //given
+            var object:Array = [];
+            object[3] = 9;
+            object[5] = "John";
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch([3, 5], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function 
test_enumerable_properties_of_sealed_class_instance():void
+        {
+            //given
+            var object:Object = new NonDynamicVO("John");
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertEquals(0, enumerableProperties.length);
+        }
+        
+        
+        
//--------------------------------------------------------------------------
+        //
+        //  valuesAreSubsetOfObject()
+        //
+        
//--------------------------------------------------------------------------
+        
+        [Test]
+        public function 
test_empty_anonymous_object_is_subset_of_empty_anonymous_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({}, {}));
+        }
+        
+        [Test]
+        public function 
test_empty_anonymous_object_is_subset_of_sealed_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({}, new 
NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_empty_anonymous_object_is_subset_of_dynamic_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({}, new 
DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_same_name_is_subset_of_similar_dynamic_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({name:"John"}, new 
DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_same_properties_and_values_is_subset_of_similar_dynamic_class_instance_with_one_property_manually_set():void
+        {
+            //given
+            var john:DynamicVO = new DynamicVO("John");
+            john.age = 23;
+            john.height = 6;
+            
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({name:"John", 
age:23}, john));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_different_name_is_not_subset_of_similar_dynamic_class_instance():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject({name:"Max"}, new 
DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_same_name_is_subset_of_similar_sealed_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({name:"John"}, new 
NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_different_name_is_not_subset_of_similar_sealed_class_instance():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject({name:"Max"}, new 
NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_extra_property_is_not_subset_of_similar_sealed_class_instance():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject({name:"Max", 
age:23}, new NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function test_sealed_object_is_a_subset_of_itself():void
+        {
+            //given
+            var max:NonDynamicVO = new NonDynamicVO("Max");
+            
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject(max, max));
+        }
+        
+        [Test]
+        public function 
test_sealed_object_is_not_a_subset_of_similar_dynamic_object():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject(new 
NonDynamicVO("Max"), {name:"Max"}));
+        }
+        
+        [Test]
+        public function 
test_sealed_object_is_not_a_subset_of_similar_sealed_object():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject(new 
NonDynamicVO("Max"), new NonDynamicVO("Max")));
+        }
+    }
+}
+
+dynamic class DynamicVO
+{
+    public var name:String;
+    
+    public function DynamicVO(name:String)
+    {
+        this.name = name;
+    }
+}
+
+class NonDynamicVO
+{
+    public var name:String;
+    
+    public function NonDynamicVO(name:String)
+    {
+        this.name = name;
+    }
+}
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
similarity index 98%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
index 7e6a4e9..7c2bc51 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
@@ -24,7 +24,7 @@ package flexUnitTests.mxroyale
     
     import org.apache.royale.test.asserts.*;
     import flexUnitTests.mxroyale.support.*;
-    import testshim.RoyaleUnitTestRunner;
+    //import testshim.RoyaleUnitTestRunner;
     
     
     COMPILE::SWF
@@ -355,7 +355,14 @@ package flexUnitTests.mxroyale
                     '  myVar = "publicMyVar"'),
                     'Unexpected ObjectUtil.toString result');
         }
+    
+    
+        /*[Test]
+        public function testCloning():void{
+            var item:TestClass6 = new TestClass6();
         
+            
+        }*/
         
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass1.as
similarity index 74%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass1.as
index 533d3f2..6b7bcd5 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass1.as
@@ -20,16 +20,26 @@ package flexUnitTests.mxroyale.support
 {
 
     
-    public class TestClass4 extends TestClass3
+    public class TestClass1
     {
         //Note: do not change this test class unless you change the related 
tests to
-        //support any changes that might appear when testing reflection into it
-        
-        public function TestClass4()
+        //support any changes that might appear when testing against it
+        public function TestClass1()
         {
         
         }
         
+       /* private function get something():Boolean{
+            return true;
+        }*/
+    
+        private function get something():Boolean{
+            return true;
+        }
+        
+        public function set something(value:Boolean):void{
+            
+        }
         
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass2.as
similarity index 73%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass2.as
index 533d3f2..c30f07b 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass2.as
@@ -20,16 +20,26 @@ package flexUnitTests.mxroyale.support
 {
 
     
-    public class TestClass4 extends TestClass3
+    public class TestClass2 extends TestClass1
     {
         //Note: do not change this test class unless you change the related 
tests to
-        //support any changes that might appear when testing reflection into it
+        //support any changes that might appear when testing against it
         
-        public function TestClass4()
+        public function TestClass2()
         {
         
         }
+    
+       public function get something():Boolean{
+            return true;
+        }
+        
+        /*override internal function set something(value:Boolean):void{
         
+        }*/
+      /*  private function set something(value:Boolean):void{
         
+        }*/
+       
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass3.as
similarity index 70%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass3.as
index 533d3f2..22e652d 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass3.as
@@ -20,16 +20,25 @@ package flexUnitTests.mxroyale.support
 {
 
     
-    public class TestClass4 extends TestClass3
+    
+    public class TestClass3
     {
-        //Note: do not change this test class unless you change the related 
tests to
-        //support any changes that might appear when testing reflection into it
-        
-        public function TestClass4()
+    
+        [Bindable]
+        public var name:String;
+    
+        [Bindable]
+        public var address:TestClass4;
+    
+        [Bindable]
+        public var index:Number;
+    
+    
+        public function TestClass3(index:Number, namePrefix:String, 
streetPrefix:String)
         {
-        
+            this.index = index;
+            this.name = namePrefix + index;
+            this.address = new TestClass4(streetPrefix + index);
         }
-        
-        
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass4.as
similarity index 84%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass4.as
index 7076653..106a956 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass4.as
@@ -20,10 +20,15 @@ package flexUnitTests.mxroyale.support
 {
 
     
-    
-    public class TestClass3 extends TestClass1
+    public class TestClass4
     {
+        [Bindable]
+        public var street:String;
     
     
+        public function TestClass4(street:String)
+        {
+            this.street = street;
+        }
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass5.as
similarity index 93%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass5.as
index 533d3f2..b0e8ac1 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass5.as
@@ -18,14 +18,14 @@
 
////////////////////////////////////////////////////////////////////////////////
 package flexUnitTests.mxroyale.support
 {
-
     
-    public class TestClass4 extends TestClass3
+    
+    public class TestClass5
     {
         //Note: do not change this test class unless you change the related 
tests to
         //support any changes that might appear when testing reflection into it
         
-        public function TestClass4()
+        public function TestClass5()
         {
         
         }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass6.as
similarity index 54%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass6.as
index 533d3f2..67bd69f 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/TestClass6.as
@@ -18,18 +18,55 @@
 
////////////////////////////////////////////////////////////////////////////////
 package flexUnitTests.mxroyale.support
 {
-
     
-    public class TestClass4 extends TestClass3
+    import flexUnitTests.mxroyale.support.testnamespace;
+    
+    /**
+     * @royalesuppresspublicvarwarning
+     */
+    public class TestClass6
     {
         //Note: do not change this test class unless you change the related 
tests to
         //support any changes that might appear when testing reflection into it
         
-        public function TestClass4()
+        public function TestClass6()
         {
         
         }
         
         
+        public var myVar:String = 'publicMyVar';
+        
+        testnamespace var myVar:String = 'testnamespaceMyVar';
+        
+        public function myMethod():String{
+            return 'public myMethod';
+        }
+    
+        testnamespace function myMethod():String{
+            return 'testnamespace myMethod';
+        }
+    
+        private var _v:String = 'public accessor';
+        public function get myAccessor():String{
+            return _v;
+        }
+    
+        public function set myAccessor(value:String):void{
+            _v = value;
+        }
+        
+        private var _v2:String = 'testnamespace accessor';
+        testnamespace function get myAccessor():String{
+            return _v2;
+        }
+    
+        testnamespace function set myAccessor(value:String):void{
+            _v2 = value;
+        }
+        
+        
     }
+    
+    
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/testnamespace.as
similarity index 92%
copy from 
manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
copy to 
frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/testnamespace.as
index 7076653..752aae1 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
+++ 
b/frameworks/projects/MXRoyale/src/test/royale/flexUnitTests/mxroyale/support/testnamespace.as
@@ -18,12 +18,9 @@
 
////////////////////////////////////////////////////////////////////////////////
 package flexUnitTests.mxroyale.support
 {
-
-    
     
-    public class TestClass3 extends TestClass1
-    {
     
-    
-    }
+
+    public namespace testnamespace = 'http://testnamespace.com/mxroyale';
+   
 }
diff --git 
a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDynamicFields.as
 
b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDynamicFields.as
index d7e633d..37a70fc 100644
--- 
a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDynamicFields.as
+++ 
b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDynamicFields.as
@@ -43,11 +43,14 @@ package org.apache.royale.reflection {
         *        could improve performance in performance-sensitive code.
         *        The results of calling this method on non-dynamic objects may 
be less reliable or less consistent
         *        across target platforms if checkFirst is false
+        * @param numericFields if true, numeric fields will be returned as 
numeric values
         *
         * @return the dynamic fields as Strings in an Array
+        *
+        * @royaleignorecoercion Map
         */
        COMPILE::JS
-       public function getDynamicFields(inspect:Object, 
includePredicate:Function = null, checkFirst:Boolean = true):Array {
+       public function getDynamicFields(inspect:Object, 
includePredicate:Function = null, checkFirst:Boolean = true, 
numericFields:Boolean = false):Array {
                var arr:Array;
                var i:uint = 0;
                var assumeDynamic:Boolean = checkFirst ? 
isDynamicObject(inspect) : true;
@@ -150,6 +153,15 @@ package org.apache.royale.reflection {
                                                while (l--) {
                                                        
excludeFields.push(instanceExcludes[l]);
                                                }
+                                       } else {
+                                               if (inspect.constructor == Map) 
{
+                                                       arr = [];
+                                                       (inspect as 
Map).forEach(
+                                                               
function(value:Object, key:Object, inst:Map):void{
+                                                                       
arr.push(key);
+                                                               }
+                                                       )
+                                               }
                                        }
                                        
                                        if (excludeFields) {
@@ -166,6 +178,14 @@ package org.apache.royale.reflection {
                                if (checkIncludes) {
                                        arr = arr.filter(includePredicate);
                                }
+                               if (numericFields) {
+                                       //arr.forEach(numericise)
+                                       arr.forEach(function (value:String, 
index:uint, array:Array):void{
+                                               var numVal:Number = 
Number(value);
+                                               if (''+numVal == value) 
array[index]=numVal;
+                                       })
+                                       
+                               }
                } else {
                        //it's not considered dynamic...
                        //so assume zero dynamic fields (even if technically in 
js
@@ -177,17 +197,23 @@ package org.apache.royale.reflection {
        }
        
        COMPILE::SWF
-       public function getDynamicFields(inspect:Object, 
includePredicate:Function = null, checkFirst:Boolean = true):Array {
+       public function getDynamicFields(inspect:Object, 
includePredicate:Function = null, checkFirst:Boolean = true, 
numericFields:Boolean = false):Array {
                
                var i:uint = 0;
                var assumeDynamic:Boolean = checkFirst ? 
isDynamicObject(inspect) : true;
                var checkIncludes:Boolean = includePredicate != null;
-               var prop:String;
                var arr:Array = [];
                if (assumeDynamic) {
-                       for (prop in inspect) {
-                               if (!checkIncludes || includePredicate(prop))
-                                       arr[i++] = prop;
+                       if (numericFields) {
+                               for (var propObj:Object in inspect) {
+                                       if (!checkIncludes || 
includePredicate(propObj))
+                                               arr[i++] = propObj;
+                               }
+                       } else {
+                               for (var prop:String in inspect) {
+                                       if (!checkIncludes || 
includePredicate(prop))
+                                               arr[i++] = prop;
+                               }
                        }
                }
                
@@ -195,3 +221,11 @@ package org.apache.royale.reflection {
        }
        
 }
+
+
+/*COMPILE::JS{
+       function numericise(value:String, index:uint, array:Array):void{
+               var numVal:Number = Number(value);
+               if (''+numVal == value) array[index]=numVal;
+       }
+}*/
diff --git 
a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/isDynamicObject.as
 
b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/isDynamicObject.as
index 6e1348e..8a1bf7a 100644
--- 
a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/isDynamicObject.as
+++ 
b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/isDynamicObject.as
@@ -60,11 +60,13 @@ COMPILE::SWF
                        }
             if (constructor) {
                 //instance
-                if (constructor === Object || constructor === Array) return 
true;
+                if (constructor === Object || constructor === Array || 
constructor == Map) return true;
                                var prototype:Object = constructor.prototype;
                 if (prototype && prototype.ROYALE_CLASS_INFO) {
-                    return 
Boolean(prototype.ROYALE_CLASS_INFO.names[0].isDynamic);
+                                       var name:Object = 
prototype.ROYALE_CLASS_INFO.names[0];
+                    return name.qName == 'XML' || name.qName == "XMLList" || 
Boolean(prototype.ROYALE_CLASS_INFO.names[0].isDynamic);
                 }
+                               //@todo this needs work in js... swf logic not 
applicable here:
                                var dyncheck:Boolean = false;
                                try {
                
diff --git a/frameworks/projects/XML/src/test/royale/build.xml 
b/frameworks/projects/XML/src/test/royale/build.xml
index 98b4945..d509f87 100644
--- a/frameworks/projects/XML/src/test/royale/build.xml
+++ b/frameworks/projects/XML/src/test/royale/build.xml
@@ -95,7 +95,12 @@
         <!-- because targets that run before royaleUnitTasks.jar gets built 
would fail. -->
         <taskdef resource="royaleUnitTasks.tasks" classpathref="lib.path"/>
                <mkdir dir="${report.dir}" />
-               <royaleunit
+        <!-- Use the env var if it is set, otherwise default to 'system' flash 
debugger  -->
+        <condition property="command" value="${env.FLASHPLAYER_DEBUGGER}" 
else="">
+            <isset property="env.FLASHPLAYER_DEBUGGER" />
+        </condition>
+        <royaleunit
+            command="${command}"
             swf="${basedir}/FlexUnitRoyaleApplication.swf"
                    workingDir="${basedir}"
                    toDir="${report.dir}"
diff --git a/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as
index e2e2b0c..7057fe8 100644
--- a/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as
+++ b/frameworks/projects/XML/src/test/royale/flexUnitTests/XMLTester.as
@@ -40,7 +40,7 @@ package flexUnitTests
     
         public var xmlListTesterGeneralTest:XMLListTesterGeneralTest;
     
-        //public var xmlNamespaceTest:XMLNamespaceTest;
+        public var xmlNamespaceTest:XMLNamespaceTest;
     
         public var xmlNamespaceClassTest:XMLNamespaceClassTest;
     
diff --git 
a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLNamespaceTest.as 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLNamespaceTest.as
index 2946c06..c8a2f00 100644
--- 
a/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLNamespaceTest.as
+++ 
b/frameworks/projects/XML/src/test/royale/flexUnitTests/xml/XMLNamespaceTest.as
@@ -90,21 +90,52 @@ package flexUnitTests.xml
         {
         }
     
+    
+        public function getPlayerVersion():Number{
+            COMPILE::SWF{
+                import flash.system.Capabilities;
+                var parts:Array = Capabilities.version.split(' 
')[1].split(',');
+                return Number( parts[0]+'.'+parts[1])
+            }
+            //something for js, indicating javascript 'playerversion' is 
consistent with more recent flash player versions:
+            return 30;
+        }
+        
+    
         [Test]
+        [TestVariance(variance="SWF",description="Standalone players on 
Windows between 11.2 and 20.0 were verified to have incorrect results with 
'default xml namespace' in certain cases")]
         public function testMinimalDefault():void{
             default xml namespace = 'test';
             var xml:XML = <root/>;
             
             var ns:Namespace = xml.namespace();
-            assertStrictlyEquals(ns.prefix, undefined, 'unexpected prefix 
value');
-            assertEquals(ns.uri, 'test', 'unexpected uri value from specific 
default namespace');
+            var playerVersion:Number = getPlayerVersion();
+            //account for what appears to be a player bug in a range of player 
versions (not verified on Mac)
+            // Javascript conforms to the latest swf behavior
+            
+            var permitEmptyString:Boolean  = /*playerVersion >= 11.2 &&*/ 
playerVersion <= 20.0;
+            var prefix:* = ns.prefix;
+            var testIsOK:Boolean = permitEmptyString ? prefix === '' || prefix 
=== undefined : prefix === undefined;
+            
+            //assertStrictlyEquals(ns.prefix, undefined, 'unexpected prefix 
value ');
+            assertTrue(testIsOK, 'unexpected prefix value ');
+            
+            var uri:String = ns.uri;
+            testIsOK = permitEmptyString ? uri == '' || uri == 'test' : uri == 
'test';
+            //assertEquals(ns.uri, 'test', 'unexpected uri value from specific 
default namespace');
+            assertTrue(testIsOK, 'unexpected uri value from specific default 
namespace');
             
             //try top level function
             xml = XML('<root/>');
             ns= xml.namespace();
-            assertStrictlyEquals(ns.prefix, undefined, 'unexpected prefix 
value');
-            assertEquals(ns.uri, 'test', 'unexpected uri value from specific 
default namespace');
-            
+            prefix = ns.prefix;
+            testIsOK = permitEmptyString ? prefix === '' || prefix === 
undefined : prefix === undefined;
+            //assertStrictlyEquals(ns.prefix, undefined, 'unexpected prefix 
value');
+            assertTrue(testIsOK, 'unexpected prefix value ');
+            uri = ns.uri;
+            testIsOK = permitEmptyString ? uri == '' || uri == 'test' : uri == 
'test';
+            //assertEquals(ns.uri, 'test', 'unexpected uri value from specific 
default namespace');
+            assertTrue(testIsOK, 'unexpected uri value from specific default 
namespace');
         }
         
     
@@ -138,12 +169,6 @@ package flexUnitTests.xml
         
         
         
-        //private var atom:Namespace = ATOM_NS;
-        
-        
-        
-        
-        
         
         
         [Test]
@@ -438,8 +463,7 @@ package flexUnitTests.xml
             assertEquals(unusualLinks.length(),0, 'unexpected results from 
private namespace based descendants query');
             /* RoyaleUnitTestRunner.consoleOut('descendants private Links');
              RoyaleUnitTestRunner.consoleOut(unusualLinks.toString());*/
-        
-        
+            
         }
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as
index 7f34909..08edb08 100644
--- a/manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as
+++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/MXRoyaleTester.as
@@ -29,12 +29,15 @@ package flexUnitTests
     {
         public function MXRoyaleTester()
         {
-            // for JS, force-link these classes in the output
-//            var arr:Array = [XMLTesterGeneralTest, XMLTesterStringifyTest, 
XMLListTesterGeneralTest, XMLNamespaceTest];
-        }
+           }
         
         
         public var objectUtilTest:ObjectUtilTest;
-       
+        public var flexSDK_ObjectUtilTests:FlexSDK_ObjectUtil_Tests;
+        public var 
flexSDK_ObjectUtil_FLEX_34852_Tests:FlexSDK_ObjectUtil_FLEX_34852_Tests;
+        public var 
flexSDK_ObjectUtil_Compare_Tests:FlexSDK_ObjectUtil_Compare_Tests;
+        
     }
+    
+    
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as
new file mode 100644
index 0000000..f45c5b0
--- /dev/null
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Compare_Tests.as
@@ -0,0 +1,187 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.mxroyale
+{
+    import testshim.RoyaleUnitTestRunner;
+    
+    import org.apache.royale.test.asserts.assertEquals;
+    
+    import org.apache.royale.test.asserts.assertFalse;
+    import org.apache.royale.test.asserts.assertTrue;
+    
+    import mx.utils.*;
+    
+    public class FlexSDK_ObjectUtil_Compare_Tests
+    {
+        private static const A_SMALLER_THAN_B:int = -1;
+        private static const A_LARGER_THAN_B:int = 1;
+        private static const A_EQUAL_TO_B:int = 0;
+    
+        [Test]
+        public function 
test_object_is_smaller_when_first_property_smaller_even_if_second_property_larger():void
+        {
+            //given
+           // var objectA:Object = {propertyA:1, propertyB:23};
+           // var objectB:Object = {propertyA:45, propertyB:2};
+    
+            var objectA:Object = {'propertyA':1, 'propertyB':23};
+            var objectB:Object = {'propertyA':45, 'propertyB':2};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_object_is_larger_when_first_property_larger_even_if_second_property_smaller():void
+        {
+            //given
+           // var objectA:Object = {propertyA:45, propertyB:2};
+           // var objectB:Object = {propertyA:1, propertyB:23};
+    
+            var objectA:Object = {'propertyA':45, 'propertyB':2};
+            var objectB:Object = {'propertyA':1, 'propertyB':23};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_LARGER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_object_is_smaller_even_when_common_properties_equal_but_missing_extra_properties():void
+        {
+            //given
+            //var objectA:Object = {propertyA:45};
+            //var objectB:Object = {propertyA:45, propertyB:2};
+    
+            var objectA:Object = {'propertyA':45};
+            var objectB:Object = {'propertyA':45, 'propertyB':2};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_object_is_smaller_even_when_common_property_larger_but_missing_extra_properties():void
+        {
+            //given
+            //var objectA:Object = {propertyA:46};
+            //var objectB:Object = {propertyA:45, propertyB:2};
+    
+            var objectA:Object = {'propertyA':46};
+            var objectB:Object = {'propertyA':45, 'propertyB':2};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_sealed_class_instance_larger_than_anonymous_object_with_same_properties_and_same_values():void
+        {
+            //given
+            var objectA:PersonVO = new PersonVO("John", 23);
+            var objectB:Object = {name:"John", age:23};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_LARGER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function 
test_sealed_class_instance_larger_than_dynamic_class_instance_with_same_properties_and_same_values():void
+        {
+            //given
+            var objectA:PersonVO = new PersonVO("John", 23);
+            var objectB:DynamicPersonVO = new DynamicPersonVO("John", 23);
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_LARGER_THAN_B, compareResult);
+        }
+    
+        [Test]
+        public function test_null_and_undefined_are_seen_equal():void
+        {
+            //given
+            //var objectA:Object = {propertyA:45, propertyB:null};
+            //var objectB:Object = {propertyA:45, propertyB:undefined};
+    
+            var objectA:Object = {'propertyA':45, 'propertyB':null};
+            var objectB:Object = {'propertyA':45, 'propertyB':undefined};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_EQUAL_TO_B, compareResult);
+        }
+    
+        [Test]
+        public function test_NaN_seen_larger_than_largest_number():void
+        {
+            //given
+            //var objectA:Object = {propertyA:Number.MAX_VALUE};
+           // var objectB:Object = {propertyA:NaN};
+    
+            var objectA:Object = {'propertyA':Number.MAX_VALUE};
+            var objectB:Object = {'propertyA':NaN};
+        
+            //when
+            var compareResult:int = ObjectUtil.compare(objectA, objectB);
+        
+            //then
+            assertEquals(A_SMALLER_THAN_B, compareResult);
+        }
+    }
+}
+
+class PersonVO
+{
+    public var name:String;
+    public var age:uint;
+    
+    public function PersonVO(name:String, age:uint)
+    {
+        this.name = name;
+        this.age = age;
+    }
+}
+
+dynamic class DynamicPersonVO extends PersonVO
+{
+    public function DynamicPersonVO(name:String, age:uint)
+    {
+        super(name, age);
+    }
+}
+
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_FLEX_34852_Tests.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_FLEX_34852_Tests.as
new file mode 100644
index 0000000..3084959
--- /dev/null
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_FLEX_34852_Tests.as
@@ -0,0 +1,165 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.mxroyale
+{
+    import flexUnitTests.mxroyale.support.TestClass3;
+    
+    import testshim.RoyaleUnitTestRunner;
+    
+    
+    import org.apache.royale.test.asserts.assertEquals;
+    import org.apache.royale.test.asserts.assertTrue;
+    
+    import mx.utils.*;
+    
+    public class FlexSDK_ObjectUtil_FLEX_34852_Tests
+    {
+    
+        [Test]
+        public function test_getValue_for_two_field_path_non_fileprivate():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:TestClass3 = new TestClass3(index, "SomeObject", 
streetPrefix);
+        
+            //when
+            var streetName:String = ObjectUtil.getValue(obj, ["address", 
"street"]) as String;
+        
+            //then
+            assertEquals(streetPrefix + index, streetName);
+        }
+    
+        [Test]
+        public function test_getValue_for_one_field_path_non_fileprivate():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:TestClass3 = new TestClass3(index, "SomeObject", 
streetPrefix);
+        
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address"]);
+        
+            //then
+            assertEquals(obj.address, result);
+        }
+        
+        
+        
+        [Test]
+        public function test_getValue_for_two_field_path():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:ObjectUtil_FLEX_34852_VO = new 
ObjectUtil_FLEX_34852_VO(index, "SomeObject", streetPrefix);
+            
+            //when
+            var streetName:String = ObjectUtil.getValue(obj, ["address", 
"street"]) as String;
+            
+            //then
+            assertEquals(streetPrefix + index, streetName);
+        }
+        
+        [Test]
+        public function test_getValue_for_one_field_path():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:ObjectUtil_FLEX_34852_VO = new 
ObjectUtil_FLEX_34852_VO(index, "SomeObject", streetPrefix);
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address"]);
+            
+            //then
+            assertEquals(obj.address, result);
+        }
+        
+        [Test]
+        public function 
test_getValue_for_zero_field_path_returns_parameter():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(1, 
"SomeObject", "Street no. ");
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, null);
+            
+            //then
+            assertEquals(obj, result);
+        }
+        
+        [Test]
+        public function test_getValue_for_null_object_returns_undefined():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = null;
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address", "street"]);
+            
+            //then
+            assertTrue(result === undefined);
+        }
+        
+        [Test]
+        public function test_getValue_for_wrong_path_returns_undefined():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(1, 
"SomeObject", "Street no. ");
+            
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address", "name"]);
+            
+            //then
+            assertTrue(result === undefined);
+        }
+    }
+}
+
+class ObjectUtil_FLEX_34852_VO
+{
+    [Bindable]
+    public var name:String;
+    
+    [Bindable]
+    public var address:ObjectUtil_FLEX_34852_AddressVO;
+    
+    [Bindable]
+    public var index:Number;
+    
+    public function ObjectUtil_FLEX_34852_VO(index:Number, namePrefix:String, 
streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new ObjectUtil_FLEX_34852_AddressVO(streetPrefix + 
index);
+    }
+}
+
+class ObjectUtil_FLEX_34852_AddressVO
+{
+    [Bindable]
+    public var street:String;
+    
+    public function ObjectUtil_FLEX_34852_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Tests.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Tests.as
new file mode 100644
index 0000000..689fdbb
--- /dev/null
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/FlexSDK_ObjectUtil_Tests.as
@@ -0,0 +1,374 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.mxroyale
+{
+    import testshim.RoyaleUnitTestRunner;
+    
+    COMPILE::SWF{
+        import flash.utils.Dictionary;
+        import flash.utils.Proxy;
+    }
+    
+    
+
+    import org.apache.royale.test.asserts.assertEquals;
+    
+    import org.apache.royale.test.asserts.assertFalse;
+    import org.apache.royale.test.asserts.assertTrue;
+    
+    import mx.utils.*;
+    
+    public class FlexSDK_ObjectUtil_Tests
+    {
+        
//--------------------------------------------------------------------------
+        //
+        //  isDynamicObject()
+        //
+        
//--------------------------------------------------------------------------
+        
+        [Test]
+        public function 
test_dynamic_class_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_class_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject({name:"John"}));
+        }
+        
+        [Test]
+        public function test_array_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject([]));
+        }
+        
+        [Test]
+        public function test_XML_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new XML()));
+        }
+        
+        [Test]
+        public function 
test_Proxy_instance_recognized_as_sealed_object_instance():void
+        {
+            //then
+            COMPILE::SWF{
+                assertFalse(ObjectUtil.isDynamicObject(new Proxy()));
+            }
+            COMPILE::JS{
+                const ProxyClass:Object = window['Proxy'];
+                /*if (ProxyClass)
+                    assertFalse(ObjectUtil.isDynamicObject(new ProxyClass()));
+                else {
+                    assertTrue(false, "this browser target does not have 
native Proxy support");
+                }*/
+                //@todo
+                assertTrue(true, 'Proxy not yet emulated on JS');
+            }
+        }
+        
+        [Test]
+        public function 
test_ObjectProxy_with_implicit_target_object_instance_recognized_as_dynamic_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new ObjectProxy()));
+        }
+        
+        [Test]
+        public function 
test_ObjectProxy_with_explicit_target_object_instance_recognized_as_dynamic_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.isDynamicObject(new ObjectProxy({})));
+        }
+        
+        [Test]
+        public function 
test_dictionary_instance_recognized_as_dynamic_object():void
+        {
+            //then
+            COMPILE::SWF{
+                assertTrue(ObjectUtil.isDynamicObject(new Dictionary()));
+            }
+            COMPILE::JS{
+                assertTrue(ObjectUtil.isDynamicObject(new Map()));
+            }
+        }
+        
+        [Test]
+        public function 
test_sealed_class_instance_recognized_as_non_dynamic_object():void
+        {
+            //then
+            assertFalse(ObjectUtil.isDynamicObject(new NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function test_null_does_not_throw_fatal():void
+        {
+            //then
+            assertFalse(ObjectUtil.isDynamicObject(null));
+        }
+        
+        
//--------------------------------------------------------------------------
+        //
+        //  getEnumerableProperties()
+        //
+        
//--------------------------------------------------------------------------
+        
+        [Test]
+        public function test_enumerable_properties_of_anonymous_object():void
+        {
+            //given
+            //var object:Object = {name:"John", age:32}; // Does not survive 
minification in JS
+            var object:Object = {'name':"John", 'age':32}; //Safe on JS and SWF
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
RoyaleUnitTestRunner.consoleOut('test_enumerable_properties_of_anonymous_object:'+enumerableProperties.join(','))
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["age", "name"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_null():void
+        {
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(null);
+            
+            //then
+            assertEquals(0, enumerableProperties.length);
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_dictionary():void
+        {
+            //given
+            COMPILE::SWF{
+                var object:Dictionary = new Dictionary(false);
+                object["name"] = "John";
+                object["age"] = 9;
+            }
+            COMPILE::JS{
+                var object:Map = new Map();
+                object.set("name", "John");
+                object.set("age", 9);
+            }
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["age", "name"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function 
test_enumerable_properties_of_dynamic_class_instance():void
+        {
+            //given
+            var object:DynamicVO = new DynamicVO("John");
+            object["age"] = 9;
+            object["height"] = 6.1;
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["height", "age"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_associative_array():void
+        {
+            //given
+            var object:Array = [];
+            object["age"] = 9;
+            object["name"] = "John";
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch(["age", "name"], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function test_enumerable_properties_of_indexed_array():void
+        {
+            //given
+            var object:Array = [9, "John"];
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
RoyaleUnitTestRunner.consoleOut('test_enumerable_properties_of_indexed_array 
:'+enumerableProperties.join(","))
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch([0, 1], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function 
test_enumerable_properties_of_manually_indexed_array():void
+        {
+            //given
+            var object:Array = [];
+            object[3] = 9;
+            object[5] = "John";
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertTrue(ArrayUtil.arrayValuesMatch([3, 5], 
enumerableProperties));
+        }
+        
+        [Test]
+        public function 
test_enumerable_properties_of_sealed_class_instance():void
+        {
+            //given
+            var object:Object = new NonDynamicVO("John");
+            
+            //when
+            var enumerableProperties:Array = 
ObjectUtil.getEnumerableProperties(object);
+            
+            //then
+            assertEquals(0, enumerableProperties.length);
+        }
+        
+        
+        
//--------------------------------------------------------------------------
+        //
+        //  valuesAreSubsetOfObject()
+        //
+        
//--------------------------------------------------------------------------
+        
+        [Test]
+        public function 
test_empty_anonymous_object_is_subset_of_empty_anonymous_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({}, {}));
+        }
+        
+        [Test]
+        public function 
test_empty_anonymous_object_is_subset_of_sealed_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({}, new 
NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_empty_anonymous_object_is_subset_of_dynamic_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({}, new 
DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_same_name_is_subset_of_similar_dynamic_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({name:"John"}, new 
DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_same_properties_and_values_is_subset_of_similar_dynamic_class_instance_with_one_property_manually_set():void
+        {
+            //given
+            var john:DynamicVO = new DynamicVO("John");
+            john.age = 23;
+            john.height = 6;
+            
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({name:"John", 
age:23}, john));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_different_name_is_not_subset_of_similar_dynamic_class_instance():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject({name:"Max"}, new 
DynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_same_name_is_subset_of_similar_sealed_class_instance():void
+        {
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject({name:"John"}, new 
NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_different_name_is_not_subset_of_similar_sealed_class_instance():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject({name:"Max"}, new 
NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function 
test_anonymous_object_with_extra_property_is_not_subset_of_similar_sealed_class_instance():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject({name:"Max", 
age:23}, new NonDynamicVO("John")));
+        }
+        
+        [Test]
+        public function test_sealed_object_is_a_subset_of_itself():void
+        {
+            //given
+            var max:NonDynamicVO = new NonDynamicVO("Max");
+            
+            //then
+            assertTrue(ObjectUtil.valuesAreSubsetOfObject(max, max));
+        }
+        
+        [Test]
+        public function 
test_sealed_object_is_not_a_subset_of_similar_dynamic_object():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject(new 
NonDynamicVO("Max"), {name:"Max"}));
+        }
+        
+        [Test]
+        public function 
test_sealed_object_is_not_a_subset_of_similar_sealed_object():void
+        {
+            //then
+            assertFalse(ObjectUtil.valuesAreSubsetOfObject(new 
NonDynamicVO("Max"), new NonDynamicVO("Max")));
+        }
+    }
+}
+
+dynamic class DynamicVO
+{
+    public var name:String;
+    
+    public function DynamicVO(name:String)
+    {
+        this.name = name;
+    }
+}
+
+class NonDynamicVO
+{
+    public var name:String;
+    
+    public function NonDynamicVO(name:String)
+    {
+        this.name = name;
+    }
+}
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
index 7e6a4e9..21818db 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/ObjectUtilTest.as
@@ -355,7 +355,14 @@ package flexUnitTests.mxroyale
                     '  myVar = "publicMyVar"'),
                     'Unexpected ObjectUtil.toString result');
         }
+    
+    
+        [Test]
+        public function testCloning():void{
+            var item:TestClass6 = new TestClass6();
         
+            
+        }
         
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
index 7076653..22e652d 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass3.as
@@ -21,9 +21,24 @@ package flexUnitTests.mxroyale.support
 
     
     
-    public class TestClass3 extends TestClass1
+    public class TestClass3
     {
     
+        [Bindable]
+        public var name:String;
     
+        [Bindable]
+        public var address:TestClass4;
+    
+        [Bindable]
+        public var index:Number;
+    
+    
+        public function TestClass3(index:Number, namePrefix:String, 
streetPrefix:String)
+        {
+            this.index = index;
+            this.name = namePrefix + index;
+            this.address = new TestClass4(streetPrefix + index);
+        }
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
index 533d3f2..106a956 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/mxroyale/support/TestClass4.as
@@ -20,16 +20,15 @@ package flexUnitTests.mxroyale.support
 {
 
     
-    public class TestClass4 extends TestClass3
+    public class TestClass4
     {
-        //Note: do not change this test class unless you change the related 
tests to
-        //support any changes that might appear when testing reflection into it
-        
-        public function TestClass4()
+        [Bindable]
+        public var street:String;
+    
+    
+        public function TestClass4(street:String)
         {
-        
+            this.street = street;
         }
-        
-        
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/network/AMFBinaryDataTesterTest.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/network/AMFBinaryDataTesterTest.as
index c5ce6f6..3a30bc0 100644
--- 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/network/AMFBinaryDataTesterTest.as
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/network/AMFBinaryDataTesterTest.as
@@ -545,9 +545,13 @@ package flexUnitTests.network
             ba.writeObject(test);
             ba.position = 0;
             assertEquals(ba.length, 50, 'unexpected serialized content with 
custom namespaces')
+            //cover variation in order
+            const validOptions:Array = [
+                    
'0a23010b6d79566172156d794163636573736f7206177075626c69634d79566172061f7075626c6963206163636573736f72',
+                    
'0a2301156d794163636573736f720b6d79566172061f7075626c6963206163636573736f7206177075626c69634d79566172'
+            ];
             
-            assertEquals(getBytesOut(ba),
-                    
'0a2301156d794163636573736f720b6d79566172061f7075626c6963206163636573736f7206177075626c69634d79566172','unexpected
 byte content with custom namespace content')
+            assertTrue(validOptions.indexOf(getBytesOut(ba)) != -1, 
'unexpected byte content with custom namespace content');
             
             var restored:Object = ba.readObject();
             

Reply via email to