<!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 <ap@webkit.org>
+
+ 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 <mrowe@apple.com>
</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("5 mod -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
</span><span class="cx"> PASS DOM.evaluate("-5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
</span><span class="cx"> PASS DOM.evaluate("-5 mod -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
</span><ins>+PASS DOM.evaluate("1 mod 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("0 mod 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(0 div 0) mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("2 mod (0 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(1 div 0) mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(1 div 0) mod 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(1 div 0) mod (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("42 mod (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 42
+PASS DOM.evaluate("0.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0.5
+PASS DOM.evaluate("-0.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -0.5
+PASS DOM.evaluate("2.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0.5
+PASS DOM.evaluate("-2.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -0.5
+PASS DOM.evaluate("5 mod 3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+PASS DOM.evaluate("5 mod -3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+PASS DOM.evaluate("-5 mod 3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -2
+PASS DOM.evaluate("-5 mod -3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -2
</ins><span class="cx"> PASS DOM.evaluate("5 + 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 7
</span><span class="cx"> PASS DOM.evaluate("3 + -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
</span><span class="cx"> PASS DOM.evaluate("(1 div 0) + (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
</span><span class="lines">@@ -79,37 +95,37 @@
</span><span class="cx"> PASS DOM.evaluate("5 <= number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("5 > number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("5 >= number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("5 < @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate("5 <= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("5 < @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 <= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("5 > @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("5 >= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("'-5' * '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -10. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'-4' * '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 8. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'0' * '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 0. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'1' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'3.1415926535' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 3.1415926535. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'Hi' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'NaN' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'• = middle dot' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'0' div '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 0. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'1' div '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'-5' div '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -2.5. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'-4' div '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 2. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'0' div '0'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be NaN. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'1' div '0'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be Infinity. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'-1' div '0'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -Infinity. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'0' mod '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 0. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'5' mod '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'5' mod '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'-5' mod '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'-5' mod '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'5' + '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 7. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'3' + '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'5' - '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 3. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("'3' - '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 5. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("-'5'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -5. Threw exception Error: TYPE_ERR: DOM XPath Exception 52
-FAIL DOM.evaluate("-'-2')", 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("'-5' * '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -10
+PASS DOM.evaluate("'-4' * '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 8
+PASS DOM.evaluate("'0' * '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("'1' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("'3.1415926535' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 3.1415926535
+PASS DOM.evaluate("'' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("'Hi' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("'NaN' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("'• = middle dot' * '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("'0' div '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("'1' div '1'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("'-5' div '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -2.5
+PASS DOM.evaluate("'-4' div '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+PASS DOM.evaluate("'0' div '0'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("'1' div '0'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate("'-1' div '0'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -Infinity
+PASS DOM.evaluate("'0' mod '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("'5' mod '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("'5' mod '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("'-5' mod '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
+PASS DOM.evaluate("'-5' mod '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
+PASS DOM.evaluate("'5' + '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 7
+PASS DOM.evaluate("'3' + '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("'5' - '2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 3
+PASS DOM.evaluate("'3' - '-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 5
+PASS DOM.evaluate("-'5'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -5
+PASS DOM.evaluate("-'-2'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
</ins><span class="cx"> PASS DOM.evaluate("'5' = '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</span><span class="cx"> PASS DOM.evaluate("'5' = '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'-5' = '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</span><span class="lines">@@ -133,14 +149,14 @@
</span><span class="cx"> PASS DOM.evaluate("31 < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'31' < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("5 <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("5 <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("31 <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("'5' <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("'5' <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("'31' <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("5 > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("31 > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("31 > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("'5' > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("'31' > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("'31' > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("5 < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("31 < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="lines">@@ -149,16 +165,16 @@
</span><span class="cx"> PASS DOM.evaluate("31 <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'31' <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("5 > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate("31 > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate("'5' > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate("'31' > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("5 > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("31 > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'31' > '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("'5' < 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' <= 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' > 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' >= 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><del>-FAIL DOM.evaluate("'5' < @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
-FAIL DOM.evaluate("'5' <= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
</del><ins>+PASS DOM.evaluate("'5' < @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' <= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
</ins><span class="cx"> PASS DOM.evaluate("'5' > @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
</span><span class="cx"> PASS DOM.evaluate("'5' >= @attr31", 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>+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../../js/resources/js-test-style.css">
+<script src="../../../js/resources/js-test-pre.js"></script>
+<script src="test.js"></script>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+/*
+ 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("-5 * 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-10');
+ shouldBe('DOM.evaluate("-4 * -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '8');
+ shouldBe('DOM.evaluate("0 * 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("(1 div 0) * (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+ shouldBe('DOM.evaluate("(-1 div 0) * (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+ shouldBe('DOM.evaluate("(1 div 0) * (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+ shouldBe('DOM.evaluate("0 div 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("-5 div 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2.5');
+ shouldBe('DOM.evaluate("-4 div -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+ shouldBe('DOM.evaluate("0 div 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("1 div 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+ shouldBe('DOM.evaluate("-1 div 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+ shouldBe('DOM.evaluate("0 div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("1 div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("-1 div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("0 div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("1 div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("-1 div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("(1 div 0) div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(1 div 0) div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(-1 div 0) div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(-1 div 0) div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("0 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("5 mod -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("-5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+ shouldBe('DOM.evaluate("-5 mod -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+ shouldBe('DOM.evaluate("1 mod 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("0 mod 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(0 div 0) mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("2 mod (0 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(1 div 0) mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(1 div 0) mod 0", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("(1 div 0) mod (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("42 mod (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '42');
+ shouldBe('DOM.evaluate("0.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0.5');
+ shouldBe('DOM.evaluate("-0.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-0.5');
+ shouldBe('DOM.evaluate("2.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0.5');
+ shouldBe('DOM.evaluate("-2.5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-0.5');
+ shouldBe('DOM.evaluate("5 mod 3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+ shouldBe('DOM.evaluate("5 mod -3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+ shouldBe('DOM.evaluate("-5 mod 3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2');
+ shouldBe('DOM.evaluate("-5 mod -3", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2');
+
+ shouldBe('DOM.evaluate("5 + 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '7');
+ shouldBe('DOM.evaluate("3 + -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("(1 div 0) + (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+ shouldBe('DOM.evaluate("5 - 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3');
+ shouldBe('DOM.evaluate("3 - -2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '5');
+ shouldBe('DOM.evaluate("(1 div 0) - (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+
+ shouldBe('DOM.evaluate("- 5", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-5');
+ shouldBe('DOM.evaluate("- (- 2)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+
+ shouldBe('DOM.evaluate("5 = 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 = -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("-5 = -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("0 = 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("(1 div 0) = (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("(-1 div 0) = (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 = (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 = number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("number(\'NaN\') = number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("31 = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+
+ shouldBe('DOM.evaluate("5 != 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 != -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("-5 != -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("0 != 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("(1 div 0) != (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("(-1 div 0) != (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 != (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 != number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("number(\'NaN\') != number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("31 != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+ shouldBe('DOM.evaluate("5 < 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 > 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 >= 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 < -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 > -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 >= -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 < 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 > 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 >= 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 < (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 <= (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 > (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 >= (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 < (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 > (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 >= (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 < number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 > number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 >= number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 < @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 <= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 > @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 >= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+ shouldBe('DOM.evaluate("\'-5\' * \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-10');
+ shouldBe('DOM.evaluate("\'-4\' * \'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '8');
+ shouldBe('DOM.evaluate("\'0\' * \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("\'1\' * \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("\'3.1415926535\' * \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3.1415926535');
+ shouldBe('DOM.evaluate("\'\' * \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("\'Hi\' * \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("\'NaN\' * \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("\'\u2022 = middle dot\' * \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("\'0\' div \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("\'1\' div \'1\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("\'-5\' div \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-2.5');
+ shouldBe('DOM.evaluate("\'-4\' div \'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+ shouldBe('DOM.evaluate("\'0\' div \'0\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+ shouldBe('DOM.evaluate("\'1\' div \'0\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+ shouldBe('DOM.evaluate("\'-1\' div \'0\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+ shouldBe('DOM.evaluate("\'0\' mod \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+ shouldBe('DOM.evaluate("\'5\' mod \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("\'5\' mod \'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("\'-5\' mod \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+ shouldBe('DOM.evaluate("\'-5\' mod \'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+
+ shouldBe('DOM.evaluate("\'5\' + \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '7');
+ shouldBe('DOM.evaluate("\'3\' + \'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+ shouldBe('DOM.evaluate("\'5\' - \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3');
+ shouldBe('DOM.evaluate("\'3\' - \'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '5');
+
+ shouldBe('DOM.evaluate("-\'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-5');
+ shouldBe('DOM.evaluate("-\'-2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+
+ shouldBe('DOM.evaluate("\'5\' = \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' = \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'-5\' = \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'0\' = \'0\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'Hi\' = \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' = \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' = \'NaN\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'NaN\' = \'NaN\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'31\' = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+
+ shouldBe('DOM.evaluate("\'5\' != \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' != \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'-5\' != \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'0\' != \'0\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' != \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' != number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'NaN\' != \'NaN\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'31\' != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+ shouldBe('DOM.evaluate("5 < \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("31 < \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' < \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'31\' < \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("31 <= \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' <= \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'31\' <= \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 > \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("31 > \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' > \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'31\' > \'5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("5 < \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("31 < \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' < \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'31\' < \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 <= \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("31 <= \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' <= \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'31\' <= \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("5 > \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("31 > \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' > \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'31\' > \'-5\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' < \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' <= \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' > \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' >= \'Hi\'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' < @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' <= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+ shouldBe('DOM.evaluate("\'5\' > @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+ shouldBe('DOM.evaluate("\'5\' >= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+ var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
</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 <ap@webkit.org>
+
+ 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 <mjs@apple.com>
</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)->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)->evaluate());
</span><span class="cx"> Value rhs(subExpr(1)->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->firstChild(); n; n = n->traverseNextNode(context))
</span><span class="cx"> nodes.append(n);
</span><span class="cx"> return nodes;
</span><del>- case ParentAxis:
- nodes.append(context->parentNode());
</del><ins>+ case ParentAxis: {
+ Node* parent = context->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->parentNode(); n; n = n->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(&canConvert);
</del><ins>+ double value = m_string.simplifyWhiteSpace().toDouble(&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>