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 <> to be equal to <> - 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 <[email protected]> wrote:
>
> But that case seems to fail in Flash, so it’s likely correct...
>
>> On Jul 4, 2022, at 5:14 PM, Harbs <[email protected]> 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 <[email protected]> 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, <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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?
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>
>