<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[20008] trunk</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/20008">20008</a></dd>
<dt>Author</dt> <dd>ap</dd>
<dt>Date</dt> <dd>2007-03-06 22:03:27 -0800 (Tue, 06 Mar 2007)</dd>
</dl>

<h3>Log Message</h3>
<pre>        Reviewed by Sam Weinig.

        http://bugs.webkit.org/show_bug.cgi?id=12987
        Fix and import 4XPath test_numeric_expr.html

        * xml/XPathPredicate.cpp:
        (WebCore::XPath::Negative::doEvaluate): Convert the argument to number.
        (WebCore::XPath::NumericOp::doEvaluate): Convert the arguments to numbers. Use a correct operation for mod.
        * xml/XPathStep.cpp:
        (WebCore::XPath::Step::nodesInAxis): Do not append parent node if there is none.
        * xml/XPathValue.cpp:
        (WebCore::XPath::Value::toNumber): Do not convert to DeprecatedString just to trim whitespace and to convert to double.
        * platform/DeprecatedString.cpp:
        (WebCore::DeprecatedStringData::makeAscii): Added a FIXME about unreliable makeAscii() behavior.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastxpath4XPathCoretest_numeric_exprexpectedtxt">trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt</a></li>
<li><a href="#trunkWebCoreChangeLog">trunk/WebCore/ChangeLog</a></li>
<li><a href="#trunkWebCoreplatformDeprecatedStringcpp">trunk/WebCore/platform/DeprecatedString.cpp</a></li>
<li><a href="#trunkWebCorexmlXPathPredicatecpp">trunk/WebCore/xml/XPathPredicate.cpp</a></li>
<li><a href="#trunkWebCorexmlXPathStepcpp">trunk/WebCore/xml/XPathStep.cpp</a></li>
<li><a href="#trunkWebCorexmlXPathValuecpp">trunk/WebCore/xml/XPathValue.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastxpath4XPathCoretest_numeric_exprhtml">trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/LayoutTests/ChangeLog        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2007-03-06  Alexey Proskuryakov  &lt;ap@webkit.org&gt;
+
+        Reviewed by Sam Weinig.
+
+        http://bugs.webkit.org/show_bug.cgi?id=12987
+        Fix and import 4XPath test_numeric_expr.html
+
+        * fast/xpath/4XPath/Core/test_numeric_expr-expected.txt:
+        * fast/xpath/4XPath/Core/test_numeric_expr.html: Added.
+
</ins><span class="cx"> 2007-03-07  Mark Rowe  &lt;mrowe@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add dumpAsText to test to match expected results.
</span></span></pre></div>
<a id="trunkLayoutTestsfastxpath4XPathCoretest_numeric_exprexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -25,6 +25,22 @@
</span><span class="cx"> PASS DOM.evaluate(&quot;5 mod -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
</span><span class="cx"> PASS DOM.evaluate(&quot;-5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
</span><span class="cx"> PASS DOM.evaluate(&quot;-5 mod -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
</span><ins>+PASS DOM.evaluate(&quot;1 mod 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;0 mod 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;(0 div 0) mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;2 mod (0 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;(1 div 0) mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;(1 div 0) mod 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;(1 div 0) mod (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;42 mod (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 42
+PASS DOM.evaluate(&quot;0.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0.5
+PASS DOM.evaluate(&quot;-0.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -0.5
+PASS DOM.evaluate(&quot;2.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0.5
+PASS DOM.evaluate(&quot;-2.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -0.5
+PASS DOM.evaluate(&quot;5 mod 3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+PASS DOM.evaluate(&quot;5 mod -3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+PASS DOM.evaluate(&quot;-5 mod 3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -2
+PASS DOM.evaluate(&quot;-5 mod -3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -2
</ins><span class="cx"> PASS DOM.evaluate(&quot;5 + 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 7
</span><span class="cx"> PASS DOM.evaluate(&quot;3 + -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
</span><span class="cx"> PASS DOM.evaluate(&quot;(1 div 0) + (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
</span><span class="lines">@@ -79,37 +95,37 @@
</span><span class="cx"> PASS DOM.evaluate(&quot;5 &lt;= number('NaN')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;5 &gt; number('NaN')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;5 &gt;= number('NaN')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;5 &lt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate(&quot;5 &lt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;5 &lt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate(&quot;5 &lt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;5 &gt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;5 &gt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;'-5' * '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -10. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'-4' * '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 8. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'0' * '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 0. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'1' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'3.1415926535' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 3.1415926535. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'Hi' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'NaN' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'• = middle dot' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'0' div '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 0. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'1' div '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'-5' div '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -2.5. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'-4' div '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 2. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'0' div '0'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'1' div '0'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be Infinity. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'-1' div '0'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -Infinity. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'0' mod '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 0. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'5' mod '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'5' mod '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'-5' mod '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'-5' mod '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'5' + '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 7. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'3' + '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'5' - '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 3. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;'3' - '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 5. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;-'5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -5. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate(&quot;-'-2')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 2. Threw exception Error: INVALID_EXPRESSION_ERR: DOM XPath Exception 51
</del><ins>+PASS DOM.evaluate(&quot;'-5' * '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -10
+PASS DOM.evaluate(&quot;'-4' * '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 8
+PASS DOM.evaluate(&quot;'0' * '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate(&quot;'1' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate(&quot;'3.1415926535' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 3.1415926535
+PASS DOM.evaluate(&quot;'' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;'Hi' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;'NaN' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;'• = middle dot' * '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;'0' div '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate(&quot;'1' div '1'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate(&quot;'-5' div '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -2.5
+PASS DOM.evaluate(&quot;'-4' div '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+PASS DOM.evaluate(&quot;'0' div '0'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate(&quot;'1' div '0'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate(&quot;'-1' div '0'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -Infinity
+PASS DOM.evaluate(&quot;'0' mod '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate(&quot;'5' mod '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate(&quot;'5' mod '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate(&quot;'-5' mod '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
+PASS DOM.evaluate(&quot;'-5' mod '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
+PASS DOM.evaluate(&quot;'5' + '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 7
+PASS DOM.evaluate(&quot;'3' + '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate(&quot;'5' - '2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 3
+PASS DOM.evaluate(&quot;'3' - '-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 5
+PASS DOM.evaluate(&quot;-'5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -5
+PASS DOM.evaluate(&quot;-'-2'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
</ins><span class="cx"> PASS DOM.evaluate(&quot;'5' = '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' = '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'-5' = '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</span><span class="lines">@@ -133,14 +149,14 @@
</span><span class="cx"> PASS DOM.evaluate(&quot;31 &lt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &lt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'31' &lt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;5 &lt;= '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;5 &lt;= '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;31 &lt;= '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;'5' &lt;= '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;'5' &lt;= '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;'31' &lt;= '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;5 &gt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;31 &gt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;31 &gt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;'5' &gt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;'31' &gt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;'31' &gt; '5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;5 &lt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;31 &lt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &lt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="lines">@@ -149,16 +165,16 @@
</span><span class="cx"> PASS DOM.evaluate(&quot;31 &lt;= '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &lt;= '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'31' &lt;= '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;5 &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate(&quot;31 &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate(&quot;'5' &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate(&quot;'31' &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;5 &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate(&quot;31 &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate(&quot;'5' &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate(&quot;'31' &gt; '-5'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;'5' &lt; 'Hi'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &lt;= 'Hi'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &gt; 'Hi'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &gt;= 'Hi'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate(&quot;'5' &lt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate(&quot;'5' &lt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate(&quot;'5' &lt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate(&quot;'5' &lt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate(&quot;'5' &gt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate(&quot;'5' &gt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS successfullyParsed is true
</span></span></pre></div>
<a id="trunkLayoutTestsfastxpath4XPathCoretest_numeric_exprhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html (0 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html                                (rev 0)
+++ trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -0,0 +1,222 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;link rel=&quot;stylesheet&quot; href=&quot;../../../js/resources/js-test-style.css&quot;&gt;
+&lt;script src=&quot;../../../js/resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;test.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+/*
+     IEEE 754 says:
+    
+       +-Infinity * +-Infinity = +-Infinity
+       +-Infinity * 0 = NaN
+    
+       n div +-Infinity = 0
+       +-nonzero div 0 = +-Infinity
+       +-Infinity div +-Infinity = NaN
+       +-0 div +-0 = NaN
+    
+       Infinity + Infinity = Infinity
+       Infinity - Infinity = NaN
+*/
+    shouldBe('DOM.evaluate(&quot;-5 * 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-10');
+    shouldBe('DOM.evaluate(&quot;-4 * -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '8');
+    shouldBe('DOM.evaluate(&quot;0 * 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) * (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate(&quot;(-1 div 0) * (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) * (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+    shouldBe('DOM.evaluate(&quot;0 div 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;-5 div 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2.5');
+    shouldBe('DOM.evaluate(&quot;-4 div -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+    shouldBe('DOM.evaluate(&quot;0 div 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;1 div 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate(&quot;-1 div 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+    shouldBe('DOM.evaluate(&quot;0 div (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;1 div (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;-1 div (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;0 div (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;1 div (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;-1 div (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) div (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) div (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(-1 div 0) div (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(-1 div 0) div (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;0 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;5 mod -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;-5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+    shouldBe('DOM.evaluate(&quot;-5 mod -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+    shouldBe('DOM.evaluate(&quot;1 mod 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;0 mod 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(0 div 0) mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;2 mod (0 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) mod 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) mod (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;42 mod (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '42');
+    shouldBe('DOM.evaluate(&quot;0.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0.5');
+    shouldBe('DOM.evaluate(&quot;-0.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-0.5');
+    shouldBe('DOM.evaluate(&quot;2.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0.5');
+    shouldBe('DOM.evaluate(&quot;-2.5 mod 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-0.5');
+    shouldBe('DOM.evaluate(&quot;5 mod 3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+    shouldBe('DOM.evaluate(&quot;5 mod -3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+    shouldBe('DOM.evaluate(&quot;-5 mod 3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2');
+    shouldBe('DOM.evaluate(&quot;-5 mod -3&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2');
+
+    shouldBe('DOM.evaluate(&quot;5 + 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '7');
+    shouldBe('DOM.evaluate(&quot;3 + -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) + (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate(&quot;5 - 2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3');
+    shouldBe('DOM.evaluate(&quot;3 - -2&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '5');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) - (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+
+    shouldBe('DOM.evaluate(&quot;- 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-5');
+    shouldBe('DOM.evaluate(&quot;- (- 2)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+
+    shouldBe('DOM.evaluate(&quot;5 = 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 = -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;-5 = -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;0 = 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) = (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;(-1 div 0) = (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 = (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 = number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;number(\'NaN\') = number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 = @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;31 = @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+
+    shouldBe('DOM.evaluate(&quot;5 != 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 != -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;-5 != -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;0 != 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;(1 div 0) != (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;(-1 div 0) != (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 != (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 != number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;number(\'NaN\') != number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 != @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;31 != @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+    shouldBe('DOM.evaluate(&quot;5 &lt; 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &gt; 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= 5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt; -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt; -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= -5&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt; 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt; 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= 0&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt; (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &gt; (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= (1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt; (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt; (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= (-1 div 0)&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt; number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt; number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &gt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+    shouldBe('DOM.evaluate(&quot;\'-5\' * \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-10');
+    shouldBe('DOM.evaluate(&quot;\'-4\' * \'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '8');
+    shouldBe('DOM.evaluate(&quot;\'0\' * \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;\'1\' * \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;\'3.1415926535\' * \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3.1415926535');
+    shouldBe('DOM.evaluate(&quot;\'\' * \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;\'Hi\' * \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;\'NaN\' * \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;\'\u2022 = middle dot\' * \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;\'0\' div \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;\'1\' div \'1\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;\'-5\' div \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2.5');
+    shouldBe('DOM.evaluate(&quot;\'-4\' div \'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+    shouldBe('DOM.evaluate(&quot;\'0\' div \'0\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate(&quot;\'1\' div \'0\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate(&quot;\'-1\' div \'0\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+    shouldBe('DOM.evaluate(&quot;\'0\' mod \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate(&quot;\'5\' mod \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;\'5\' mod \'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;\'-5\' mod \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+    shouldBe('DOM.evaluate(&quot;\'-5\' mod \'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+
+    shouldBe('DOM.evaluate(&quot;\'5\' + \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '7');
+    shouldBe('DOM.evaluate(&quot;\'3\' + \'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate(&quot;\'5\' - \'2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3');
+    shouldBe('DOM.evaluate(&quot;\'3\' - \'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '5');
+
+    shouldBe('DOM.evaluate(&quot;-\'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-5');
+    shouldBe('DOM.evaluate(&quot;-\'-2\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+
+    shouldBe('DOM.evaluate(&quot;\'5\' = \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' = \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'-5\' = \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'0\' = \'0\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'Hi\' = \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' = \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' = \'NaN\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'NaN\' = \'NaN\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' = @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'31\' = @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+
+    shouldBe('DOM.evaluate(&quot;\'5\' != \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' != \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'-5\' != \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'0\' != \'0\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' != \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' != number(\'NaN\')&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'NaN\' != \'NaN\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' != @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'31\' != @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+    shouldBe('DOM.evaluate(&quot;5 &lt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;31 &lt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'31\' &lt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;31 &lt;= \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt;= \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'31\' &lt;= \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;31 &gt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' &gt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'31\' &gt; \'5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;5 &lt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;31 &lt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'31\' &lt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &lt;= \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;31 &lt;= \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt;= \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'31\' &lt;= \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;5 &gt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;31 &gt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' &gt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'31\' &gt; \'-5\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt; \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt;= \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &gt; \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &gt;= \'Hi\'&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' &lt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate(&quot;\'5\' &gt; @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate(&quot;\'5\' &gt;= @attr31&quot;, CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+    var successfullyParsed = true;
+
+&lt;/script&gt;
+&lt;script src=&quot;../../../js/resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">Property changes on: trunk/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:mime-type
</span><span class="cx">   + text/html
</span></span></pre></div>
<a id="trunkWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/ChangeLog (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/ChangeLog        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/WebCore/ChangeLog        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2007-03-06  Alexey Proskuryakov  &lt;ap@webkit.org&gt;
+
+        Reviewed by Sam Weinig.
+
+        http://bugs.webkit.org/show_bug.cgi?id=12987
+        Fix and import 4XPath test_numeric_expr.html
+
+        * xml/XPathPredicate.cpp:
+        (WebCore::XPath::Negative::doEvaluate): Convert the argument to number.
+        (WebCore::XPath::NumericOp::doEvaluate): Convert the arguments to numbers. Use a correct operation for mod.
+        * xml/XPathStep.cpp:
+        (WebCore::XPath::Step::nodesInAxis): Do not append parent node if there is none.
+        * xml/XPathValue.cpp:
+        (WebCore::XPath::Value::toNumber): Do not convert to DeprecatedString just to trim whitespace and to convert to double.
+        * platform/DeprecatedString.cpp:
+        (WebCore::DeprecatedStringData::makeAscii): Added a FIXME about unreliable makeAscii() behavior.
+
</ins><span class="cx"> 2007-03-06  Maciej Stachowiak  &lt;mjs@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Adele.
</span></span></pre></div>
<a id="trunkWebCoreplatformDeprecatedStringcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/platform/DeprecatedString.cpp (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/platform/DeprecatedString.cpp        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/WebCore/platform/DeprecatedString.cpp        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -476,6 +476,9 @@
</span><span class="cx">         unsigned i = _length;
</span><span class="cx">         char* cp = _ascii;
</span><span class="cx">         while (i--)
</span><ins>+            // FIXME: this converts non-Latin1 characters to '\0', which may be not what we want in some cases.
+            // In particular, toDouble() may fail to report errors, believing that the string ends earlier
+            // than it actually does.
</ins><span class="cx">             *cp++ = (*str++).latin1();
</span><span class="cx">         *cp = 0;
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkWebCorexmlXPathPredicatecpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/xml/XPathPredicate.cpp (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/xml/XPathPredicate.cpp        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/WebCore/xml/XPathPredicate.cpp        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -75,8 +75,6 @@
</span><span class="cx"> Value Negative::doEvaluate() const
</span><span class="cx"> {
</span><span class="cx">     Value p(subExpr(0)-&gt;evaluate());
</span><del>-    if (!p.isNumber())
-        return Value();
</del><span class="cx">     return -p.toNumber();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -92,11 +90,9 @@
</span><span class="cx">     Value lhs(subExpr(0)-&gt;evaluate());
</span><span class="cx">     Value rhs(subExpr(1)-&gt;evaluate());
</span><span class="cx">     
</span><del>-    if (!lhs.isNumber() || !rhs.isNumber())
-        return Value();
</del><ins>+    double leftVal = lhs.toNumber();
+    double rightVal = rhs.toNumber();
</ins><span class="cx"> 
</span><del>-    double leftVal = lhs.toNumber(), rightVal = rhs.toNumber();
-
</del><span class="cx">     switch (m_opcode) {
</span><span class="cx">         case OP_Add:
</span><span class="cx">             return leftVal + rightVal;
</span><span class="lines">@@ -107,7 +103,7 @@
</span><span class="cx">         case OP_Div:
</span><span class="cx">             return leftVal / rightVal;
</span><span class="cx">         case OP_Mod:
</span><del>-            return remainder(leftVal, rightVal);
</del><ins>+            return fmod(leftVal, rightVal);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     return Value();
</span></span></pre></div>
<a id="trunkWebCorexmlXPathStepcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/xml/XPathStep.cpp (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/xml/XPathStep.cpp        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/WebCore/xml/XPathStep.cpp        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -99,9 +99,12 @@
</span><span class="cx">             for (Node* n = context-&gt;firstChild(); n; n = n-&gt;traverseNextNode(context))
</span><span class="cx">                 nodes.append(n);
</span><span class="cx">             return nodes;
</span><del>-        case ParentAxis:
-            nodes.append(context-&gt;parentNode());
</del><ins>+        case ParentAxis: {
+            Node* parent = context-&gt;parentNode();
+            if (parent)
+                nodes.append(parent);
</ins><span class="cx">             return nodes;
</span><ins>+        }
</ins><span class="cx">         case AncestorAxis:
</span><span class="cx">             for (Node* n = context-&gt;parentNode(); n; n = n-&gt;parentNode())
</span><span class="cx">                 nodes.append(n);
</span></span></pre></div>
<a id="trunkWebCorexmlXPathValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/xml/XPathValue.cpp (20007 => 20008)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/xml/XPathValue.cpp        2007-03-07 05:55:30 UTC (rev 20007)
+++ trunk/WebCore/xml/XPathValue.cpp        2007-03-07 06:03:27 UTC (rev 20008)
</span><span class="lines">@@ -112,7 +112,7 @@
</span><span class="cx">             return m_number;
</span><span class="cx">         case StringValue: {
</span><span class="cx">             bool canConvert;
</span><del>-            double value = m_string.deprecatedString().simplifyWhiteSpace().toDouble(&amp;canConvert);
</del><ins>+            double value = m_string.simplifyWhiteSpace().toDouble(&amp;canConvert);
</ins><span class="cx">             if (canConvert)
</span><span class="cx">                 return value;
</span><span class="cx">             return NAN;
</span></span></pre>
</div>
</div>

</body>
</html>