The spec says that valueOf is supposed to return the XML object, so maybe 
comparison uses valueOf, but string concatenation then uses toString()?

> On Jul 4, 2022, at 5:24 PM, Harbs <harbs.li...@gmail.com> wrote:
> 
> OK. Here’s something to look at:
> 
>            xml = <xml><Properties name="baz"><foo/></Properties></xml>;
>            var props:XMLList = xml.Properties;
>            var bar:XMLList = xml.Bar;
> This assert fails in Flash
>            assertEquals(bar , "","bar should evaluate to an empty string”);
> with:
>  <failure message="expected &lt;&gt; to be equal to &lt;&gt; - bar should 
> evaluate to an empty string" 
> type="flexUnitTests.xml::XMLTesterStringifyTest.emptyStringify"><![CDATA[Error:
>  expected <> to be equal to <> - bar should evaluate to an empty string
> Not sure why…
> 
> This passes in Flash and fails in JS:
>            assertEquals(""+bar , "","bar should evaluate to an empty string");
> 
> 
>> On Jul 4, 2022, at 5:19 PM, Harbs <harbs.li...@gmail.com> wrote:
>> 
>> But that case seems to fail in Flash, so it’s likely correct...
>> 
>>> On Jul 4, 2022, at 5:14 PM, Harbs <harbs.li...@gmail.com> wrote:
>>> 
>>> My test case covered what I found (assertEquals("" + xml.Baz.text(), "","An 
>>> empty node should return an empty string”);)
>>> 
>>> Here’s another case which I did not retest after my changes:
>>> 
>>> var xml = <xml><Properties name="baz"><foo/></Properties></xml>;
>>> var props:XMLList = xml.Properties;
>>> trace(props.length())// 1
>>> var bar:XMLList = xml.Bar;
>>> if(bar && bar != ""){
>>>     trace("bar should not be undefined and we should not get here!!!");
>>> }
>>> 
>>> 
>>>> On Jul 4, 2022, at 4:56 PM, Greg Dove <greg.d...@gmail.com> wrote:
>>>> 
>>>> Thanks Harbs. By coincidence, I was actually intending to work on exactly
>>>> the same thing tomorrow local time, because Yishay encountered something
>>>> similar and I also wanted to create a failing test to fix.
>>>> 
>>>> It's definitely a bit tricky. iirc it was something like this:
>>>> 
>>>> var list:XMLList;
>>>> 
>>>> list == null ; // not surprising
>>>> var node:XML = <xml/>;
>>>> list = node.@nonexistent;
>>>> 
>>>> list == undefined // true
>>>> list == null // false, failing I think at the moment in js
>>>> 'test' + list +'test'  == 'testtest'//this I had captured in prep also and
>>>> I think this is what you covered? There was another case where
>>>> Language.string was causing it I think also, which I had asked Yishay for
>>>> the example of just a few hours ago.
>>>> 
>>>> If you see any more related to this please feel free to add failing tests
>>>> marked with ignore Metadata for now and I will happily work on them.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Tue, 5 Jul 2022, 12:32 am Harbs, <harbs.li...@gmail.com> wrote:
>>>> 
>>>>> I just made a commit which should do the right thing vis a vis both
>>>>> undefined and empty strings.
>>>>> 
>>>>> I added a test for the additional case and all existing tests still 
>>>>> pass...
>>>>> 
>>>>>> On Jul 4, 2022, at 2:28 PM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>> 
>>>>>> It’s because valueOf of XMLList was changed.
>>>>>> 
>>>>>> For reference, this passed in Flash and fails in JS:
>>>>>> 
>>>>>>    public function emptyStringify():void{
>>>>>>        var xml:XML = <Foo><Baz/></Foo>;
>>>>>>        assertEquals("" + xml.Baz.text(), "","An empty node should
>>>>> return an empty string");
>>>>>>    }
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Jul 4, 2022, at 2:01 PM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>>> 
>>>>>>> There’s more xml problems.
>>>>>>> 
>>>>>>> Coercing empty xml to a string used to result in an empty string. It
>>>>> now results in “undefined”.
>>>>>>> 
>>>>>>> i.e.
>>>>>>> 
>>>>>>> var xml:XML = <Foo><Baz/></Foo>;
>>>>>>> '' + xml.Baz.text()
>>>>>>> 
>>>>>>> I believe we used to get “”, and now we get “undefined”.
>>>>>>> 
>>>>>>>> On Jun 27, 2022, at 6:44 AM, Greg Dove <greg.d...@gmail.com> wrote:
>>>>>>>> 
>>>>>>>> Sorry about that, Harbs.
>>>>>>>> 
>>>>>>>> "I’m guessing XML(_children[i]) really was meant to be: (_children[i]
>>>>> as
>>>>>>>> XML)..."
>>>>>>>> 
>>>>>>>> That was some time ago, but I also think you are correct with the
>>>>> guess.
>>>>>>>> 
>>>>>>>> I probably had a momentary lapse of thought and forgot that
>>>>>>>> XML(something) ]
>>>>>>>> does not get ignored by @royaleignorecoercion XML, and that you need
>>>>>>>> instead to always use
>>>>>>>> "as XML"
>>>>>>>> for @royaleignorecoercion to work with XML. I think Array is similar in
>>>>>>>> this regard, with the native 'class' being a top level function.
>>>>>>>> 
>>>>>>>> In general I have added more of these explicit coercions because the
>>>>>>>> framework has a lot of compiler switch tweaks which sometimes makes it
>>>>>>>> unworkable to copy and paste the framework code as a monkey patch
>>>>> alongside
>>>>>>>> external project code. By adding the explicit coercion and the
>>>>>>>> "royaleignoring" it, there is no implicit coercion code generated under
>>>>>>>> default compiler behaviour, for example, so it makes a default compiler
>>>>>>>> settings build closer to the framework settings build of it.
>>>>>>>> I find this use of monkey patching to be any easy way to test changes
>>>>> to
>>>>>>>> many framework classes in the context of their actual usage, as it
>>>>> avoids
>>>>>>>> recompiling the library first to test small changes each time, before
>>>>>>>> ultimately bringing the changes back into the library code.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Mon, Jun 27, 2022 at 3:19 AM Harbs <harbs.li...@gmail.com> wrote:
>>>>>>>> 
>>>>>>>>> I changed the class to allow subclassing.
>>>>>>>>> 
>>>>>>>>> I don’t think I messed anything up. I’m guessing XML(_children[i])
>>>>> really
>>>>>>>>> was meant to be: (_children[i] as XML)...
>>>>>>>>> 
>>>>>>>>> Harbs
>>>>>>>>> 
>>>>>>>>>> On Jun 26, 2022, at 6:09 PM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>>>>>> 
>>>>>>>>>> I just noticed that the changes to XML using XML.conversion broke my
>>>>> app.
>>>>>>>>>> 
>>>>>>>>>> I have an optimization where I subclass XML and override toString and
>>>>>>>>> toXMLString so there’s no need to create, parse and convert many
>>>>> parts of
>>>>>>>>> XML which don’t need that.
>>>>>>>>>> 
>>>>>>>>>> I call it StringXML.
>>>>>>>>>> 
>>>>>>>>>> This code:
>>>>>>>>>> 
>>>>>>>>> 
>>>>> strArr.push(XML.conversion(this._children[i])._toXMLString(nextIndentLevel,
>>>>>>>>> declarations.concat(ancestors)));
>>>>>>>>>> 
>>>>>>>>>> causes my instance to go through XML.conversion and ends up with
>>>>> this:
>>>>>>>>> return new XML(xml); where xml is a StringXML.
>>>>>>>>>> 
>>>>>>>>>> That obviously does not work.
>>>>>>>>>> 
>>>>>>>>>> What is the purpose of calling conversion on an XML node?
>>>>>>>>>> 
>>>>>>>>>> That’s caused by
>>>>>>>>> 
>>>>> strArr.push(XML(_children[i])._toXMLString(nextIndentLevel,declarations.concat(ancestors)));
>>>>>>>>>> 
>>>>>>>>>> The compiler changes XML to XML.conversion.
>>>>>>>>>> 
>>>>>>>>>> I don’t understand why that change was made.
>>>>>>>>>> 
>>>>>>>>>> The code originally looked like:
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>> 
>>>>> strArr.push(_children[i].toXMLString(nextIndentLevel,ancestors.concat(declarations)));
>>>>>>>>>> 
>>>>>>>>>> Greg, any input?
>>>>>>>>> 
>>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>> 
>> 
> 

Reply via email to