|
|
|
I think I have written the proper test to show that trimwhitespace is not working.
I copied the example data from http://127.0.0.1:8080/trunk/docs/guide/data-structures.html#d0e20889 (Chapter 35, Data, XML, and XPath, section 2.1 Whitespace): In OpenLaszlo applications, the runtime doesn't trim whitespace. Rather, it totally removes text nodes which have all whitespace. Like, for example <foo> <bar/> </foo> would have two text nodes of all whitespace, before and after the <bar> tag. I took that XML snippet, and made two identical datasets from it. On one, I set trimwhitespace to true. On the other, I set trimwhitespace to false. Then I attached a datapointer to the text from each. I expected the datapointers to be different, but they were the same: <canvas debug="true"> <include href="lzunit"/> <simplelayout axis="y"/> <script> myData.setAttribute('trimwhitespace', false); myOtherData.setAttribute('trimwhitespace', true); </script> <dataset name="myData"> <myXML> <foo> <bar/> </foo> </myXML> </dataset> <dataset name="myOtherData"> <myOtherXML> <otherFoo> <bar/> </otherFoo> </myOtherXML> </dataset> <datapointer id='myDataDP' xpath="myData:/myXML/foo"/> <datapointer id='myOtherDataDP' xpath="myOtherData:/myOtherXML/otherFoo"/> <script> var foo = myDataDP.getNodeText(); var bar = myOtherDataDP.getNodeText(); </script> <TestSuite> <TestCase> <method name="testTrim"> assertNotSame(foo, bar); //The assertion should be true if the trimwhitespace attribute is trimming whitespace, correct? </method> </TestCase> </TestSuite> </canvas> The same type of test, but improved because the XML is imported (and therefore, linebreaks are included):
<!--mynode.xml--> <myNode> <text> The quick brown fox jumps over the lazy dog <foo/> </text> </myNode> <!--end--> <!--test--> <canvas debug="true"> <include href="lzunit"/> <dataset name="myDataset" src="/Users/laszlosystems/src/svn/openlaszlo/trunk/my-apps/mynode.xml" request="true"/> <dataset name="myTrimDataset" src="/Users/laszlosystems/src/svn/openlaszlo/trunk/my-apps/mynode.xml" request="true"/> <datapointer id="myDatapointer" xpath="myDataset:/"/> <datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/> <script> myTrimDataset.setAttribute('trimwhitespace', true); </script> <TestSuite> <TestCase> <method name="testSrc"> Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace); assertFalse(myDataset.trimwhitespace); myDatapointer.selectChild(); myDatapointer.selectChild(); var foo = myDatapointer.getNodeText(); Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace); assertTrue(myTrimDataset.trimwhitespace); myTrimDatapointer.selectChild(); myTrimDatapointer.selectChild(); var bar = myTrimDatapointer.getNodeText(); assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working'); </method> </TestCase> </TestSuite> </canvas> <!-- Copyright 2001-2006 Laszlo Systems, Inc. --> This bug only occurs with data which is compiled in to the app. If the request type is set to http, or the src="http:mynode.xml", then it behaves properly.
The bug is that compile-time datasets expand in the lzx compiler into calls to lzAddLocalData e.g., lzAddLocalData("myTrimDataset", "<datacontent><myNode>\r\n<text>\r\n\r\nThe quick brown fox\r\n\r\n\r\njumps over the\r\n\r\nlazy dog\r\n\r\n<foo />\r\n\r\n</text>\r\n\r\n\r\n</myNode></datacontent>"); And this does not seem to properly handle the trimwhitespace arg. There is no need for "request=true" in datasets that are compiled into the app
<canvas debug="true"> <include href="lzunit"/> <dataset name="myDataset" src="mynode.xml" /> <dataset name="myTrimDataset" src="mynode.xml" trimwhitespace="true" /> <datapointer id="myDatapointer" xpath="myDataset:/"/> <datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/> <TestSuite> <TestCase> <method name="testSrc"> Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace); assertFalse(myDataset.trimwhitespace); myDatapointer.selectChild(); myDatapointer.selectChild(); var foo = myDatapointer.getNodeText(); Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace); assertTrue(myTrimDataset.trimwhitespace); myTrimDatapointer.selectChild(); myTrimDatapointer.selectChild(); var bar = myTrimDatapointer.getNodeText(); assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working'); </method> </TestCase> </TestSuite> </canvas> This passes with my proposed change (out for review to pga) Hold on.
In Henry's changed script, trimwhitespace is set in the tag, which isn't allowed. (Note that the debug.write line "myTrimDataset.trimwhitespace is' is returning false.) I took Henry's script, and set trimwhitespace to true in script. The NotSame assertion continues to run red: <canvas debug="true"> <include href="lzunit"/> <dataset name="myDataset" src="mynode.xml" /> <dataset name="myTrimDataset" src="mynode.xml" /> <datapointer id="myDatapointer" xpath="myDataset:/"/> <datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/> <TestSuite> <TestCase> <method name="testSrc"> assertFalse(myDataset.trimwhitespace); Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace); myDatapointer.selectChild(); myDatapointer.selectChild(); var foo = myDatapointer.getNodeText(); myTrimDataset.setAttribute('trimwhitespace', true); assertTrue(myTrimDataset.trimwhitespace); Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace); myTrimDatapointer.selectChild(); myTrimDatapointer.selectChild(); var bar = myTrimDatapointer.getNodeText(); assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working'); </method> </TestCase> </TestSuite> </canvas> The changes went into legals in revisions changes: r4516:4517
(change got split into two checkins by accident). The lzx schema does allow the trimwhitespace attribute on datasets, so there ought to be no warning. Which build did you try this in? These changes have not been merged to OL4 branch yet, they are only in legals <canvas debug="true">
<include href="lzunit"/> <dataset name="myDataset" src="mynode.xml" /> <dataset name="myTrimDataset" src="mynode.xml" trimwhitespace="true"/> <datapointer id="myDatapointer" xpath="myDataset:/"/> <datapointer id="myTrimDatapointer" xpath="myTrimDataset:/"/> <TestSuite> <TestCase> <method name="setUp"> Debug.write('myDataset.trimwhitespace is ', myDataset.trimwhitespace); myDatapointer.selectChild(); myDatapointer.selectChild(); myTrimDataset.setAttribute('trimwhitespace', true); Debug.write('myTrimDataset.trimwhitespace is ', myTrimDataset.trimwhitespace); myTrimDatapointer.selectChild(); myTrimDatapointer.selectChild(); </method> <method name="testSrc"> assertFalse(myDataset.trimwhitespace); assertTrue(myTrimDataset.trimwhitespace); foo = myDatapointer.getNodeText(); bar = myTrimDatapointer.getNodeText(); Debug.write(myDatapointer.serialize(foo)); Debug.write(myTrimDatapointer.serialize(bar)); assertNotSame(foo, bar, 'should not be the same if trimwhitespace is working'); </method> </TestCase> </TestSuite> </canvas> |
||||||||||||||||||||||||||||||||||||||||||||||||||||
<canvas debug="true">
<include href="lzunit"/>
<simplelayout axis="y" spacing="10"/>
<dataset name="myData">
<foo/>
</dataset>
<TestSuite>
<TestCase>
<method name="testTrimwhitespaceDefault">
assertFalse(myData.getAttribute('trimwhitespace'));
</method>
</TestCase>
</TestSuite>
</canvas>