This is an automated email from the ASF dual-hosted git repository. gregdove pushed a commit to branch improvements/Language in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit b20dccedeae6c0689c160325d2b80d2b0664755e Author: greg-dove <[email protected]> AuthorDate: Sun May 19 17:35:37 2019 +1200 Updates and tweaks to XML. Port adhoc tests and add new XML tests (97 assertions for XML) to UnitTests manualtest --- .../projects/Language/src/main/royale/QName.as | 3 +- frameworks/projects/XML/src/main/royale/XML.as | 3 +- manualtests/UnitTests/build.xml | 20 +- manualtests/UnitTests/pom.xml | 27 +- .../src/main/config/compile-app-config.xml | 17 +- .../UnitTests/src/main/royale/MyInitialView.mxml | 66 +- .../UnitTests/src/main/royale/TestClasses.as | 3 +- .../UnitTests/src/main/royale/UnitTests.mxml | 13 +- .../language/LanguageTesterTestVector.as | 238 ++++--- .../flexUnitTests/xml/XMLTesterGeneralTest.as | 699 ++++++++++++++++++--- .../flexUnitTests/xml/XMLTesterStringifyTest.as | 114 +++- .../main/royale/testshim/RoyaleUnitTestRunner.as | 36 +- manualtests/UnitTests/testsview/index.html | 2 +- manualtests/build_example.xml | 20 +- 14 files changed, 1021 insertions(+), 240 deletions(-) diff --git a/frameworks/projects/Language/src/main/royale/QName.as b/frameworks/projects/Language/src/main/royale/QName.as index a0199ef..cdb01eb 100644 --- a/frameworks/projects/Language/src/main/royale/QName.as +++ b/frameworks/projects/Language/src/main/royale/QName.as @@ -117,12 +117,13 @@ package COMPILE::JS public function equals(name:QName):Boolean { - return this.uri == name.uri && this.localName == name.localName; // this.prefix == name.prefix && + return name != null && this.uri == name.uri && this.localName == name.localName; // this.prefix == name.prefix && } COMPILE::JS public function matches(name:QName):Boolean { + if (name == null) return this.localName == "*"; if(this.uri == "*" || name.uri == "*") return this.localName == "*" || name.localName == "*" || this.localName == name.localName; diff --git a/frameworks/projects/XML/src/main/royale/XML.as b/frameworks/projects/XML/src/main/royale/XML.as index 01229c2..f0ae94f 100644 --- a/frameworks/projects/XML/src/main/royale/XML.as +++ b/frameworks/projects/XML/src/main/royale/XML.as @@ -817,9 +817,10 @@ package else { len = childrenLength(); + var all:Boolean = propertyName.localName == "*"; for(i=0;i<len;i++) { - if(propertyName.matches(_children[i].name())) + if(all || propertyName.matches(_children[i].name())) list.append(_children[i]); } } diff --git a/manualtests/UnitTests/build.xml b/manualtests/UnitTests/build.xml index 55b9a7d..e4fbad5 100644 --- a/manualtests/UnitTests/build.xml +++ b/manualtests/UnitTests/build.xml @@ -22,11 +22,12 @@ <project name="UnitTests" default="main" basedir="."> <property name="ROYALE_HOME" location="../.."/> <property name="example" value="UnitTests" /> - <!-- adding flexuint style meta collection, and additional testing meta tags (Event,Bindable,TestMeta)--> - <property name="theme_arg" value="-keep-as3-metadata+=Test,BeforeClass,AfterClass,Before,After,TestVariance,Event,Bindable,TestMeta" /> + <!--<property name="theme_arg" value="-keep-as3-metadata+=Test,BeforeClass,AfterClass,Before,After,TestVariance,Event,Bindable,TestMeta" />--> + <property name="theme_arg" value="-keep-code-with-metadata=Test,BeforeClass,AfterClass,Before,After,TestVariance,TestMeta" /> <!-- adding flexuint style meta collection, and additional testing meta tags (Event,Bindable,TestMeta)--> - <property name="extlib_arg" value="-keep-code-with-metadata=Test,BeforeClass,AfterClass,Before,After,TestVariance,TestMeta" /> + <!--<property name="extlib_arg" value="-keep-code-with-metadata=Test,BeforeClass,AfterClass,Before,After,TestVariance,TestMeta" />--> + <property name="swf.version" value="30" /> <property file="${ROYALE_HOME}/env.properties"/> <property environment="env"/> @@ -35,16 +36,19 @@ <!-- make ant src and output consistent with maven --> <property name="maven_compat" value="true"/> - + <!--<property name="swf.version" value="30" /> + <property name="playerglobal.version" value="19" />--> + <property name="destDir" value="${basedir}/target/swf"/> + <property name="html_template_base" value="${basedir}/src/main/resources" /> <include file="${basedir}/../build_example.xml" /> - <target name="main" depends="clean,build_example.compile" description="Clean build of ${example}"> + <target name="main" depends="clean" description="Clean build of ${example}"> + <antcall target="build_example.compile"> + <param name="debug" value="false"/> + </antcall> </target> <target name="clean"> - <delete dir="${basedir}/bin" failonerror="false" /> - <delete dir="${basedir}/bin-debug" failonerror="false" /> - <delete dir="${basedir}/bin-release" failonerror="false" /> <delete dir="${basedir}/target" failonerror="false" /> </target> diff --git a/manualtests/UnitTests/pom.xml b/manualtests/UnitTests/pom.xml index 43f0f66..a411728 100644 --- a/manualtests/UnitTests/pom.xml +++ b/manualtests/UnitTests/pom.xml @@ -52,15 +52,22 @@ <artifactId>royale-maven-plugin</artifactId> <extensions>true</extensions> <configuration> - <targets>SWF</targets> + <targets>SWF,JSRoyale</targets> <mainClass>${project.artifactId}.mxml</mainClass> <removeCirculars>true</removeCirculars> - <debug>true</debug> - <additionalCompilerOptions>-swf-version=18;-keep-as3-metadata+=Test,BeforeClass,AfterClass,Before,After,TestVariance,Event,Bindable,TestMeta</additionalCompilerOptions> - <outputDirectory>${basedir}/target/bin-debug</outputDirectory> - <flashOutputFileName>${project.artifactId}.swf</flashOutputFileName> + <debug>false</debug> + <additionalCompilerOptions> + -swf-version=30; + -js-default-initializers; + -source-map=true; + -keep-as3-metadata+=Test,BeforeClass,AfterClass,Before,After,TestVariance,Event,Bindable,TestMeta; + -keep-code-with-metadata=Test,BeforeClass,AfterClass,Before,After,TestVariance,TestMeta; + </additionalCompilerOptions> + <outputDirectory>${basedir}/target</outputDirectory> + <flashOutputFileName>swf/${project.artifactId}.swf</flashOutputFileName> + <javascriptOutputDirectoryName>javascript</javascriptOutputDirectoryName> </configuration> - <executions> + <!--<executions> <execution> <id>compile-js</id> <phase>process-sources</phase> @@ -75,7 +82,7 @@ <outputDirectory>${basedir}/target</outputDirectory> </configuration> </execution> - </executions> + </executions>--> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> @@ -88,7 +95,7 @@ <goal>copy-resources</goal> </goals> <configuration> - <outputDirectory>${basedir}/target/bin-debug</outputDirectory> + <outputDirectory>${basedir}/target/swf</outputDirectory> <includeEmptyDirs>true</includeEmptyDirs> <resources> <resource> @@ -112,8 +119,8 @@ <goal>rename</goal> </goals> <configuration> - <sourceFile>${basedir}/target/bin-debug/index.template.html</sourceFile> - <destinationFile>${basedir}/target/bin-debug/${project.artifactId}.html</destinationFile> + <sourceFile>${basedir}/target/swf/index.template.html</sourceFile> + <destinationFile>${basedir}/target/swf/${project.artifactId}.html</destinationFile> </configuration> </execution> </executions> diff --git a/manualtests/UnitTests/src/main/config/compile-app-config.xml b/manualtests/UnitTests/src/main/config/compile-app-config.xml index 8774ac7..9e40011 100644 --- a/manualtests/UnitTests/src/main/config/compile-app-config.xml +++ b/manualtests/UnitTests/src/main/config/compile-app-config.xml @@ -17,10 +17,25 @@ --> <royale-config> - <js-output-optimization> + <!-- + <js-output-optimization> <optimization>skipFunctionCoercions</optimization> </js-output-optimization> + --> <js-default-initializers>true</js-default-initializers> + <swf-version>30</swf-version> + <source-map>true</source-map> <compiler> + <keep-as3-metadata append="true"> + <name>Test</name> + <name>BeforeClass</name> + <name>AfterClass</name> + <name>Before</name> + <name>After</name> + <name>TestVariance</name> + <name>Event</name> + <name>Bindable</name> + <name>TestMeta</name> + </keep-as3-metadata> </compiler> </royale-config> diff --git a/manualtests/UnitTests/src/main/royale/MyInitialView.mxml b/manualtests/UnitTests/src/main/royale/MyInitialView.mxml index d927fe5..32eaa9e 100644 --- a/manualtests/UnitTests/src/main/royale/MyInitialView.mxml +++ b/manualtests/UnitTests/src/main/royale/MyInitialView.mxml @@ -25,15 +25,31 @@ limitations under the License. > <fx:Style> - .title { + + @namespace "library://ns.apache.org/royale/basic"; + Label { font-size: 16px; + font-family: sans-serif; + } + + .title { font-weight: bold; + font-family: sans-serif; } - .body { + + .output { + top:50px; + bottom: 5px; + display: flex; + flex-direction: column; + position: absolute; + overflow-y: scroll; + font-family: sans-serif; + font-size: 16px; left:10px; right:10px; - font-family: sans-serif; } + .royale .Label { white-space: pre-wrap !important; } @@ -50,11 +66,29 @@ limitations under the License. import testshim.RoyaleUnitTestRunner; import testshim.TestResult; + //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 ''; + } private var _tests:Array; public function runTests():void { + setPlatform(); + RoyaleUnitTestRunner.swfVersion = getSwfVersion(); var label:Label; var groups:Array = TestClasses.testClasses; var spaces:String = PLATFORM == "JS" ? "\u00A0\u00A0\u00A0" : " "; @@ -162,27 +196,37 @@ limitations under the License. } - private static function getPlatform():String { + private function setPlatform():void { var platform:String; + var variant:String; COMPILE::JS{ - platform = "JS"; + PLATFORM = "JS"; + variant = ' '; } COMPILE::SWF{ - platform = "SWF"; + PLATFORM = "SWF"; + variant = ' [version:' + getSwfVersion()+'] '; } - return platform; + + PLATFORM_VARIANT = getPlayerVersion() ? variant + ' [player:'+getPlayerVersion()+'] ' : variant; } - public static const PLATFORM:String = getPlatform(); + [Bindable] + public var PLATFORM:String; + + [Bindable] + public var PLATFORM_VARIANT:String = ''; ]]> </fx:Script> <js:beads> <js:ViewDataBinding/> </js:beads> - <js:Group id="cont" height="50" className="body"> - <js:Label text="{PLATFORM} Cross-compiled Unit Tests" className="title" /> + <js:Group localId="cont" height="50" className="header"> + <js:Label text="{PLATFORM}{PLATFORM_VARIANT}Cross-compiled Unit Tests" className="title" /> </js:Group> - <js:Group id="output" height="700" y="50" className="body"> + <js:Group localId="output" + y="50" + className="output"> <js:beads> <js:VerticalFlexLayout /> </js:beads> diff --git a/manualtests/UnitTests/src/main/royale/TestClasses.as b/manualtests/UnitTests/src/main/royale/TestClasses.as index e96a3d9..e112fc9 100644 --- a/manualtests/UnitTests/src/main/royale/TestClasses.as +++ b/manualtests/UnitTests/src/main/royale/TestClasses.as @@ -32,7 +32,8 @@ package ReflectionTester, ObservedBugsTester, GithubIssuesTester, - NetworkTester + NetworkTester, + XMLTester ]; } } diff --git a/manualtests/UnitTests/src/main/royale/UnitTests.mxml b/manualtests/UnitTests/src/main/royale/UnitTests.mxml index 3d088dd..57564e3 100644 --- a/manualtests/UnitTests/src/main/royale/UnitTests.mxml +++ b/manualtests/UnitTests/src/main/royale/UnitTests.mxml @@ -28,12 +28,23 @@ @namespace js "library://ns.apache.org/royale/basic"; js|Application { background-color:#ffffff ; + position:absolute; + top:0; + bottom:0; + left:0; + right:0; } + + .view{ + width: 100%; + height: 100%; + } + </fx:Style> <js:valuesImpl> <js:SimpleCSSValuesImpl /> </js:valuesImpl> <js:initialView> - <local:MyInitialView /> + <local:MyInitialView className="view" /> </js:initialView> </js:Application> diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestVector.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestVector.as index 7231610..0e7652e 100644 --- a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestVector.as +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestVector.as @@ -22,6 +22,8 @@ package flexUnitTests.language import flexunit.framework.Assert; import flexUnitTests.language.support.*; + import testshim.RoyaleUnitTestRunner; + /** * @royalesuppresspublicvarwarning */ @@ -29,6 +31,20 @@ package flexUnitTests.language { public static var isJS:Boolean; + + + public static function hasInsertAtRemoveAt():Boolean{ + //this checks the build for swf-version that has insertAt/removeAt support in Vector + COMPILE::SWF{ + //see; http://fpdownload.macromedia.com/pub/labs/flashruntimes/shared/air19_flashplayer19_releasenotes.pdf + // "Please use swf-version 30 or greater and namespace 19.0 or greater to access the new APIs." + return RoyaleUnitTestRunner.swfVersion >= 30; + } + COMPILE::JS { + //always supported + return true + } + } [BeforeClass] public static function setUpBeforeClass():void @@ -199,6 +215,7 @@ package flexUnitTests.language } [Test] + [TestVariance(variance="SWF",description="SWF tests for insertAt/removeAt are not run when swf version<30")] public function testFixedVectorBasicMethods():void { var nested:Vector.<Vector.<TestClass1>> = new Vector.<Vector.<TestClass1>>(20, false); @@ -246,26 +263,33 @@ package flexUnitTests.language } Assert.assertTrue('Unexpected Vector check', caughtError); - try - { - caughtError = false; - nested.removeAt(0); - } catch (e:Error) - { - caughtError = e is RangeError - } - - Assert.assertTrue('Unexpected Vector check', caughtError); - try - { - caughtError = false; - nested.insertAt(0, null); - } catch (e:Error) - { - caughtError = e is RangeError + + if (hasInsertAtRemoveAt()) { + try + { + caughtError = false; + nested['removeAt'](0); + } catch (e:Error) + { + caughtError = e is RangeError + } + + Assert.assertTrue('Unexpected Vector check', caughtError); + + try + { + caughtError = false; + nested['insertAt'](0, null); + } catch (e:Error) + { + caughtError = e is RangeError + } + + Assert.assertTrue('Unexpected Vector check', caughtError); + } else { + RoyaleUnitTestRunner.consoleOut('Variance: The current target does not have support for Vector insertAt/removeAt methods', 'warn') } - Assert.assertTrue('Unexpected Vector check', caughtError); } [Test] @@ -343,6 +367,7 @@ package flexUnitTests.language } [Test] + [TestVariance(variance="SWF",description="SWF tests for insertAt/removeAt are not run when swf version<30")] public function testVectorAdvancedMethods():void { @@ -364,98 +389,105 @@ package flexUnitTests.language Assert.assertTrue('Unexpected Vector check', vcustom3[0] is TestClass1); Assert.assertTrue('Unexpected Vector check', vcustom2[1] is TestClass2); - vcustom3.insertAt(0, new TestClass2()); - Assert.assertTrue('Unexpected Vector check', vcustom3.length == 2); - Assert.assertTrue('Unexpected Vector check', vcustom3[0] is TestClass2); - Assert.assertTrue('Unexpected Vector check', vcustom3[1] is TestClass1); - var removedItem:* = vcustom3.removeAt(0); - Assert.assertTrue('Unexpected Vector check', vcustom3.length == 1); - Assert.assertTrue('Unexpected Vector check', vcustom3[0] is TestClass1); - Assert.assertTrue('Unexpected Vector check', removedItem is TestClass2); + if (hasInsertAtRemoveAt()) { + vcustom3['insertAt'](0, new TestClass2()); + Assert.assertTrue('Unexpected Vector check', vcustom3.length == 2); + Assert.assertTrue('Unexpected Vector check', vcustom3[0] is TestClass2); + Assert.assertTrue('Unexpected Vector check', vcustom3[1] is TestClass1); - var tc1Vec:Vector.<TestClass1> = new Vector.<TestClass1>(4); + var removedItem:* = vcustom3['removeAt'](0); + Assert.assertTrue('Unexpected Vector check', vcustom3.length == 1); + Assert.assertTrue('Unexpected Vector check', vcustom3[0] is TestClass1); + Assert.assertTrue('Unexpected Vector check', removedItem is TestClass2); - //insert at invalid index: - tc1Vec.insertAt(6, new TestClass1()); - //no error, insertAt minimises the specified index to the Vector's length and inserts there - Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 5); - Assert.assertTrue('Unexpected Vector check', tc1Vec[4] is TestClass1); - - var caughtError:Boolean; - try - { - caughtError = false; - tc1Vec.removeAt(6); - } catch (e:Error) - { - caughtError = e is RangeError - } + var tc1Vec:Vector.<TestClass1> = new Vector.<TestClass1>(4); - try - { - caughtError = false; - tc1Vec.removeAt(-1); - } catch (e:Error) - { - caughtError = e is RangeError - } - Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 4); - Assert.assertEquals('Unexpected Vector check', 'null,null,null,null', tc1Vec.toString()); - //no error - Assert.assertFalse('Unexpected Vector check', caughtError); + //insert at invalid index: + tc1Vec['insertAt'](6, new TestClass1()); + //no error, insertAt minimises the specified index to the Vector's length and inserts there + Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 5); + Assert.assertTrue('Unexpected Vector check', tc1Vec[4] is TestClass1); - try - { - caughtError = false; - tc1Vec.insertAt(-1, new TestClass1()); - } catch (e:Error) - { - caughtError = e is RangeError - } + var caughtError:Boolean; + try + { + caughtError = false; + tc1Vec['removeAt'](6); + } catch (e:Error) + { + caughtError = e is RangeError + } - Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 5); - //new item is at position 3 - Assert.assertNotNull('Unexpected Vector check', tc1Vec[3]); - //moving the original content (null) from position 3 to 4 - Assert.assertNull('Unexpected Vector check', tc1Vec[4]); - //no error - Assert.assertFalse('Unexpected Vector check', caughtError); - - try - { - caughtError = false; - //even though this is out of range, it still works without error - tc1Vec.insertAt(-200, new TestClass1()); - } catch (e:Error) - { - caughtError = e is RangeError - } - - Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 6); - //new item is at position 0 - Assert.assertNotNull('Unexpected Vector check', tc1Vec[0]); - //the other non-null item is now at postion 4 - Assert.assertNotNull('Unexpected Vector check', tc1Vec[4]); - //no error - Assert.assertFalse('Unexpected Vector check', caughtError); - - try - { - caughtError = false; - tc1Vec.removeAt(-200); - } catch (e:Error) - { - caughtError = e is RangeError; - } + try + { + caughtError = false; + tc1Vec['removeAt'](-1); + } catch (e:Error) + { + caughtError = e is RangeError + } + Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 4); + Assert.assertEquals('Unexpected Vector check', 'null,null,null,null', tc1Vec.toString()); + //no error + Assert.assertFalse('Unexpected Vector check', caughtError); - Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 5); - //position 0 is now null - Assert.assertNull('Unexpected Vector check', tc1Vec[0]); - //the non-null item is now at postion 3 - Assert.assertNotNull('Unexpected Vector check', tc1Vec[3]); - //no error - Assert.assertFalse('Unexpected Vector check', caughtError); + try + { + caughtError = false; + tc1Vec['insertAt'](-1, new TestClass1()); + } catch (e:Error) + { + caughtError = e is RangeError + } + + Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 5); + //new item is at position 3 + Assert.assertNotNull('Unexpected Vector check', tc1Vec[3]); + //moving the original content (null) from position 3 to 4 + Assert.assertNull('Unexpected Vector check', tc1Vec[4]); + //no error + Assert.assertFalse('Unexpected Vector check', caughtError); + + try + { + caughtError = false; + //even though this is out of range, it still works without error + tc1Vec['insertAt'](-200, new TestClass1()); + } catch (e:Error) + { + caughtError = e is RangeError + } + + Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 6); + //new item is at position 0 + Assert.assertNotNull('Unexpected Vector check', tc1Vec[0]); + //the other non-null item is now at postion 4 + Assert.assertNotNull('Unexpected Vector check', tc1Vec[4]); + //no error + Assert.assertFalse('Unexpected Vector check', caughtError); + + try + { + caughtError = false; + tc1Vec['removeAt'](-200); + } catch (e:Error) + { + caughtError = e is RangeError; + } + + Assert.assertTrue('Unexpected Vector check', tc1Vec.length == 5); + //position 0 is now null + Assert.assertNull('Unexpected Vector check', tc1Vec[0]); + //the non-null item is now at postion 3 + Assert.assertNotNull('Unexpected Vector check', tc1Vec[3]); + //no error + Assert.assertFalse('Unexpected Vector check', caughtError); + + } else { + RoyaleUnitTestRunner.consoleOut('Variance: The current target does not have support for Vector insertAt/removeAt methods, so these are untested', 'warn') + } + } diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterGeneralTest.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterGeneralTest.as index 9e941b5..356a024 100644 --- a/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterGeneralTest.as +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterGeneralTest.as @@ -22,11 +22,14 @@ package flexUnitTests.xml import flexunit.framework.Assert; - import org.apache.royale.reflection.*; - + import testshim.RoyaleUnitTestRunner; + /** + * @royalesuppresspublicvarwarning + */ public class XMLTesterGeneralTest { + public static var isJS:Boolean = COMPILE::JS; private var xmlStr:String; @@ -36,11 +39,24 @@ package flexUnitTests.xml private var text:String; private var xml2:XML; + private var settings:Object; + + public static function getSwfVersion():uint{ + COMPILE::SWF{ + return RoyaleUnitTestRunner.swfVersion; + } + COMPILE::JS { + //this mimics the version of the flash player that has xml toString support 'fixed' + return 21 + } + } [Before] public function setUp():void { - xmlStr = '<?xml version="1.0" encoding="UTF-8" ?>' + + settings = XML.settings(); + + xmlStr ='<?xml version="1.0" encoding="UTF-8" ?>' + '<catalog xmlns:fx="http://ns.adobe.com/mxml/2009"' + ' xmlns:dac="com.printui.view.components.DesignAreaComponents.*">' + '<' + '!' + '-' + '- just a comment -' + '-' + '>' + @@ -100,6 +116,8 @@ package flexUnitTests.xml xml = null; text = null; xml2 = null; + + XML.setSettings(settings); } [BeforeClass] @@ -116,23 +134,29 @@ package flexUnitTests.xml [Test] public function testSimpleAttributes():void { - var args:Array; - var j:int; - var m:int; - var list1:XMLList; - var list2:XMLList; - var list3:XMLList; - var list4:XMLList; + var xml1:XML = <foo baz="true"/>; Assert.assertTrue('<foo baz="true"/> should have attribute @baz', xml1.hasOwnProperty("@baz")); Assert.assertFalse('<foo baz="true"/> should not have attribute @foo', xml1.hasOwnProperty("@foo")); Assert.assertFalse('<foo baz="true"/> should not have attribute baz', xml1.hasOwnProperty("baz")); Assert.assertTrue('<foo baz="true"/> toXMLString should be <foo baz="true"/>', xml1.toXMLString() == '<foo baz="true"/>'); + Assert.assertTrue('[email protected]() should be "true"', [email protected]() == 'true'); + var baz:XMLList = xml1.@baz; - trace("baz: " + [email protected]() + " //true"); + Assert.assertTrue('baz.toString() should be "true"', baz.toString() == 'true'); + Assert.assertEquals('baz.length() should be 1', baz.length(),1); + var xml3:XML = <root/>; + xml3.bar.baz = "baz"; + xml3.foo.@boo = "boo"; + + Assert.assertEquals('xml3.bar.baz should be "baz"', xml3.bar.baz,'baz'); + Assert.assertEquals('xml3.foo.@boo should be "boo"', xml3.foo.@boo,'boo'); + } + + [Test] public function testSimpleXMLList():void @@ -143,37 +167,25 @@ package flexUnitTests.xml var xml3:XML = <root/>; xml3.bar.baz = "baz"; xml3.foo.@boo = "boo"; - trace(xml3.bar.baz) + Assert.assertEquals('toString value should be "baz" ', xml3.bar.baz.toString(), "baz"); Assert.assertEquals('toString value should be "boo" ', [email protected](), "boo"); - - //trace("baz: " + [email protected]() + " //true"); - - //trace("baz? " + xml3.bar.baz); - // trace("boo? " + xml3.foo.@boo); - var ampXML:XML = new XML("<Content>Bat & Ball</Content>"); - var amp2XML:XML = new XML("<Content>Bat & Ball</Content>"); - Assert.assertEquals('escaped ampersands should be equal" ', ampXML.toXMLString(), amp2XML.toXMLString()); - - Assert.assertTrue("ampersand should not be escaped", ampXML.toString().indexOf("&") == -1); - // trace(ampXML.toXMLString()); - // trace(amp2XML.toXMLString()); - // trace("escaped ampersands should be equal? " + (ampXML.toXMLString() == amp2XML.toXMLString())); - // trace("ampersand should not be escaped: " + ampXML.toString()); - var newContent:XML = <Content/>; newContent.Properties.Leading.@type = "string"; newContent.Properties.Leading = 36; - - trace("Leading should be @type=string: " + (newContent.Properties.Leading.@type == "string")); Assert.assertEquals("Leading should be @type=string", newContent.Properties.Leading.@type, "string"); - trace("Leading should be 36: " + newContent.Properties.Leading); Assert.assertStrictlyEquals("Leading should be 36", newContent.Properties.Leading.toString(), "36"); - + Assert.assertStrictlyEquals("unexpected toXMLString() value", + newContent.toXMLString(), + "<Content>\n" + + " <Properties>\n" + + " <Leading type=\"string\">36</Leading>\n" + + " </Properties>\n" + + "</Content>"); + newContent.Properties.Leading = 72; - trace("Leading should be 72: " + newContent.Properties.Leading); Assert.assertStrictlyEquals("Leading should be 72", newContent.Properties.Leading.toString(), "72"); } @@ -183,83 +195,296 @@ package flexUnitTests.xml public function testXMLMethods1():void { var xml1:XML = <foo baz="true"/>; - var child:XML = <pop> - <child name="Sam"/> - </pop>; + var child:XML = <pop><child name="Sam"/></pop>; xml1.appendChild(child); - child = <pop> - <child name="George"/> - </pop>; + child = <pop><child name="George"/></pop>; xml1.appendChild(child); Assert.assertTrue('unexpected child result', xml1.pop[0][email protected]() == 'Sam'); Assert.assertTrue('unexpected child result', xml1.pop[1][email protected]() == 'George'); - /*Greg: I think the above *should* output as: - - flexunit.framework.Assert.assertTrue('unexpected child result', xml1.child('pop')[0].child('child').attribute('name').toString() == 'Sam'); - flexunit.framework.Assert.assertTrue('unexpected child result', xml1.child('pop')[1].child('child').attribute('name').toString() == 'George'); - - but the "child('child')." part is currently outputting as "child." - - */ } - + + + [TestVariance(variance="JS", description="toLocaleString has a substantially different output in javascript")] + [TestVariance(variance="SWF", description="(observed) some of the XML methods for SWF had incorrect results before swf version 21")] [Test] public function testXMLMethods2():void { var xml1:XML = <foo baz="true"/>; var child:XML = <pop> - <child name="Sam"/> - </pop>; + <child name="Sam"/> + </pop>; xml1.appendChild(child); child = <pop> - <child name="George"/> - </pop>; + <child name="George"/> + </pop>; xml1.appendChild(child); + Assert.assertEquals('unexpected output with xml1.pop[0].toString()', + xml1.pop[0].toString(), + '<pop>\n' + + ' <child name="Sam"/>\n' + + '</pop>'); + Assert.assertEquals('unexpected output with xml1.pop[1].toString()', + xml1.pop[1].toString(), + '<pop>\n' + + ' <child name="George"/>\n' + + '</pop>'); - //trace(xml1.pop[0].toString()); - //trace(xml1.pop[1].toString()); + var pop:XMLList = xml1.pop; pop[pop.length()] = <pop> - <child name="Fred"/> - </pop>; - trace(pop.toString()); - trace(xml1.toString()); - pop[0] = <pop> - <child name="Fred"/> - </pop>; - trace(pop.toString()); - trace(xml1.toString()); - - var parent:XML = <parent/>; + <child name="Fred"/> + </pop>; + + Assert.assertEquals('unexpected output with pop.toString()', + pop.toString(), + '<pop>\n' + + ' <child name="Sam"/>\n' + + '</pop>\n' + + '<pop>\n' + + ' <child name="George"/>\n' + + '</pop>\n' + + '<pop>\n' + + ' <child name="Fred"/>\n' + + '</pop>'); + + Assert.assertEquals('unexpected output with xml1.toString()', + xml1.toString(), + '<foo baz="true">\n' + + ' <pop>\n' + + ' <child name="Sam"/>\n' + + ' </pop>\n' + + ' <pop>\n' + + ' <child name="George"/>\n' + + ' </pop>\n' + + ' <pop>\n' + + ' <child name="Fred"/>\n' + + ' </pop>\n' + + '</foo>'); + + + pop[0] = <pop> + <child name="Fred"/> + </pop>; + + Assert.assertEquals('unexpected output with pop.toString()', + pop.toString(), + '<pop>\n' + + ' <child name="Fred"/>\n' + + '</pop>\n' + + '<pop>\n' + + ' <child name="George"/>\n' + + '</pop>\n' + + '<pop>\n' + + ' <child name="Fred"/>\n' + + '</pop>'); + + Assert.assertEquals('unexpected output with xml1.toString()', + xml1.toString(), + '<foo baz="true">\n' + + ' <pop>\n' + + ' <child name="Fred"/>\n' + + ' </pop>\n' + + ' <pop>\n' + + ' <child name="George"/>\n' + + ' </pop>\n' + + ' <pop>\n' + + ' <child name="Fred"/>\n' + + ' </pop>\n' + + '</foo>'); + + //toLocaleString + //VARIANCE + + var expected:String = isJS + ? '<foo baz="true">\n' + + ' <pop>\n' + + ' <child name="Fred"/>\n' + + ' </pop>\n' + + ' <pop>\n' + + ' <child name="George"/>\n' + + ' </pop>\n' + + ' <pop>\n' + + ' <child name="Fred"/>\n' + + ' </pop>\n' + + '</foo>' //js + : '[object XML]';// swf + + Assert.assertEquals('unexpected output with xml1.toLocaleString()', + xml1.toLocaleString(), + expected); + + expected = isJS + ? '<pop>\n' + + ' <child name="Fred"/>\n' + + '</pop>\n' + + '<pop>\n' + + ' <child name="George"/>\n' + + '</pop>\n' + + '<pop>\n' + + ' <child name="Fred"/>\n' + + '</pop>' //js + : '[object XMLList]';//swf + + Assert.assertEquals('unexpected output with xml1.pop.toLocaleString()', + xml1.pop.toLocaleString(), + expected); + + + var parentXML:XML = <parent/>; var childXML:XML = <child/>; - parent.appendChild(childXML); - trace(childXML.toXMLString() + " is child of" + parent.toXMLString() + "? " + (childXML.parent() == parent)); + parentXML.appendChild(childXML); + Assert.assertTrue('child/parent relationship was unexpected', (childXML.parent() == parentXML)); + Assert.assertEquals('unexpected output following re-parenting', + parentXML.toXMLString(), + '<parent>\n' + + ' <child/>\n' + + '</parent>'); + var newParent:XML = <newparent/>; newParent.appendChild(childXML); - trace("moving to <newparent/>"); - trace(childXML.toXMLString() + " is child of" + parent.toXMLString() + "? " + (childXML.parent() == parent)); - trace(childXML.toXMLString() + " is child of" + newParent.toXMLString() + "? " + (childXML.parent() == newParent)); + + + if (getSwfVersion() < 21) { + //I think, a bug in old swf version, some 'remnant' of the old 'child' is still present in the'old' parent + expected = '<parent>\n' + + ' <child/>\n' + + '</parent>' + } else { + expected = '<parent/>'; + } + + Assert.assertEquals('unexpected output following re-parenting', + parentXML.toXMLString(), + expected); + + Assert.assertEquals('unexpected output following re-parenting', + newParent.toXMLString(), + '<newparent>\n' + + ' <child/>\n' + + '</newparent>'); + + Assert.assertFalse('child/parent relationship was unexpected', (childXML.parent() == parentXML)); + + var expectedLength:uint = getSwfVersion() < 21 ? 1 : 0; + //another bug in old swf version, some 'remnant' of the old 'child' is still present in the'old' parent + Assert.assertTrue('child/parent relationship was unexpected', (parentXML.children().length() == expectedLength)); + Assert.assertTrue('child/parent relationship was unexpected', (childXML.parent() == newParent)); + childXML = <Content>• <?ACE 7?>Some amazing content</Content>; var childXMLStr:String = childXML.text(); - trace(childXMLStr + " (should be) •Some amazing content? " + (childXMLStr == "•Some amazing content")); + + Assert.assertEquals(" (should be) •Some amazing content", childXMLStr, '•Some amazing content'); + } + [Test] + public function testInvalidAppendChild():void{ + var root:XML = new XML('test'); + root.appendChild('test'); + + Assert.assertEquals('testInvalidAppendChild 1 result is bad',root.toString(), 'test'); + Assert.assertEquals('testInvalidAppendChild 2 result is bad',root.toXMLString(), 'test'); + } + + [Test] + public function testAppendNonXMLChild():void{ + var root:XML = <root/>; + root.appendChild('test'); + + Assert.assertEquals('testAppendNonXMLChild 1 result is bad',root.toString(), 'test'); + Assert.assertEquals('testAppendNonXMLChild 2 result is bad',root.toXMLString(), '<root>test</root>'); + + root = <root><test><something/></test></root>; + root.appendChild('test'); + + Assert.assertEquals('testAppendNonXMLChild 3 result is bad', + root.toString(), + '<root>\n' + + ' <test>\n' + + ' <something/>\n' + + ' </test>\n' + + ' <test>test</test>\n' + + '</root>'); + + Assert.assertEquals('testAppendNonXMLChild 4 result is bad', + root.toXMLString(), + '<root>\n' + + ' <test>\n' + + ' <something/>\n' + + ' </test>\n' + + ' <test>test</test>\n' + + '</root>'); + } [Test] + public function testXMLNormalize():void{ + var xml:XML = <root/>; + xml.appendChild("test1"); + xml.appendChild("test2"); + xml.appendChild(<element/>); + xml.appendChild("test3"); + xml.appendChild("test4"); + + + Assert.assertEquals('testXMLNormalize 1 result is bad', + xml.toString(), + '<root>\n' + + ' test1\n' + + ' test2\n' + + ' <element/>\n' + + ' <element>test3</element>\n' + + ' <element>test4</element>\n' + + '</root>'); + + Assert.assertEquals('testXMLNormalize 2 result is bad', + xml.toXMLString(), + '<root>\n' + + ' test1\n' + + ' test2\n' + + ' <element/>\n' + + ' <element>test3</element>\n' + + ' <element>test4</element>\n' + + '</root>'); + + + xml.normalize(); + + Assert.assertEquals('testXMLNormalize 3 result is bad', + xml.toString(), + '<root>\n' + + ' test1test2\n' + + ' <element/>\n' + + ' <element>test3</element>\n' + + ' <element>test4</element>\n' + + '</root>'); + + Assert.assertEquals('testXMLNormalize 4 result is bad', + xml.toXMLString(), + '<root>\n' + + ' test1test2\n' + + ' <element/>\n' + + ' <element>test3</element>\n' + + ' <element>test4</element>\n' + + '</root>'); + + + } + + [Test] public function testSVG():void { - var svg:XML = <svg> - <group> - <rect id="1"/> - <rect id="2"/> - </group> - <group> - <rect id="3"/> - <rect id="4"/> - </group> - </svg>; + var svg:XML = <svg> + <group> + <rect id="1"/> + <rect id="2"/> + </group> + <group> + <rect id="3"/> + <rect id="4"/> + </group> + </svg>; var rects:XMLList = svg..rect; rects[1].@width = "100px"; @@ -271,8 +496,320 @@ package flexUnitTests.xml + '<rect id="3" height="100px"/>' + '\n' + '<rect id="4"/>'; - //trace(rects.toXMLString()); Assert.assertTrue('string output was unexpected', rects.toXMLString() == expected); } + + + [Test] + public function testChildList():void{ + var xml:XML = <root> asdasdas <element/> asdasqdasd<otherElement/></root>; + + + var list:XMLList = xml.*; + + //var list:XMLList = xml.child('*') + + Assert.assertEquals('Error in list length', 4, list.length()); + //trace(list.length()); + list = xml.element; + Assert.assertEquals('Error in list length', 1, list.length()); + //list = xml.child('element') + + // trace(list.length()) + list = xml.otherElement; + //list = xml.child('otherElement') + Assert.assertEquals('Error in list length', 1, list.length()); + + } + + + [Test] + public function testNamespaceRetrieval():void{ + var content:XML = <Document> + <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 " > + </x:xmpmeta> + </Document>; + + var namespace:Namespace = content.children()[0].namespace(); + Assert.assertEquals('Error in namespace prefix', namespace.prefix, 'x'); + Assert.assertEquals('Error in namespace uri', namespace.uri, 'adobe:ns:meta/'); + + } + + + [Test] + [TestVariance(variance="JS",description="Javascript does not support duplicate namespace declarations (Error thrown)")] + public function testNamespaceRetrieval2():void{ + var caughtError:Boolean; + try { + var content:XML = <Document> + <x:xmpmeta xmlns:x="adobe:ns:meta/" xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 " > + </x:xmpmeta> + </Document>; + } catch(e:Error) { + caughtError = true; + } + + if (isJS) { + caughtError = !caughtError; + } + Assert.assertFalse('Unexpected Error state with duplicate namespace declarations', caughtError); + + } + + [Test] + public function testDuplicateAttributesError():void{ + var caughtError:Boolean; + try { + var content:XML = <root myVal="something" myVal="somethingElse"/>; + } catch(e:Error) { + caughtError = true; + } + + Assert.assertTrue('Unexpected Error state with duplicate attribute declarations', caughtError); + + } + + [Test] + public function testParsingWhitespaceSetting1():void{ + var originalSetting:Boolean = XML.ignoreWhitespace; + XML.ignoreWhitespace = true; + var script:XML = <script> <![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]> </script>; + + Assert.assertEquals('unexpected children number after parsing',1, script.children().length()); + Assert.assertEquals('unexpected toString value after parsing', + '<script><![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]></script>', + script.toXMLString()); + + XML.ignoreWhitespace = false; + script = <script> <![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]> </script>; + Assert.assertEquals('unexpected children number after parsing',3, script.children().length()); + + + Assert.assertEquals('unexpected toString value after parsing', + '<script>\n' + + ' \n' + + ' <![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]>\n' + + ' \n' + + '</script>', + script.toXMLString()); + XML.ignoreWhitespace = originalSetting; + } + [Test] + public function testSingleProcessingInstructions():void{ + var original:Boolean = XML.ignoreProcessingInstructions; + XML.ignoreProcessingInstructions = true; + var xml:XML = new XML('<?bar foo?>'); + Assert.assertEquals('unexpected nodeKind with XML.ignoreProcessingInstructions = true', 'text', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreProcessingInstructions = true', '', xml.toXMLString()); + XML.ignoreProcessingInstructions = false; + xml = new XML('<?bar foo?>'); + Assert.assertEquals('unexpected nodeKind with XML.ignoreProcessingInstructions = false', 'processing-instruction', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreProcessingInstructions = false', '<?bar foo?>', xml.toXMLString()); + + XML.ignoreProcessingInstructions = original; + } + + + [Test] + public function testSingleCDATA():void{ + var original:Boolean = XML.ignoreWhitespace; + XML.ignoreWhitespace = true; + var xml:XML = new XML(' <![CDATA[ my cdata ]]> '); + Assert.assertEquals('unexpected cdata result with XML.ignoreWhitespace = true', 'text', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreWhitespace = true', '<![CDATA[ my cdata ]]>', xml.toXMLString()); + Assert.assertNull('unexpected name value with CDATA', xml.name()); + XML.ignoreWhitespace = false; + var caughtError:Boolean = false; + try { + xml = new XML(' <![CDATA[ my cdata ]]> '); + } catch(e:Error) { + caughtError = true; + } + + Assert.assertTrue('unexpected error status for single cdata string parsing with XML.ignoreWhitespace = false', caughtError); + + XML.ignoreWhitespace = original; + } + + + [Test] + public function testSingleText():void{ + var original:Boolean = XML.ignoreWhitespace; + XML.ignoreWhitespace = true; + var xml:XML = new XML(' my text '); + Assert.assertEquals('unexpected text result with XML.ignoreWhitespace = true', 'text', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreWhitespace = true', 'my text', xml.toXMLString()); + Assert.assertNull('unexpected name value with text', xml.name()); + XML.ignoreWhitespace = false; + var caughtError:Boolean = false; + try { + xml = new XML(' my text '); + } catch(e:Error) { + caughtError = true; + } + + Assert.assertFalse('unexpected error status for text string parsing with XML.ignoreWhitespace = false', caughtError); + Assert.assertEquals('unexpected text result with XML.ignoreWhitespace = true', 'text', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreWhitespace = true', ' my text ', xml.valueOf()); + XML.ignoreWhitespace = original; + } + + [Test] + public function testSingleComment():void{ + var original:Boolean = XML.ignoreWhitespace; + var originalComments:Boolean = XML.ignoreComments; + XML.ignoreWhitespace = true; + XML.ignoreComments = false; + var xml:XML = new XML(' <!-- my test comment --> '); + Assert.assertEquals('unexpected comment result with XML.ignoreWhitespace = true', 'comment', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreWhitespace = true', '<!-- my test comment -->', xml.toXMLString()); + Assert.assertNull('unexpected name value with text', xml.name()); + XML.ignoreWhitespace = false; + var caughtError:Boolean = false; + try { + xml = new XML(' <!-- my test comment --> '); + } catch(e:Error) { + caughtError = true; + } + + Assert.assertTrue('unexpected error status for comment parsing with XML.ignoreWhitespace = false', caughtError); + + xml = new XML('<!-- my test comment -->'); + Assert.assertNull('unexpected name value with comment', xml.name()); + + Assert.assertEquals('unexpected comment result with XML.ignoreWhitespace = true', 'comment', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreWhitespace = true', '<!-- my test comment -->', xml.toXMLString()); + XML.ignoreComments = true; + xml = new XML('<!-- my test comment -->'); + Assert.assertNull('unexpected name value with text', xml.name()); + + Assert.assertEquals('unexpected comment result with XML.ignoreComments = true', 'text', xml.nodeKind()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreComments = true', '', xml.toXMLString()); + + + XML.ignoreWhitespace = original; + XML.ignoreComments = originalComments; + } + + [Test] + public function testIgnoreComments():void{ + var original:Boolean = XML.ignoreWhitespace; + var originalComments:Boolean = XML.ignoreComments; + XML.ignoreWhitespace = true; + XML.ignoreComments = false; + var xml:XML = new XML('<root><!-- my test comment --></root>'); + Assert.assertEquals('unexpected comment result with XML.ignoreComments = false', 1, xml.children().length()); + RoyaleUnitTestRunner.consoleOut(xml.toXMLString()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreComments = false', + '<root>\n' + + ' <!-- my test comment -->\n' + + '</root>', + xml.toXMLString()); + Assert.assertNull('unexpected name value with comment', xml.children()[0].name()); + XML.ignoreComments = true; + xml = new XML('<root><!-- my test comment --></root>'); + Assert.assertEquals('unexpected comment result with XML.ignoreComments = true', 0, xml.children().length()); + Assert.assertEquals('unexpected toXMLString with XML.ignoreComments = true', '<root/>', xml.toXMLString()); + + XML.ignoreWhitespace = original; + XML.ignoreComments = originalComments; + } + + [Test] + [TestVariance(variance="JS",description="Some browsers can parse to a different order of attributes and namespace declarations (which affects stringified content comparisons)")] + public function testLargeComplex():void{ + var xmlString:String = xml.toXMLString(); + + var expected:String = '<catalog xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:dac="com.printui.view.components.DesignAreaComponents.*">\n' + + ' bla bla\n' + + ' <product description="Cardigan Sweater" product_image="cardigan.jpg">\n' + + ' <fx:catalog_item gender="Men\'s" fx:foo="bah">\n' + + ' <item_number>QWZ5671</item_number>\n' + + ' <price>39.95</price>\n' + + ' <size description="Medium">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' </size>\n' + + ' <size description="Large">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' </size>\n' + + ' </fx:catalog_item>\n' + + ' <script><![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]></script>\n' + + ' <catalog_item gender="Women\'s">\n' + + ' <item_number>RRX9856</item_number>\n' + + ' <price>42.50</price>\n' + + ' <size description="Small">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' </size>\n' + + ' <size description="Medium">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' <color_swatch image="black_cardigan.jpg">Black</color_swatch>\n' + + ' </size>\n' + + ' <size description="Large">\n' + + ' <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>\n' + + ' <color_swatch image="black_cardigan.jpg">Black</color_swatch>\n' + + ' </size>\n' + + ' <size description="Extra Large">\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' <color_swatch image="black_cardigan.jpg">Black</color_swatch>\n' + + ' </size>\n' + + ' </catalog_item>\n' + + ' </product>\n' + + '</catalog>'; + + var alternate:String = '<catalog xmlns:dac="com.printui.view.components.DesignAreaComponents.*" xmlns:fx="http://ns.adobe.com/mxml/2009">\n' + + ' bla bla\n' + + ' <product product_image="cardigan.jpg" description="Cardigan Sweater">\n' + + ' <fx:catalog_item fx:foo="bah" gender="Men\'s">\n' + + ' <item_number>QWZ5671</item_number>\n' + + ' <price>39.95</price>\n' + + ' <size description="Medium">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' </size>\n' + + ' <size description="Large">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' </size>\n' + + ' </fx:catalog_item>\n' + + ' <script><![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]></script>\n' + + ' <catalog_item gender="Women\'s">\n' + + ' <item_number>RRX9856</item_number>\n' + + ' <price>42.50</price>\n' + + ' <size description="Small">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' </size>\n' + + ' <size description="Medium">\n' + + ' <color_swatch image="red_cardigan.jpg">Red</color_swatch>\n' + + ' <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' <color_swatch image="black_cardigan.jpg">Black</color_swatch>\n' + + ' </size>\n' + + ' <size description="Large">\n' + + ' <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>\n' + + ' <color_swatch image="black_cardigan.jpg">Black</color_swatch>\n' + + ' </size>\n' + + ' <size description="Extra Large">\n' + + ' <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>\n' + + ' <color_swatch image="black_cardigan.jpg">Black</color_swatch>\n' + + ' </size>\n' + + ' </catalog_item>\n' + + ' </product>\n' + + '</catalog>'; + + //RoyaleUnitTestRunner.consoleOut('testLargeComplex is alternate:\n' + (xmlString == alternate)); + + //IE and MS Edge: inlcude alternate output check + //account for variation in output order of attributes and namespace declarations (from native DOMParser) + Assert.assertTrue('unexpected complex stringify results', xmlString == expected || xmlString == alternate); + } } } diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterStringifyTest.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterStringifyTest.as index 76ab734..f7a1b1e 100644 --- a/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterStringifyTest.as +++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/xml/XMLTesterStringifyTest.as @@ -22,20 +22,28 @@ package flexUnitTests.xml import flexunit.framework.Assert; - import org.apache.royale.reflection.*; - + import testshim.RoyaleUnitTestRunner; + /** + * @royalesuppresspublicvarwarning + */ public class XMLTesterStringifyTest { + + public static var isJS:Boolean = COMPILE::JS; + + private var settings:Object; [Before] public function setUp():void { + settings = XML.settings(); } [After] public function tearDown():void { + XML.setSettings(settings); } [BeforeClass] @@ -52,25 +60,109 @@ package flexUnitTests.xml [Test] public function testPrettyPrintingSimple():void { + var originalIndent:uint = XML.prettyIndent; + var originalPretty:Boolean = XML.prettyPrinting; XML.prettyIndent = 2; XML.prettyPrinting = true; - var xml:XML = <xml> - <item/> - </xml>; + var xml:XML = <xml><item/></xml>; - Assert.assertEquals('Error in pretty Printing', xml.toXMLString(), '<xml>\n <item/>\n</xml>') + Assert.assertEquals('Error in pretty Printing', xml.toXMLString(), '<xml>\n <item/>\n</xml>'); XML.prettyIndent = 4; - Assert.assertEquals('Error in pretty Printing', xml.toXMLString(), '<xml>\n <item/>\n</xml>') + Assert.assertEquals('Error in pretty Printing', xml.toXMLString(), '<xml>\n <item/>\n</xml>'); XML.prettyIndent = 0; - Assert.assertEquals('Error in pretty Printing', xml.toXMLString(), '<xml>\n<item/>\n</xml>') + Assert.assertEquals('Error in pretty Printing', xml.toXMLString(), '<xml>\n<item/>\n</xml>'); + + XML.prettyIndent = originalIndent; + XML.prettyPrinting = originalPretty; } + + [Test] + public function testToStringVariants():void{ + var ampXML:XML = new XML("<Content>Bat & Ball</Content>"); + var amp2XML:XML = new XML("<Content>Bat & Ball</Content>"); + Assert.assertEquals('ampersand entities are output with toXMLString', ampXML.toXMLString(),'<Content>Bat & Ball</Content>'); + Assert.assertEquals('ampersand entities are output with toXMLString', amp2XML.toXMLString(),'<Content>Bat & Ball</Content>'); + Assert.assertEquals('ampersand entities are not output with toString', ampXML.toString(),'Bat & Ball'); + Assert.assertEquals('ampersand entities are not output with toString', amp2XML.toString(),'Bat & Ball'); + + } - /*[Test] - public function testPrettyPrintingAdvanced():void{ - }*/ + [Test] + [TestVariance(variance="JS",description="Some browsers can parse to a different order of attributes and namespace declarations (which affects stringified content comparisons)")] + public function testStringifyAdvanced():void{ + XML.ignoreWhitespace = true; + XML.prettyPrinting = false; + var content:XML = new XML( + '<root>' + + ' <content><![CDATA[<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>' + + '<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 ">' + + ' <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">' + + ' <rdf:Description rdf:about=""/>' + + ' </rdf:RDF>' + + '</x:xmpmeta>' + + '<?xpacket end="r"?>]'+']></content>' + + '</root>'); + var contentStr:String = content.toXMLString(); + var correctStr:String = '<root><content><![CDATA[<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about=""/> </rdf:RDF></x:xmpmeta><?xpacket end="r"?>]'+']></content></root>'; + + Assert.assertEquals('testStringifyAdvanced 1:content.toXMLString() was incorrect',correctStr, contentStr); + + + Assert.assertEquals('testStringifyAdvanced 1:content.toXMLString() was incorrect',correctStr, content.toXMLString()); + + content = <Document> + <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> + <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about=""> + <dc:format>application/x-indesign</dc:format> + </rdf:Description> + <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" rdf:about=""> + <xmp:CreatorTool>Adobe InDesign CS6 (Windows)</xmp:CreatorTool> + <xmp:CreateDate>2018-02-19T09:17:41Z</xmp:CreateDate> + <xmp:MetadataDate>2018-02-19T09:17:41Z</xmp:MetadataDate> + <xmp:ModifyDate>2018-02-19T09:17:41Z</xmp:ModifyDate> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:width>512</xmpGImg:width> + <xmpGImg:height>512</xmpGImg:height> + <xmpGImg:image>FOO</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + </rdf:Description> + </rdf:RDF> + </x:xmpmeta> + <?xpacket end="r"?> + </Document>; + + + contentStr = content.toXMLString(); + //RoyaleUnitTestRunner.consoleOut(contentStr); + var expected:String = '<Document><x:xmpmeta x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 " xmlns:x="adobe:ns:meta/"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:format>application/x-indesign</dc:format></rdf:Description><rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"><xmp:CreatorT [...] + //IE and Edge: + var alternate:String = '<Document><x:xmpmeta x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 " xmlns:x="adobe:ns:meta/"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:format>application/x-indesign</dc:format></rdf:Description><rdf:Description rdf:about="" xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" xmlns:xmp="http://ns.adobe.com/xap/1.0/"><xmp:CreatorT [...] + + Assert.assertTrue('testStringifyAdvanced 1:content.toXMLString() was incorrect', + (contentStr == expected) || (contentStr == alternate)); + + + } + + [Test] + public function testCDATA():void{ + var script:XML = <script> <![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]> </script>; + + Assert.assertEquals('unexpected toXMLString with child CDATA', + '<script><![CDATA[private function onStylesLoaded(ev:Event):void {currentState = "normal";facade = ApplicationFacade.getInstance();facade.notifyObservers(new Notification(ApplicationFacade.CMD_STARTUP, this));} ]]></script>', + script.toXMLString()) + } + } } diff --git a/manualtests/UnitTests/src/main/royale/testshim/RoyaleUnitTestRunner.as b/manualtests/UnitTests/src/main/royale/testshim/RoyaleUnitTestRunner.as index ff5eda9..8d99136 100644 --- a/manualtests/UnitTests/src/main/royale/testshim/RoyaleUnitTestRunner.as +++ b/manualtests/UnitTests/src/main/royale/testshim/RoyaleUnitTestRunner.as @@ -27,15 +27,32 @@ package testshim import flexunit.framework.Assert; + /** + * @royalesuppresspublicvarwarning + */ public class RoyaleUnitTestRunner { + + + public static var swfVersion:uint=0; + + public static function getCurrentPlatform():String{ + COMPILE::SWF{ + return 'SWF'; + } + COMPILE::JS{ + return 'JS'; + } + + //return ''; + } public static function consoleOut(message:String, type:String = 'log', ...args):void { args.unshift(message + '\n'); COMPILE::JS { args.unshift('[JS]'); - console[type].apply(null, args); + console[type].apply(console, args); } COMPILE::SWF{ import flash.external.ExternalInterface; @@ -53,6 +70,8 @@ package testshim } } } + + public static function getErrorStack(e:Error):String { @@ -209,6 +228,7 @@ package testshim consoleOut('running test in ' + testClass + ":" + methodName); var varianceMetas:Array = methodDef.retrieveMetaDataByName("TestVariance"); + var method:Function = instance[methodName] as Function; var preAssertCount:uint = Assert.assertionsMade; var result:TestResult = new TestResult(); @@ -221,13 +241,20 @@ package testshim while (varianceMetas.length) { var varianceMeta:MetaDataDefinition = varianceMetas.shift() as MetaDataDefinition; + + var varianceArgs:Array = varianceMeta.getArgsByKey("variance"); + var i:uint = 0, l:uint = varianceArgs.length; if (l) { - result.hasVariance = true; - for (; i < l; i++) varianceArgs[i] = varianceArgs[i].value; - result.varianceTarget = varianceArgs.join(","); + for (; i < l; i++) { + var target:String = varianceArgs[i] = varianceArgs[i].value; + if (target == getCurrentPlatform()) { + result.hasVariance = true; + result.varianceTarget = varianceArgs.join(","); + } + } } if (result.hasVariance) { @@ -239,6 +266,7 @@ package testshim result.varianceDescription += description.value; if (descriptionArgs.length) result.varianceDescription += ", "; } + break; } } //run the test method diff --git a/manualtests/UnitTests/testsview/index.html b/manualtests/UnitTests/testsview/index.html index 3103498..b697ee0 100644 --- a/manualtests/UnitTests/testsview/index.html +++ b/manualtests/UnitTests/testsview/index.html @@ -111,7 +111,7 @@ function onSwfFrameReady(){ //this supports intellij's 'launch in browser' - var swfFrameSource = "/target/bin-debug/UnitTests.html"; + var swfFrameSource = "/target/swf/UnitTests.html"; if (window.location.search) { var append = window.location.search; if (append) swfFrameSource += append; diff --git a/manualtests/build_example.xml b/manualtests/build_example.xml index cf67ea4..7e626cd 100644 --- a/manualtests/build_example.xml +++ b/manualtests/build_example.xml @@ -164,11 +164,12 @@ <property name="config_arg" value="royale" /> <property name="file_suffix" value="mxml" /> <property name="optional_arg" value="-define+=CONFIG::dummy,true" /> + <property name="debug" value="true" /> <!-- this is a dummy var placeholder in case some example needs to define a theme then they would set theme_arg=-theme=<path to theme> --> <property name="theme_arg" value="-define+=CONFIG::theme,false" /> <mxmlc fork="true" - debug="true" + debug="${debug}" configname="${config_arg}" swf-version="${swf.version}" closure-lib="${GOOG_HOME}" @@ -188,6 +189,7 @@ <antcall target="build_example.wrapper"> <param name="output" value="${destDir}"/> + <param name="templatebase" value="${html_template_base}"/> </antcall> <copy todir="${destDir}"> @@ -298,6 +300,7 @@ <antcall target="build_example.wrapper"> <param name="output" value="${destDir}"/> + <param name="templatebase" value="${html_template_base}"/> </antcall> </target> @@ -350,14 +353,17 @@ <target name="wrapper" depends="check-air" unless="is.air"> <property name="output" value="${basedir}/bin-debug"/> + <property name="templatebase" value="${ROYALE_HOME}/templates"/> + <echo>creating html-wrapper from ${templatebase}</echo> <html-wrapper height="100%" width="100%" bgcolor="#ffffff" name="${example}" versionmajor="11" - versionminor="1" + versionminor="5" versionrevision="0" + templatebase="${templatebase}" output="${output}"/> </target> @@ -365,7 +371,8 @@ <copy toDir="${basedir}/bin-debug" file="${basedir}/${example}-app.xml" /> <copy toDir="${basedir}/bin-release" file="${basedir}/${example}-app.xml" /> </target> - + + <property name="html_template_base" value="${ROYALE_HOME}/templates" /> <macrodef name="html-wrapper"> <attribute name="width"/> <attribute name="height"/> @@ -375,16 +382,17 @@ <attribute name="versionminor"/> <attribute name="versionrevision"/> <attribute name="output"/> + <attribute name="templatebase" default="${html_template_base}"/> <sequential> <copy toFile="@{output}/@{name}.html" - file="${ROYALE_HOME}/templates/swfobject/index.template.html" /> + file="@{templatebase}/swfobject/index.template.html" /> <copy toDir="@{output}/history"> - <fileset dir="${ROYALE_HOME}/templates/swfobject/history"> + <fileset dir="@{templatebase}/swfobject/history"> <include name="**"/> </fileset> </copy> <copy toDir="@{output}"> - <fileset dir="${ROYALE_HOME}/templates/swfobject"> + <fileset dir="@{templatebase}/swfobject"> <include name="*"/> <exclude name="index.template.html"/> </fileset>
