Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Mar 2007 17:36:24 +0000 (17:36 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Mar 2007 17:36:24 +0000 (17:36 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=12954
        XPath relative operations are implemented incorrectly

WebCore:
        * xml/XPathPredicate.cpp:
        (WebCore::XPath::NumericOp::doEvaluate):
        (WebCore::XPath::EqTestOp::compare):
        (WebCore::XPath::EqTestOp::doEvaluate):
        Reimplemented relative equality operations to match the spec.

        * xml/XPathPredicate.h:
        (WebCore::XPath::NumericOp::):
        (WebCore::XPath::EqTestOp::):
        Moved relative operations to EqTestOp.

        * xml/XPathGrammar.y:
        * xml/XPathParser.cpp:
        (WebCore::XPath::Parser::nextTokenInternal):
        (WebCore::XPath::Parser::lex):
        Adapted for the above changes.

LayoutTests:
        * fast/xpath/4XPath/Core/test_boolean_expr-expected.txt: Added.
        * fast/xpath/4XPath/Core/test_boolean_expr.html: Added.

        * fast/xpath/4XPath/Borrowed/cz_20030217-expected.txt: Added.
        * fast/xpath/4XPath/Borrowed/cz_20030217.html: Added.
        * fast/xpath/4XPath/Borrowed/kd_20010423-expected.txt: Added.
        * fast/xpath/4XPath/Borrowed/kd_20010423.html: Added.
        * fast/xpath/4XPath/Borrowed/od_20000608-expected.txt: Added.
        * fast/xpath/4XPath/Borrowed/od_20000608.html: Added.
        * fast/xpath/4XPath/Borrowed/resources/od_20000608.xml: Added.
        * fast/xpath/4XPath/Borrowed/rs_20010831-expected.txt: Added.
        * fast/xpath/4XPath/Borrowed/rs_20010831.html: Added.
        * fast/xpath/4XPath/Borrowed/sr_20021217-expected.txt: Added.
        * fast/xpath/4XPath/Borrowed/sr_20021217.html: Added.
        Added a bunch of XPath tests that already passed.

        * fast/xpath/4XPath/Borrowed/namespace-nodes-expected.txt: Added.
        * fast/xpath/4XPath/Borrowed/namespace-nodes.html: Added.
        * fast/xpath/namespace-nodes-expected.txt: Removed.
        * fast/xpath/namespace-nodes.html: Removed.
        Moved a previously imported 4XPath test.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@19963 268f45cc-cd09-0410-ab3c-d52691b4dbfc

40 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes-expected.txt [moved from LayoutTests/fast/xpath/namespace-nodes-expected.txt with 100% similarity]
LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes.html [moved from LayoutTests/fast/xpath/namespace-nodes.html with 100% similarity]
LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/resources/od_20000608.xml [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test.js [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_core_functions-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_core_functions.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_literal_expr-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_literal_expr.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_location_path-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_location_path.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_node_test-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_node_test.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_parser-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_parser.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_predicate_list-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_predicate_list.html [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_step-expected.txt [new file with mode: 0644]
LayoutTests/fast/xpath/4XPath/Core/test_step.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/xml/XPathGrammar.y
WebCore/xml/XPathParser.cpp
WebCore/xml/XPathPredicate.cpp
WebCore/xml/XPathPredicate.h

index cc54cbc..46320c1 100644 (file)
@@ -1,3 +1,32 @@
+2007-03-05  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Darin.
+
+        http://bugs.webkit.org/show_bug.cgi?id=12954
+        XPath relative operations are implemented incorrectly
+
+        * fast/xpath/4XPath/Core/test_boolean_expr-expected.txt: Added.
+        * fast/xpath/4XPath/Core/test_boolean_expr.html: Added.
+
+        * fast/xpath/4XPath/Borrowed/cz_20030217-expected.txt: Added.
+        * fast/xpath/4XPath/Borrowed/cz_20030217.html: Added.
+        * fast/xpath/4XPath/Borrowed/kd_20010423-expected.txt: Added.
+        * fast/xpath/4XPath/Borrowed/kd_20010423.html: Added.
+        * fast/xpath/4XPath/Borrowed/od_20000608-expected.txt: Added.
+        * fast/xpath/4XPath/Borrowed/od_20000608.html: Added.
+        * fast/xpath/4XPath/Borrowed/resources/od_20000608.xml: Added.
+        * fast/xpath/4XPath/Borrowed/rs_20010831-expected.txt: Added.
+        * fast/xpath/4XPath/Borrowed/rs_20010831.html: Added.
+        * fast/xpath/4XPath/Borrowed/sr_20021217-expected.txt: Added.
+        * fast/xpath/4XPath/Borrowed/sr_20021217.html: Added.
+        Added a bunch of XPath tests that already passed.
+
+        * fast/xpath/4XPath/Borrowed/namespace-nodes-expected.txt: Added.
+        * fast/xpath/4XPath/Borrowed/namespace-nodes.html: Added.
+        * fast/xpath/namespace-nodes-expected.txt: Removed.
+        * fast/xpath/namespace-nodes.html: Removed.
+        Moved a previously imported 4XPath test.
+
 2007-03-05  Rob Buis  <buis@kde.org>
 
         Reviewed by Darin.
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217-expected.txt b/LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217-expected.txt
new file mode 100644 (file)
index 0000000..cdd8fb7
--- /dev/null
@@ -0,0 +1,8 @@
+PASS nodeset.snapshotLength is 1
+PASS nodeset.snapshotLength is 0
+PASS nodeset.snapshotLength is 1
+PASS nodeset.snapshotLength is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217.html b/LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217.html
new file mode 100644 (file)
index 0000000..41efa2e
--- /dev/null
@@ -0,0 +1,54 @@
+<!-- http://mail.python.org/pipermail/xml-sig/2003-February/009070.html -->
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+    SRC = '<?xml version=\'1.0\'?>\
+<alpha>\
+  <beta no="a">\
+    <gamma>\
+      <delta>1</delta>\
+    </gamma>\
+    <delta mark="foo">2</delta>\
+    <gamma mark="bar">\
+      <delta>3</delta>\
+    </gamma>\
+  </beta>\
+  <beta no="b">\
+    <delta>4</delta>\
+    <gamma>\
+      <delta>5</delta>\
+    </gamma>\
+  </beta>\
+</alpha>';
+
+    doc = (new DOMParser).parseFromString(SRC, "application/xml");
+
+    expr = '/alpha/beta[attribute::no = "a"]'
+    nodeset = doc.evaluate(expr, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '1')
+
+    expr = '/alpha/beta[attribute::no = 1]'
+    nodeset = doc.evaluate(expr, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '0')
+
+    expr = '/alpha/beta[@no = "a"]'
+    nodeset = doc.evaluate(expr, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '1')
+
+    expr = '/alpha/beta[@no = 1]'
+    nodeset = doc.evaluate(expr, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '0')
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423-expected.txt b/LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423-expected.txt
new file mode 100644 (file)
index 0000000..528ae10
--- /dev/null
@@ -0,0 +1,5 @@
+PASS actual is "abcabca"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423.html b/LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423.html
new file mode 100644 (file)
index 0000000..c5c68b2
--- /dev/null
@@ -0,0 +1,35 @@
+<!-- https://sourceforge.net/tracker/?func=detail&atid=106473&aid=418317&group_id=6473 -->
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+SRC_1 = '<?xml version="1.0" encoding="utf-8"?>\
+<doc>\
+<elem>abc</elem>\
+<elem><![CDATA[abc]]></elem>\
+<elem>a<![CDATA[b]]>c</elem>\
+</doc>';
+
+    doc = (new DOMParser).parseFromString(SRC_1, "application/xml");
+
+    EXPR = '/doc/elem/text()'
+    nodeset = doc.evaluate(EXPR, doc, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
+    actual = "";
+    while (currNode = nodeset.iterateNext())
+        actual += currNode.nodeValue;
+    
+    // In the original 4Suite test, the expectation was "abcabcabc". I believe it was wrong.
+    shouldBe('actual', '"abcabca"')
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608-expected.txt b/LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608-expected.txt
new file mode 100644 (file)
index 0000000..bf1f7f5
--- /dev/null
@@ -0,0 +1,6 @@
+PASS nodeset.snapshotLength is 0
+PASS nodeset.snapshotLength is 12
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608.html b/LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608.html
new file mode 100644 (file)
index 0000000..a481f3d
--- /dev/null
@@ -0,0 +1,85 @@
+<!-- 
+4XPath Performance test from "Olivier Deckmyn" <odeckmyn.list@teaser.fr>, with import and filename updates
+
+Subject: [4suite] 4XPath performance ?
+Date: Thu, 8 Jun 2000 16:30:21 +0200
+From: "Olivier Deckmyn" <odeckmyn.list@teaser.fr>
+To: "4Suite list" <4suite@dollar.fourthought.com>
+
+I am playing and testing 4XPath....
+And I am a little afraid of the results I see...
+The machine is a Dell Server (2400) with a single PIII-750 and 256MB RAM,
+USCSI disks (10K RPM), running FreeBSD4.
+
+There is a lot of memory, cpu is not used for anything else than the test...
+
+With a 100KB xml file, I have applied the attached test1.py
+
+Here are the results :
+QUERY="//author" (no match in the file)
+Reading document
+took 1.336457 sec
+Starting query
+took 307.572385 sec
+Indexing DOM
+took 0.125362 sec
+Starting query
+took 84.692544 sec
+
+QUERY="//date" (few matches in the file)
+Reading document
+took 1.341848 sec
+Starting query
+took 308.466919 sec
+<date> 10 October 1996</date><date>1 August 1996</date><date>17 April
+1996</date><date> 17 April 1996</date><date> 17 April 1996</date><date> 12
+April 1996</date><date>27 March 1996</date><date>27 March
+1996</date><date>23 February 1996</date><date>9 December 1996</date><date>
+29 November 1996</date><date> 31 October 1996</date>Indexing DOM
+took 0.128668 sec
+Starting query
+took 85.145023 sec
+<date> 10 October 1996</date><date>1 August 1996</date><date>17 April
+1996</date><date> 17 April 1996</date><date> 17 April 1996</date><date> 12
+April 1996</date><date>27 March 1996</date><date>27 March
+1996</date><date>23 February 1996</date><date>9 December 1996</date><date>
+29 November 1996</date><date> 31 October 1996</date>
+
+
+Result :
+Indexing is worth the price ! Very quick index build, and 3.5x speed gain
+...
+But, it very slow anyway :(
+
+Is this the "normal" performance ? Can I do better?
+-->
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+
+    req = new XMLHttpRequest;
+    req.open("GET", 'resources/od_20000608.xml', false);
+    req.send(null);
+    xml_dom_object = req.responseXML;
+
+    EXPR = '//author'
+    nodeset = xml_dom_object.evaluate(EXPR, xml_dom_object, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '0')
+
+    EXPR = '//date'
+    nodeset = xml_dom_object.evaluate(EXPR, xml_dom_object, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '12')
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/resources/od_20000608.xml b/LayoutTests/fast/xpath/4XPath/Borrowed/resources/od_20000608.xml
new file mode 100644 (file)
index 0000000..c7fdeea
--- /dev/null
@@ -0,0 +1,1039 @@
+<?xml version="1.0" encoding='ISO-8859-1'?>
+<telecoms>
+<telecom>
+<lr>Ottawa,</lr>
+<date> 10 October 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-10</para>
+</decision>
+<parties><para><underline>In re:  AGT Limited - Interim Rate Increase 1996, Telecom Decision CRTC 96-4, 19 February 1996</underline></para>
+</parties>
+<text><para>Mr. James A. Wachowich for the Alberta Consumers' Coalition (AltaCC).</para>
+<para>Mr. Bohdan Romaniuk for AGT Limited (AGT).</para>
+<para><underline>TAXATION OF COSTS OF ALTACC</underline></para>
+<para>Taxing Officer:  Jean-Pierre Blais</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to AltaCC in the proceeding leading to <underline>AGT Limited - Interim Rate Increase 1996</underline>, Telecom Decision CRTC 96-4, 19 February 1996 (Decision 96-4).</para>
+</text>
+<text><para>Costs were awarded to AltaCC pursuant to Telecom Costs Order CRTC 96-6, 1 May 1996, in accordance with section 44 of the <underline>CRTC Telecommunications Rules of Procedure</underline>.</para>
+</text>
+<text><para>On 21 May 1996, AltaCC submitted a Bill of Costs for its participation in the proceeding leading to Decision 96-4, claiming a total of $4,306.75 in fees for its legal counsel, a total of $13,417.80 in fees for its two consultants and a total of $448.43 in disbursements.  AltaCC's claim included GST on the fees and the disbursements.  I understand that AltaCC, as opposed to its various member organizations, is not entitled to a GST rebate.</para>
+</text>
+<text><para>In a letter dated 11 June 1996, AGT stated that it acknowledged the costs claimed as reasonable.</para>
+</text>
+<text><para><underline>Counsel and Consultant Fees</underline></para>
+</text>
+<text><para>AltaCC claimed a total of $4,306.75 representing 23 hours of work at a rate of $175 per hour for its legal counsel, Mr. James A. Wachowich.</para>
+</text>
+<text><para>AltaCC also claimed $5,970.60 for its consultant, Mr. Jeffrey A. Jodoin, and $7,447.20, for Mr. Azad P. Merani.  These amounts represent a total of 46.5 hours of work at a rate of $120 per hour for Mr. Jodoin, and a total of 43.5 hours of work at a rate of $160 per hour for Mr. Merani.</para>
+</text>
+<text><para>Mr. Wachowich has been practising law for ten years.  Mr. Jodoin and Mr. Merani have respectively 6 and 14 years of experience as consultants.</para>
+</text>
+<text><para>I note that the rates claimed are in accordance with the rates specified in the Commission's Legal Directorate's <underline>Guidelines for the Taxation of Costs</underline>.  Moreover, I accept these rates as appropriate.  I also find that the hours claimed are reasonable.  Accordingly, I will allow the amounts as claimed.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>AltaCC also claimed $32.55 for photocopies, $34.54 for long distance charges, $352 for fax charges, and $29.34 for GST in relation thereto, for total disbursements of $448.43.  I find that these disbursements are reasonable, and will allow the amounts as claimed.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, including GST, as follows:</para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>Mr. James A. Wachowich        $ 4,306.75</para>
+</text>
+<text><para><underline>Consultants Fees</underline></para>
+</text>
+<text><para>Mr. Jeffrey A. Jodoin               $ 5,970.60</para>
+</text>
+<text><para>Mr. Azad P. Merani                  $ 7,447.20</para>
+</text>
+<text><para><underline>TOTAL FEES</underline>                          $<underline>17,724.55</underline></para>
+</text>
+<text><para><underline>TOTAL DISBURSEMENTS</underline>        $    <underline>448.43</underline></para>
+</text>
+<text><para><underline>TOTAL</underline></para>
+<para><underline>FEES/DISBURSEMENTS</underline>            $<underline>18,172.98</underline></para>
+</text>
+<text><para>Pursuant to Telecom Costs Order CRTC 96-6, the costs as taxed shall be paid by AGT Limited.</para>
+</text>
+<text><para>Jean-Pierre Blais</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa, </lr>
+<date>1 August 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-9</para>
+</decision>
+<parties><para><underline>In re:  Maritime Tel &amp; Tel Limited - Application for Interim and Final Rate Increases for 1995, Telecom Decision CRTC 95-7 and Letter Decision of 21 December 1995</underline></para>
+</parties>
+<text><para>Michael Janigan for the Nova Scotia Consumers' Coalition (NSCC).</para>
+<para>Don MacDonald and David Taylor for Maritime Tel &amp; Tel Limited (MT&amp;T).</para>
+</text>
+<text><para><underline>TAXATION OF COSTS OF NSCC</underline></para>
+</text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to NSCC in the proceedings leading to <underline>Maritime Tel &amp; Tel Limited - Application for Interim Rate Increases and Tariff Notice 501</underline>, Telecom Decision CRTC 95-7, 1 May 1995 and the Commission's Letter Decision of 21 December 1995.  Costs were awarded to NSCC by Telecom Costs Order CRTC 96-7, 23 May 1996, in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.</para>
+</text>
+<text><para>On 21 June 1996, NSCC submitted a Bill of Costs in the amount of $3,696.25, consisting of $3,673.22 in fees and $23.03 in disbursements.  These amounts are inclusive of GST, where applicable.</para>
+</text>
+<text><para>On 3 July 1996, MT&amp;T filed its comments on NSCC's Bill of Costs, indicating that it did not object to the costs claimed, with the exception of the hourly rate charged by NSCC's counsel, Mr. Janigan.  Subsequently, in a letter dated 17 July 1996, MT&amp;T stated that it was withdrawing its objection to the rate claimed on behalf of Mr. Janigan in light of the fact that the rate is in accordance with that set out for counsel of similar experience in the Commission's Legal Directorate's <underline>Guidelines for the Taxation of Costs</underline> (the Guidelines).</para>
+</text>
+<text><para><underline>Counsel and Consultant Fees</underline></para>
+</text>
+<text><para>NSCC claimed a total of 13.2 hours at an hourly rate of $230 for its counsel, Mr. Janigan, and it claimed 3.1 hours at an hourly rate of $160 for its consultant, Mr. Todd.  The rates claimed for both Mr. Janigan and Mr. Todd reflect those specified in the Guidelines, and I will allow the rates as claimed.</para>
+</text>
+<text><para>I also find the number of hours claimed by NSCC for Mr. Janigan and Mr. Todd to be reasonable in light of the nature and extent of NSCC's participation in these proceedings, and I will allow the amounts as claimed.</para>
+</text>
+<text><para>I note, however, that NSCC has claimed 3.5% GST on Mr. Janigan's fees and 7% GST on Mr. Todd's fees.  In light of the 50% GST rebate that I understand is available in the circumstances of this case, I have disallowed half of the GST claimed on Mr. Todd's fees.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>NSCC claimed a total of $23.03 in disbursements.  I am satisfied that these expenses were reasonably and necessarily incurred, and I will allow them as claimed.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of 50% of GST, where applicable, as follows:</para>
+</text>
+<text><para><underline>Fees</underline></para>
+</text>
+<text><para>Mr. Janigan                              $3,142.27</para>
+</text>
+<text><para>Mr. Todd                                    $513.36</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>In-house photocopies                       $4.50</para>
+</text>
+<text><para>Long distance (telephone/fax)           $6.11</para>
+</text>
+<text><para>Courier                                         $12.42</para>
+</text>
+<text><para><underline>Total Fees and</underline></para>
+<para><underline>Disbursements Owing</underline>                <underline>$3,678.66</underline></para>
+</text>
+<text><para>Lori Assheton-Smith</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>  Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa, </lr>
+<date>17 April 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-8</para>
+</decision>
+<parties><para><underline>In re:  Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues, Telecom Decision CRTC 95-21 and Telecom Costs Order CRTC 95-11</underline></para>
+</parties>
+<text><para>Byron Williams, of the Public Interest Law Centre, Legal Aid Manitoba, for the Consumers' Association of Canada (Manitoba) and the Manitoba Society of Seniors (CAC/MSOS).</para>
+</text>
+<text><para>Denis Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</text>
+<text><para><underline>TAXATION OF COSTS OF CAC/MSOS</underline></para>
+</text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to CAC/MSOS in the proceeding leading to <underline>Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues</underline>, Telecom Decision CRTC 95-21, 31 October 1995 (Decision 95-21).  Costs were awarded to CAC/MSOS by Telecom Costs Order CRTC 95-11, 1 November 1995 (Costs Order 95-11), in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.  Costs Order 95-11 provided that costs are to be paid by the respondents identified therein in proportion to their revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+</text>
+<text><para>On 28 November 1995, CAC/MSOS submitted a Bill of Costs in the amount of $78,022.80, consisting of $69,396.85 in fees and $8,625.95 in disbursements.</para>
+</text>
+<text><para>On 13 December 1995, Stentor filed its comments on CAC/MSOS's Bill of Costs.  The remaining respondents did not file comments.  CAC/MSOS filed its reply to Stentor's comments on 19 December 1995.</para>
+</text>
+<text><para><underline>Counsel and Expert Fees</underline></para>
+</text>
+<text><para>CAC/MSOS claimed fees of $42,111.85 for its counsel, consisting of $38,477.85 for Mr. Williams and $3,634.00 for Mr. Peltz.  With respect to Mr. Williams, CAC/MSOS claimed 334.59 hours, consisting of 9.3 hours for attendance at the oral hearing and 325.29 hours for preparation time, at an hourly rate of $115/hour.  CAC/MSOS claimed 15.8 hours of preparation time for Mr. Peltz at an hourly rate of $230/hour.  These rates reflect those set out by the Commission's Legal Directorate in its <underline>Guidelines for the Taxation of Costs</underline> (the Guidelines), and I will allow the rates as claimed.</para>
+</text>
+<text><para>For its expert, Mr. Todd, CAC/MSOS claimed fees of $27,285.00, representing 3 hours of attendance and 157.5 hours of preparation at an hourly rate of $170/hour.  This rate is also in accordance with the rates specified in the Guidelines for expert witnesses, and I accept it as an appropriate rate for Mr. Todd.</para>
+</text>
+<text><para><underline>Preparation and Attendance Time</underline></para>
+</text>
+<text><para>I will allow the attendance time claimed by CAC/MSOS with respect to both Mr. Williams and Mr. Todd.  With respect to the amount of preparation time claimed by CAC/MSOS, Stentor submitted that given the nature and extent of CAC/MSOS's submissions in argument, the combined claim of 143.75 hours for the preparation of argument by counsel and Mr. Todd appears somewhat high and should be reduced.</para>
+</text>
+<text><para>In its reply, CAC/MSOS submitted that the hours claimed for the preparation of argument were reasonable and appropriate given the nature of the proceeding and the issues addressed by CAC/MSOS.  CAC/MSOS noted that there were three rounds of argument in this proceeding, and submitted that it was obliged to expend substantial efforts in each of the oral, written and reply rounds of argument.  CAC/MSOS added that a more extensive closing argument was required, in part, due to the absence of a cross-examination of CAC/MSOS's expert witness by MTS NetCom Inc. (MTS) (formerly Manitoba Telephone System).</para>
+</text>
+<text><para>In my view, rather than focusing on the amount of time claimed by CAC/MSOS for the preparation of argument, it is more useful and appropriate to consider whether CAC/MSOS's total claim for preparation time by its counsel and expert is reasonable.</para>
+</text>
+<text><para>CAC/MSOS claimed a total of 498.59 hours of preparation time for its counsel and expert.  In determining whether this amount is reasonable, I have considered the nature and extent of CAC/MSOS's participation in the proceeding leading to Decision 95-21, the level of experience of CAC/MSOS's counsel and expert and the preparation time allowed for other interveners in this proceeding.</para>
+</text>
+<text><para>I note that CAC/MSOS did not address in argument the full range of issues that were considered in this proceeding.  Instead, CAC/MSOS's participation in this proceeding focused almost exclusively on the form of regulation for MTS, which was one of a number of issues considered in the proceeding leading to Decision 95-21.</para>
+</text>
+<text><para>In contrast, the other interveners that participated in the oral hearing generally addressed a much broader range of issues than did CAC/MSOS.  The Fédération Nationale des Associations de Consommateurs du Québec/National Anti-Poverty Organization (FNACQ/NAPO), who filed evidence on a number of issues and who addressed in some detail most of the issues considered in the proceeding leading to Decision 95-21, was allowed a total of 1,450 hours of preparation time in Taxation Order CRTC 96-6.  The B.C. Old Age Pensioners' Organization et al. (BCOAPO et al.) did not file evidence, but it participated in a broad range of issues through cross-examination and the submission of interrogatories.  In Taxation Order CRTC 96-7, BCOAPO et al. was allowed 500 hours of preparation time for its counsel and consultant, plus an additional 406.5 hours of preparation time for the services of a law student whose time was claimed at an hourly rate of $15.  The Consumers' Association of Canada (CAC) also addressed a broader range of issues than did CAC/MSOS, although at the same time I note that CAC neither filed evidence nor presented oral argument.  In Taxation Order CRTC 96-5, CAC was allowed 34.5 days of preparation time for its counsel and 123 hours of preparation time for its consultant.  Basing time claimed in daily increments on a seven hour day, CAC was allowed a total of 364.5 hours of preparation time.</para>
+</text>
+<text><para>Given the limited focus of CAC/MSOS in this proceeding, and noting the amount of preparation time allowed for other interveners in the same proceeding that participated in a broader range of issues, it appears at first blush that CAC/MSOS's claim of 498.59 hours for preparation time, a large portion of which relates to preparation time for Mr. Williams, is somewhat in excess of what can be considered reasonable and necessary in the circumstances.  However, I note that this was CAC/MSOS's first appearance before the Commission and that counsel for CAC/MSOS is relatively junior.  At the time of the hearing, Mr. Williams had been practising law for only two years, and it is reasonable to assume that he would expend a greater amount of time in preparation than would more experienced counsel, a factor which is reflected in Mr. Williams' lower hourly rate.  I note that counsel for CAC, BCOAPO et al. and FNACQ/NAPO are all considerably more experienced than Mr. Williams, most of them having participated in a number of previous Commission proceedings.  As such, I would expect these interveners to claim less preparation time for equivalent work.  In this regard, I note that while CAC/MSOS focused its participation in this proceeding on only one issue, it addressed that issue in some depth, including through the filing of evidence, the submission of interrogatories, the cross-examination of MTS witnesses and the presentation of oral and written argument.</para>
+</text>
+<text><para>Taking all of the above factors into account, I consider that the preparation time claimed by CAC/MSOS for its counsel and expert is reasonable, and I will allow the time as claimed.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>I wish to state at the outset that CAC/MSOS's taxation submission, and particularly that portion relating to disbursements, was exceptionally well documented.  All disbursement claims were clearly supported by legible receipts, which highlighted precisely the nature and extent of each expense.  Such thorough preparation on the part of the costs applicant greatly expedites the task of the taxing officer, and I encourage other interveners to emulate CAC/MSOS in this regard.</para>
+</text>
+<text><para>In its Bill of Costs, CAC/MSOS claimed disbursements of $8,625.95.  This amount is inclusive of PST, but not GST, as I understand that the Public Interest Law Centre, which represented CAC/MSOS in this proceeding, is exempt from the payment of GST.  I am satisfied that all disbursements were reasonable and necessary and I will allow them as claimed.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of 7% PST, where applicable, as follows:</para>
+</text>
+<text><para><underline>Fees</underline></para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>Mr. Williams                            $38,477.85</para>
+<para>Mr. Peltz                                   $3,634.00</para>
+<para><underline>Expert Fees</underline></para>
+</text>
+<text><para>Mr. Todd                                $27,285.00</para>
+<para><underline>Total Fees</underline>                               <underline>$69,396.85</underline></para>
+<para><underline>Disbursements</underline></para>
+</text>
+<text><para>In-house photocopies                 $1,759.65</para>
+<para>Other photocopies                          $60.46</para>
+<para>Long distance</para>
+<para>(telephone/fax)                          $1,166.25</para>
+<para>Courier                                     $1,555.41</para>
+<para>Postage                                         $97.16</para>
+<para>Air travel                                  $2,328.75</para>
+<para>Baggage Fee                                  $37.45</para>
+<para>Parking                                           $3.50</para>
+<para>Taxi                                            $103.40</para>
+<para>Accommodation                           $947.10</para>
+<para>Compuserv Fee                              $40.86</para>
+<para>Computer Disks                              $29.96</para>
+<para>Meals                                          $496.00</para>
+<para><underline>Total Disbursements</underline>                  <underline>$8,625.95</underline></para>
+<para><underline>Total Fees and</underline></para>
+<para><underline>Disbursements</underline> <underline>Owing</underline>              <underline>$78,022.80</underline></para>
+<para>As noted above, this amount is to be paid by the respondents identified in Costs Order 95-11 in the proportions set out in that order.</para>
+<para>Lori Assheton-Smith</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa,</lr>
+<date> 17 April 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-7</para>
+</decision>
+<parties><para><underline>In re:  Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues, Telecom Decision CRTC 95-21 and Telecom Costs Order CRTC 95-10</underline></para>
+</parties>
+<text><para>Carolyn McCool for the B.C. Old Age Pensioners' Organization, the Council of Senior Citizens' Organizations, West End Seniors' Network, Senior Citizens' Association, Federated Anti-Poverty Groups of B.C. and Local 1-217 IWA Seniors (BCOAPO et al.).</para>
+</text>
+<text><para>Denis Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</text>
+<text><para><underline>TAXATION OF COSTS OF BCOAPO et al</underline>.</para>
+</text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to BCOAPO et al. in the proceeding leading to <underline>Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues</underline>, Telecom Decision CRTC 95-21, 31 October 1995 (Decision 95-21).  Costs were awarded to BCOAPO et al. on a partial basis pursuant to Telecom Costs Order CRTC 95-10, 1 November 1995 (Costs Order 95-10), in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.  In Costs Order 95-10, the Commission determined that BCOAPO et al. is entitled to 75% of its costs of participation in the proceeding leading to Decision 95-21.  The order provided that costs are to be paid by the respondents identified in that order in proportion to their revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+</text>
+<text><para>On 30 November 1995, BCOAPO et al. submitted a Bill of Costs in which it claimed a total of CDN $177,408.53 and US $2,788.33 in costs.  Using a rate of exchange of CDN $1.35 = US $1.00, which is the rate employed by BCOAPO et al.'s U.S. counsel in this case, the total claim amounts to $181,172.78, consisting of $136,430.18 in fees and $44,742.60 in disbursements.  These amounts are inclusive of PST and GST, where applicable.</para>
+</text>
+<text><para>Stentor submitted its comments on BCOAPO et al.'s Bill of Costs on 18 December 1995.  BCOAPO et al. filed its reply on 30 December 1995.</para>
+</text>
+<text><para><underline>Fees</underline></para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>BCOAPO et al. claimed 180.5 hours for its senior legal counsel, Ms. McCool, consisting of 42 hours of time spent in attendance at the oral hearing and 138.5 hours of preparation time, at an hourly rate of $230.  BCOAPO et al. claimed 17 hours for attendance and 136.2 hours for preparation at the same hourly rate for Mr. Blumenfeld.  For its junior counsel, Ms. Kunin, BCOAPO et al. claimed 20 hours of attendance time and 117.3 hours of preparation time at an hourly rate of $115.  The rates claimed by BCOAPO et al. for counsel reflect those set out by the Commission's Legal Directorate in its <underline>Guidelines for the Taxation of Costs</underline> (the Guidelines), and I accept these rates as appropriate.</para>
+</text>
+<text><para><underline>Consultant Fees</underline></para>
+</text>
+<text><para>BCOAPO et al. claimed $28,830.08 in fees for its consultant, Mr. Todd, representing 168.4 hours of preparation time at an hourly rate of $160.  This rate reflects that specified in the Guidelines for consultants of Mr. Todd's experience, and I will allow the rate as claimed.</para>
+</text>
+<text><para><underline>Ms. MacEachern's Fees</underline></para>
+</text>
+<text><para>BCOAPO et al. claimed $9,247.50 in fees for work performed by Ms. MacEachern, a law student at the University of British Columbia, representing 122 hours of attendance time and 494.5 hours of preparation time at an hourly rate of $15.  BCOAPO et al. stated that Ms. MacEachern worked as a researcher and assistant to the legal team in this proceeding, and submitted that the Commission should allow her costs.  BCOAPO et al. noted that there is no specific category in the Guidelines to cover Ms. MacEachern's position, and asked that her fees and disbursements be allowed as an exception to the Guidelines.</para>
+</text>
+<text><para>Stentor recognized that the use by BCOAPO et al. of a law student was a measure taken to save costs.  Therefore, Stentor stated that it had no objection to the awarding of costs <italic>per se</italic> with respect to Ms. MacEachern's work.  Stentor did not comment on the rate claimed for Ms. MacEachern, but it did note that the amount claimed by BCOAPO et al. for Ms. MacEachern did not reconcile with the amount charged by Ms. MacEachern to BCOAPO et al. as demonstrated by the receipts attached to the Bill of Costs.  Stentor also objected to the nature and amount of time claimed by BCOAPO et al. for Ms. MacEachern.</para>
+</text>
+<text><para>In reply, BCOAPO et al. stated that if the amount claimed for Ms. MacEachern does not reconcile with the receipts submitted in support of the claim, reference should be made to the amount displayed in the receipts.</para>
+</text>
+<text><para>I am of the view that in retaining the services of a law student at a low hourly rate, BCOAPO et al. was able to reduce the costs of its participation in the proceeding, and I am prepared to allow an amount for costs incurred in relation to work performed by Ms. MacEachern.  With respect to the appropriate rate for Ms. MacEachern's work, I note that BCOAPO et al. has claimed an hourly rate of $15 for all of the 616.5 hours claimed for Ms. MacEachern.  However, Ms. MacEachern's invoices to BCOAPO et al. indicate that, for work performed prior to 1 April 1995, which amounts to 99 hours, or 16% of the total hours claimed, she charged an hourly rate of $12.50.  For work performed after 1 April 1995, which amounts to 529.5 hours, or 84% of the total hours claimed, Ms. MacEachern charged an hourly rate of $15.  The total claim for Ms. MacEachern's fees, based on the receipts provided, is $9,180.00, representing a total of 628.5 hours.  In the circumstances, I will allow a rate of $12.50 per hour for 16% of the time allowed for Ms. MacEachern and a rate of $15 for 84% of the time allowed for Ms. MacEachern.  I will address below the reasonableness of the time claimed by BCOAPO et al. for Ms. MacEachern.</para>
+</text>
+<text><para><underline>Preparation and Attendance Time</underline></para>
+</text>
+<text><para>Stentor submitted that the number of hours claimed by BCOAPO et al. appears somewhat high, given the nature of BCOAPO et al.'s participation in the proceeding leading to Decision 95-21.  In particular, Stentor noted that BCOAPO et al. did not file evidence or call witnesses.  Consequently, Stentor stated that the number of hours claimed by BCOAPO et al. should be reduced.</para>
+<para>In its reply, BCOAPO et al. stated that Stentor may be right or wrong in its assessment of the reasonableness of the total hours claimed by BCOAPO et al.  To provide a yardstick for comparison, BCOAPO et al. requested that Stentor be required to provide all of its hearing costs that might have been passed on to ratepayers.</para>
+<para>I consider that sufficient relevant information is available to me on the public record to determine whether the time claimed by BCOAPO et al. is reasonable and necessary, without having to obtain similar information from Stentor.</para>
+</text>
+<text></text>
+<text><para>BCOAPO et al. has claimed a total of 201 hours for attendance by its counsel and Ms. MacEachern at the oral hearing.  I am satisfied that this amount is reasonable and I will allow the attendance time claimed for each individual.</para>
+</text>
+<text><para>With respect to the claim for preparation time, consistent with past Taxation Orders, I consider it appropriate to assess the time claimed by BCOAPO et al. on a global basis.  Making an adjustment to the claim for Ms. MacEachern's time to reflect the invoices provided in support of her claim, BCOAPO et al. has claimed a total of 1,066.9 hours of preparation time for its counsel, consultant and Ms. MacEachern.  Of this amount, nearly half, or 506.5 hours, represents preparation time claimed for Ms. MacEachern.</para>
+</text>
+<text><para>In this regard, Stentor submitted that some of the work performed by Ms. MacEachern included filing and organization.  Stentor referred to Article 8 of the Guidelines, which states that costs generally will not be awarded for time spent by the applicant's support staff, administrative staff, officers and directors, acting as such, in connection with the applicant's participation in the proceeding.  Stentor noted its understanding that costs associated with these functions are normally recovered in the rates allowed for counsel, consultants and witnesses, and Stentor questioned whether BCOAPO et al. should be allowed to recover these costs separately through Ms. MacEachern's fees.</para>
+</text>
+<text><para>In reply, BCOAPO et al. submitted that with respect to her filing and general file maintenance work, Ms. MacEachern was not in-house support staff.  BCOAPO et al. contended that the general file maintenance work performed by Ms. MacEachern was work that counsel would otherwise have had to do.</para>
+</text>
+<text><para>I note that previous Taxation Orders have generally disallowed secretarial expenses on the grounds that such expenses are in the nature of overhead.  I consider that, to a large extent, filing and organizational tasks constitute tasks that can be considered to be in the nature of overhead.  In this regard, I note that Ms. MacEachern's time dockets indicate that approximately 100 hours was spent performing filing and organizational tasks.  I am not persuaded that the claim for this time should be allowed merely because these tasks were performed by Ms. MacEachern rather than by Ms. McCool's secretarial staff.  Costs associated with administrative functions are already reflected in the rates allowed for counsel, consultants and expert witnesses, whether such functions are performed in-house by secretarial staff or on contract by a law student.  In the circumstances, I am not prepared to depart from the usual practice of considering these types of expenses to be in the nature of overhead.  Accordingly, I will disallow 100 hours for time claimed for Ms. MacEachern relating to the performance of filing and organizational tasks.</para>
+</text>
+<text><para>In determining whether the remaining preparation time, which amounts to 966.9 hours, is reasonable, I have considered the nature and extent of BCOAPO et al.'s participation in this proceeding, the experience of the claimants for whom costs have been claimed and the amount of time claimed and allowed by other interveners in the proceeding.</para>
+</text>
+<text><para>I note that BCOAPO et al. did not file evidence or call witnesses in this proceeding.  Its participation consisted of the submission of interrogatories, cross-examination of witnesses, and the submission of written and oral argument.  In Taxation Order CRTC 96-5, another intervener that participated in the oral phase of this proceeding, the Consumers' Association of Canada (CAC), was allowed preparation time of 34.5 days for counsel and 123 hours for its consultant.  Based on a seven hour day, the total preparation time allowed for CAC amounts to 364.5 hours.  I note that, like BCOAPO et al., CAC did not file evidence or call witnesses.  I further note, however, that BCOAPO et al. conducted a greater amount of cross-examination on a broader range of issues than did CAC.  I also note that CAC did not present oral argument.  In Taxation Order CRTC 96-6, the Fédération Nationale des Associations de Consommateurs du Québec/National Anti-Poverty Organization (FNACQ/NAPO) was allowed a total of 1,450 hours of preparation time for its counsel, analyst, consultant and experts.  This amount, which excludes preparation time for consultants and expert witnesses relating to the Local Exchange Cost Optimization Model (LECOM) evidence, reflects FNACQ/NAPO's extensive participation in most of the issues being considered by the Commission in the proceeding leading to Decision 95-21.</para>
+</text>
+<text><para>I consider that BCOAPO et al. participated in this proceeding to a greater extent than did CAC, but to a much lesser extent than did FNACQ/NAPO.  In the circumstances, a claim for preparation time of 1,066.9 hours appears to be in excess of what can be considered reasonable and necessary.  I note, however, that a large portion of BCOAPO et al.'s claim for preparation time represents time claimed for Ms. MacEachern.  I am mindful of Ms. MacEachern's inexperience and low hourly rate, and I have taken these factors into consideration in assessing the reasonableness of BCOAPO et al.'s total claim for preparation time.</para>
+</text>
+<text><para>In my view, aside from the hours claimed for tasks performed that were in the nature of overhead, which I have already disallowed, the remaining preparation time claimed for Ms. MacEachern is reasonable.  Accordingly, I will allow 406.5 hours for preparation time for Ms. MacEachern, in addition to 122 hours of attendance time.  Consistent with my earlier determinations regarding the appropriate rates for Ms. MacEachern, I will allow 443.9 hours at a rate of $15 per hour and 84.6 hours at a rate of $12.50 per hour, for a total of $7,716.00.</para>
+</text>
+<text><para>BCOAPO et al.'s claim for preparation time for counsel and Mr. Todd amounts to 560.4 hours.  Absent the claim for Ms. MacEachern's time, I would consider this to be a reasonable amount of time for preparation, given the nature and extent of BCOAPO et al.'s participation in this proceeding.  However, in light of Ms. MacEachern's assistance, I consider that the other individuals for whom BCOAPO et al. has claimed costs should have required less preparation time.  On balance, I consider that 500 hours is a reasonable allowance for preparation time for counsel and Mr. Todd.  I consider that the fairest and most appropriate method of apportioning this amount amongst the individual claimants is to allocate the total time on a pro rata basis.  Accordingly, for preparation time, I will allow 123.5 hours for Ms. McCool, 121.5 hours for Mr. Blumenfeld, 105 hours for Ms. Kunin and 150 hours for Mr. Todd.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>BCOAPO et al. claimed disbursements of CDN $40,978.35 and US $2,788.33.  As noted earlier, in converting the amount claimed into Canadian dollars, I have used a rate of exchange of CDN $1.35=US $1.00.  According to the supporting documentation, this is the rate employed by BCOAPO et al.'s U.S. counsel in this case, and I consider it to be an appropriate rate of exchange for the purposes of this taxation.</para>
+</text>
+<text><para>Stentor noted that BCOAPO et al. claimed costs both for "working meals" and for meals at the <italic>per diem</italic> rate set out in the Guidelines.  Stentor submitted that where an applicant is claiming both the <italic>per diem</italic> rate for meals and meals based on receipts, the applicant should be required to demonstrate that the claims are not duplicated.</para>
+</text>
+<text><para>In its reply, BCOAPO et al. agreed with Stentor that any separate claim for working meals in addition to a <italic>per diem</italic> should be separately justified.  BCOAPO et al. indicated that it would review its file and make any adjustments that are appropriate.</para>
+</text>
+<text><para>I agree with Stentor that an applicant claiming meals on both a <italic>per diem</italic> basis and on the basis of receipts should demonstrate that the claims are not duplicated.  I note that BCOAPO et al. has not filed any further adjustments or submissions with respect to its claim for meal expenses.  In the circumstances, I will disallow the claim for "working meals" in its entirety.</para>
+</text>
+<text><para>With respect to BCOAPO et al.'s claim for accommodation expenses, I note that the receipts submitted in support of this claim indicate that in several instances, the costs of in-suite movies and room service were included in the amount claimed.  I do not consider that hotel movies constitute reasonable and necessary expenditures, and I have deducted these expenses from the total amount claimed.  I have also deducted room service charges from the total claim, since, as noted above, BCOAPO et al. has claimed a <italic>per diem</italic> rate for meals for all claimants.</para>
+</text>
+<text><para>I will allow the balance of the disbursements as claimed.</para>
+</text>
+<text><para><underline>Application of Costs Order 95-10</underline></para>
+</text>
+<text><para>In its letter of 30 November 1995, BCOAPO et al. submitted that, to the extent that Costs Order 95-10 reduced the amount of costs recoverable on the grounds that BCOAPO et al.'s submissions on the issue of affordability were not of assistance, costs claimed for Mr. Blumenfeld, Ms. Kunin and Mr. Todd should not be reduced, as these claimants did little or no work on the issue of affordability.</para>
+</text>
+<text><para>Stentor submitted that BCOAPO et al.'s proposal is unwarranted.  Stentor stated that the Commission, in Costs Order 95-10, found that BCOAPO et al.'s participation did not fully contribute to a better understanding of the issues by the Commission and, as a result, chose to award BCOAPO et al. 75% of its costs of participation.  Stentor submitted that the Taxing Officer must give effect to the unambiguous finding of the Commission in Costs Order 95-10.</para>
+</text>
+<text><para>In reply, BCOAPO et al. argued that the Commission's only stated reason for reducing BCOAPO et al.'s costs in Costs Order 95-10 was its concerns with BCOAPO et al.'s contributions on the affordability issue.  BCOAPO et al. restated its reliance on its original submissions in this regard.</para>
+</text>
+<text><para>In Costs Order 95-10, the Commission determined that it was unable to conclude that all aspects of BCOAPO et al.'s participation in the proceeding leading to Decision 95-21 contributed to a better understanding of the issues by the Commission.  For example, the Commission noted that much of BCOAPO et al.'s cross-examination on the issue of affordability was of limited assistance.  The Commission also noted that it considered that portions of BCOAPO et al.'s final argument failed to contribute to a better understanding of the issues.  In the circumstances, the Commission concluded that BCOAPO et al. should be entitled to 75% of its costs of participation in the proceeding.</para>
+</text>
+<text><para>I am unpersuaded by BCOAPO et al.'s submissions on this issue.  Costs Order 95-10 did not disallow only costs associated with the issue of affordability.  As Stentor notes, had the Commission wished to limit its costs disallowance to costs associated with a particular issue, it could have done so, as it did in Telecom Costs Order CRTC 95-13, 1 November 1995, in which FNACQ/NAPO was denied costs for experts and consultants associated with the LECOM evidence.  In my view, I have no discretion to alter the terms of Costs Order 95-10, which clearly states that BCOAPO et al. is entitled to 75% of its total costs of participation.  Accordingly, I am unable to accede to BCOAPO et al.'s request that the hours allowed for Mr. Blumenfeld, Ms. Kunin and Mr. Todd not be reduced by 25%.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of PST and GST, where applicable, as follows:</para>
+</text>
+<text><para><underline>Fees</underline></para>
+</text>
+<text><para>Ms. McCool                            $43,394.10</para>
+</text>
+<text><para>Mr. Blumenfeld                        $31,855.00</para>
+<para>Ms. Kunin                               $14,375.00</para>
+<para>Mr. Todd                                $25,680.00</para>
+<para>Ms. MacEachern                       $7,716.00</para>
+<para><underline>Total Fees</underline>                             <underline>$123,020.10</underline></para>
+<para><underline>Disbursements</underline></para>
+<para>In-house photocopies                    $777.90</para>
+<para>Other photocopies                     $1,558.66</para>
+<para>Long distance (telephone/fax)        $538.94</para>
+<para>Courier                                     $2,835.50</para>
+<para>Postage                                       $215.49</para>
+<para>Transcripts                                $7,431.15</para>
+<para>Air travel                                $12,585.23</para>
+<para>Airport taxes                                 $60.00</para>
+<para>Parking                                        $158.82</para>
+<para>Taxi                                         $1,175.95</para>
+<para>Accommodation                      $11,739.67</para>
+<para>Meals                                       $4,416.00</para>
+<para>Supplies                                      $446.73</para>
+<para>Fax services                                $371.29</para>
+<para><underline>Total Disbursements</underline>                <underline>$44,311.33</underline></para>
+<para><underline>Sub-tota</underline>l                               <underline>$167,331.43</underline></para>
+<para>Less 25%                               $41,832.86</para>
+<para><underline>Total Fees and</underline></para>
+<para><underline>Disbursements Owing</underline>            <underline>$125,498.57</underline></para>
+<para>As noted above, this amount is to be paid by the respondents identified in Costs Order 95-10 in the proportions set out in that order.</para>
+<para>Lori Assheton-Smith</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa,</lr>
+<date> 17 April 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-6</para>
+</decision>
+<parties><para><underline>In re:  Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues, Telecom Decision CRTC 95-21 and Telecom Costs Order CRTC 95-13</underline></para>
+</parties>
+<text><para>Philippa Lawson for the Fédération Nationale des Associations de Consommateurs du Québec and the National Anti-Poverty Organization (FNACQ/NAPO).</para>
+</text>
+<text><para>Denis Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</text>
+<text><para><underline>TAXATION OF COSTS OF FNACQ/NAPO</underline></para>
+</text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to FNACQ/NAPO in the proceeding leading to <underline>Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues</underline>, Telecom Decision CRTC 95-21, 31 October 1995 (Decision 95-21).</para>
+</text>
+<text><para>In Telecom Costs Order CRTC 95-5, 19 April 1995 (Costs Order 95-5), the Commission granted FNACQ/NAPO an interim award of costs limited to the cost of one hard copy and one electronic copy of the hearing transcript, as well as a maximum of $15,000 for disbursements other than fees or transcripts.  The order directed the respondents to contribute to the interim costs award in proportion to their operating revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+</text>
+<text><para>Final costs were awarded to FNACQ/NAPO on a partial basis by Telecom Costs Order CRTC 95-13, 1 November 1995 (Costs Order 95-13), in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.  In Costs Order 95-13, FNACQ/NAPO was awarded all costs of its participation in the proceeding leading to Decision 95-21, other than costs for fees and disbursements of experts/consultants retained by FNACQ/NAPO for any work conducted in relation to the Local Exchange Cost Optimization Model (LECOM).  Costs Order 95-13 directed each respondent named in Costs Order 95-5 to contribute to the final award of costs in the proportions set out in Costs Order 95-13.</para>
+</text>
+<text><para>On 6 December 1995, FNACQ/NAPO submitted a Final Bill of Costs in the amount of $287,748.85, consisting of $250,076.50 in fees and $37,672.35 in disbursements, of which $20,000 was billed and recovered pursuant to Costs Order 95-5.  These amounts are inclusive of PST and 3.5% GST, in recognition of the 50% GST rebate to which FNACQ/NAPO is entitled in the circumstances of this case. </para>
+</text>
+<text><para>In a letter accompanying the Bill of Costs, FNACQ/NAPO confirmed that the Bill of Costs does not include any time or expenses incurred by its experts or consultants on LECOM related matters.</para>
+</text>
+<text><para>In a letter dated 20 December 1995, Stentor stated that it had no comments on the Affidavit of Disbursements and Bill of Costs filed by FNACQ/NAPO regarding its non-LECOM related costs.</para>
+</text>
+<text><para><underline>Fees</underline></para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>FNACQ/NAPO claimed a total of $102,948.03 in fees for its legal counsel, consisting of $100,198.37 for Ms. Lawson and $2,749.66 for Mr. Janigan.  With respect to Ms. Lawson, FNACQ/NAPO claimed a total of 691.5 hours, consisting of 100 hours for attendance at the oral hearing and 591.5 hours for preparation, at an hourly rate of $140.  For Mr. Janigan, FNACQ/NAPO claimed 1.5 hours of attendance time and 11.5 hours of preparation time at an hourly rate of $230, which, I note, amounts to $3,094.66 with tax, rather than $2,749.66 as claimed by FNACQ/NAPO.  The rates claimed for counsel reflect those set out by the Commission's Legal Directorate in its <underline>Guidelines for the Taxation of Costs</underline> (the Guidelines), and I will allow the rates as claimed.</para>
+</text>
+<text><para><underline>Consultant Fees</underline></para>
+</text>
+<text><para>FNACQ/NAPO claimed a total of $15,218.64 for its consultants, Dr. Berkowitz and Mr. Todd.  This amount represents a claim for Dr. Berkowitz of 56 hours of preparation time at an hourly rate of $160 and a claim for Mr. Todd of half an hour of attendance time and 35.4 hours of preparation time at the same hourly rate.  The rates claimed for Dr. Berkowitz and Mr. Todd are in accordance with the rates specified in the Guidelines for consultants of similar experience, and I will allow the rates as claimed.</para>
+</text>
+<text><para><underline>Analyst Fee</underline></para>
+</text>
+<text><para>FNACQ/NAPO claimed $12,400 for its in-house analyst, Ms. Vallée, consisting of 9 days for attendance and 22 days of preparation, at a daily rate of $400.  Again, the rate claimed is consistent with that set out in the Guidelines, and I will accept it as an appropriate rate for work conducted by Ms. Vallée in her capacity as a telecommunications analyst.  I will consider below the rate claimed for work performed by Ms. Vallée in her capacity as an expert witness.</para>
+</text>
+<text><para><underline>Expert Witness Fees</underline></para>
+</text>
+<text><para>FNACQ/NAPO claimed a total of $119,510 in fees for its expert witnesses, Dr. Cooper, Mr. Montgomery, Mr. Pollard and Ms. Vallée, all of which related to work performed in preparation for the oral hearing.  FNACQ/NAPO claimed 242 hours for Dr. Cooper, 122.7 hours for Mr. Montgomery, 175.2 hours for Mr. Pollard and 163 hours for Ms. Vallée.  With respect to all of these experts, FNACQ/NAPO claimed an hourly rate of $170.  This rate reflects the rate set out in the Guidelines for the participation by an expert witness for a purpose other than testifying.  In this regard, I note that neither Ms. Vallée nor Mr. Pollard testified in this proceeding in relation to matters for which costs are presently being claimed by FNACQ/NAPO.  Accordingly, I accept $170/hour as an appropriate rate for these two expert witnesses.</para>
+</text>
+<text><para>With respect to Dr. Cooper and Mr. Montgomery, I note that while these two experts attended the hearing for the purpose of testifying, ultimately, and on very short notice, they were informed that they were not required to testify.  In my view, Dr. Cooper and Mr. Montgomery had a reasonable expectation that they would be required to set aside at least one day for the purpose of testifying at the hearing.  In the circumstances, and based on a seven hour hearing day, I consider it appropriate that seven of the hours claimed by each of these experts be awarded at the daily rate of $1,300, which is the rate set out in the Guidelines for attendance by an expert at an oral hearing in order to testify.  With respect to the remaining preparation time claimed by FNACQ/NAPO for Dr. Cooper and Mr. Montgomery, which amounts to 235 hours and 115.7 hours, respectively, I find that the rate of $170/hour is reasonable.</para>
+</text>
+<text><para><underline>Preparation and Attendance Time</underline></para>
+</text>
+<text><para>Turning first to the question of attendance time, I note that FNACQ/NAPO has claimed 100 hours of attendance time for Ms. Lawson, 1.5 hours for Mr. Janigan, and 9 days for Ms. Vallée.  I will allow these claims.  As noted earlier, I will also allow 1 day of attendance time for each of Dr. Cooper and Mr. Montgomery.</para>
+</text>
+<text><para>In addressing the reasonableness of the preparation time claimed by FNACQ/NAPO, consistent with past Taxation Orders, I consider it appropriate to assess the time claimed by FNACQ/NAPO on a global basis.  In this regard, I note that FNACQ/NAPO has claimed a total of 1,397.8 hours of preparation time for its counsel, experts and consultants, and 22 days of preparation time for its analyst, Ms. Vallée.  Basing the time claimed in daily increments on a 7 hour day, FNACQ/NAPO's total claim for preparation time amounts to 1,551.8 hours.  As I have already allowed 14 hours for Dr. Cooper and Mr. Montgomery as attendance time, the total preparation time remaining amounts to 1,537.8 hours.</para>
+</text>
+<text><para>In determining whether the preparation time claimed by FNACQ/NAPO is reasonable and necessary, I consider that an appropriate benchmark for comparison is the proceeding that led to <underline>Review of Regulatory Framework</underline>, Telecom Decision CRTC 94-19, 16 September 1994 (Decision 94-19).  In my view, the proceeding that led to Decision 94-19 was generally comparable to that which led to Decision 95-21.  I note that the hearing in the latter proceeding was shorter, but I also note that it raised issues that were somewhat more complex and more technically difficult than those raised in the proceeding leading to Decision 94-19.</para>
+</text>
+<text><para>I note that FNACQ and NAPO participated separately in the proceeding that led to Decision 94-19.  In Taxation Order CRTC 1994-13, NAPO was allowed a total of 800 hours of preparation time for its participation in that proceeding, while the taxing officer in Taxation Order CRTC 1994-12 allowed 292 hours of preparation time for FNACQ in relation to the same proceeding.  In aggregate, FNACQ and NAPO were allowed a total of 1,092 hours of preparation time for their participation in the proceeding that led to Decision 94-19.</para>
+</text>
+<text><para>In my view, FNACQ/NAPO's participation in this proceeding was considerably more extensive than the combined participation of FNACQ and NAPO in the proceeding leading to Decision 94-19.  In particular, FNACQ/NAPO filed more evidence in this proceeding, relating to a broader range of issues that were generally more technically complex than those that were considered in the proceeding that led to Decision 94-19.  At the same time, I am aware that the amount of preparation time claimed does not include additional time for work performed by experts and consultants relating to the LECOM evidence, although I note that it does include time spent by counsel for FNACQ/NAPO in relation to that evidence.  I further note that FNACQ/NAPO's co-ordination of efforts in this case should have reduced redundancy and resulted in a more efficient use of resources.  In the circumstances, I consider that 1,450 hours of preparation time is appropriate.</para>
+</text>
+<text><para>In apportioning the preparation time amongst the claimants, I am of the view that Mr. Janigan's preparation time of 11.5 hours is reasonable.  With respect to Ms. Lawson's preparation time, I note that, according to the time dockets submitted for Ms. Lawson, it appears that FNACQ/NAPO has claimed Ms. Lawson's travel time on 24 and 26 April 1995.  I note that the Guidelines suggest that time spent travelling <italic>per se</italic> will not be allowed, although a claimant may be allowed costs for work performed in relation to the proceeding while in transit.  The time dockets submitted suggest that it is Ms. Lawson's travel time <italic>per se</italic>  that is being claimed in this case, and not time for work that was done in transit.  I do not consider the claim for this time to be reasonable or necessary, and I will disallow the 10 hours claimed in this regard.</para>
+</text>
+<text><para>With respect to Mr. Todd's time, in the letter which accompanied its Final Bill of Costs, FNACQ/NAPO noted that Mr. Todd worked for three separate interveners in this proceeding, and provided a breakdown of the time that Mr. Todd spent working for each client.  FNACQ/NAPO submitted that this breakdown of Mr. Todd's time indicates that he has not double-billed for any of his time.  Having reviewed the claims for Mr. Todd's time by the three interveners in question, I am satisfied that Mr. Todd has not double-billed.  Subject to a slight reduction in the claim for his hours resulting from a reduction in the global claim for FNACQ/NAPO, I will allow the hours requested for Mr. Todd.</para>
+</text>
+<text><para>In apportioning the remaining preparation time, I consider that the fairest and most appropriate method is to prorate the time claimed for each individual.  Accordingly, I will allow 551 hours for Ms. Lawson, 53 hours for Dr. Berkowitz, 34.5 hours for Mr. Todd, 223 hours for Dr. Cooper, 109 hours for Mr. Montgomery, 167 hours for Mr. Pollard and 21 days for Ms. Vallée in her capacity as a telecommunications analyst and 154 hours for her work as an expert witness.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>FNACQ/NAPO claimed a total of $37,672.35 in disbursements.  Of this amount, $20,000 has been billed and recovered pursuant to Costs Order 95-5, leaving an outstanding claim for $17,672.35.  I note that, according to my addition of the figures contained in the supporting documentation, the actual amount of disbursements claimed by FNACQ/NAPO is $39,190.57.</para>
+</text>
+<text><para><underline>Meal Expenses</underline></para>
+</text>
+<text><para>FNACQ/NAPO has claimed $488.34 for meals that were paid for by the law firm that represented FNACQ/NAPO in this proceeding, the Public Interest Advocacy Centre (PIAC).  Two of the receipts submitted in support of this claim, for meals on the 11th and 12th of June 1995, do not indicate on whose behalf the expense is being claimed.  In the absence of such information, and in light of the fact that FNACQ/NAPO has claimed meals on a per diem basis for several individuals, it is impossible for me to determine whether the costs of these meals were reasonably and necessarily incurred.  Accordingly, I will disallow these two claims in their entirety.  I also note that receipts for two meals on 31 May 1995 indicate that the claims were in part related to Ms. Vallée, for whom it appears FNACQ/NAPO has claimed a per diem rate for meals on the same day.  Similarly, I note that a meal claim for 1 June 1995 has been made for Mr. Montgomery, for whom FNACQ/NAPO has also claimed a per diem meal rate.  To avoid double compensation, I have disallowed the amounts claimed by FNACQ/NAPO for Ms. Vallée and Mr. Montgomery on the dates in question.  In Ms. Vallée's case, I have arrived at the amount to be disallowed by dividing the total of each receipt by the number of persons who consumed the meals in question.</para>
+</text>
+<text><para>A review of the receipts also indicates that in a number of cases, meal expenses have been claimed for Ms. Lawson for meals that were consumed in the National Capital Region, in which Ms. Lawson's office is located.  In Taxation Order CRTC 1995-6, the taxing officer disallowed similar meal claims for Ms. Lawson on the grounds that meal expenses are generally only necessarily incurred by individuals when they are away from home on business matters.  I also note that the Guidelines indicate that meal expenses will generally only be allowed in connection with hearings or meetings which take place at a distance greater than 50 kilometres from the regular place of work of the person who makes the disbursements.</para>
+</text>
+<text><para>I recognize that counsel may find it useful and necessary, particularly during a lengthy oral hearing, to consult over the course of a meal with out-of-town expert witnesses or consultants about matters relating to the proceeding in question.  In such circumstances, provided that the number of meals and the amounts involved for each meal are reasonable, I am prepared to consider this type of expense as a reasonable and necessary expenditure.  In this regard, I note that only three meals have been claimed for Ms. Lawson in connection with lunch or dinner meetings involving consultants or expert witnesses who were not resident in the National Capital Region, and the amounts involved in each case appear to be reasonable.  Accordingly, I will allow these claims.  However, I do not consider that claims for two meals that relate solely to Ms. Lawson and that were consumed in the National Capital Region constitute reasonable and necessary expenditures.  Therefore, I have disallowed these claims.  I find the balance of the meal expenses incurred by PIAC to be reasonable.  In the circumstances, I will allow a total of $268.97, inclusive of 3.5% GST, for meal expenses incurred by PIAC.</para>
+</text>
+<text><para><underline>Accommodations</underline></para>
+</text>
+<text><para>Receipts submitted in support of expenses incurred by PIAC for Ms. Vallée's accommodation indicate that FNACQ/NAPO has double-counted one night of Ms. Vallée's accommodation.  I have reduced the claim accordingly.</para>
+</text>
+<text><para><underline>Other Matters</underline></para>
+</text>
+<text><para>I note that FNACQ/NAPO has subtracted $447.74 from its disbursements claim, representing costs that were denied in Costs Order 95-13.  FNACQ/NAPO did not specify in any detail to which disbursements this amount relates, making it difficult for me to verify whether the correct amount was deducted.  However, as FNACQ/NAPO has stated that its Final Bill of Costs does not include any expenses incurred by Drs. Gabel, Kennet or Mr. Pollard on LECOM matters, and has provided an affidavit of disbursements swearing to the expenditures claimed, I am prepared to accept that the amount deducted is appropriate.</para>
+</text>
+<text><para>I will allow the remaining disbursements as claimed.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of PST and 50% of GST, where applicable, as follows:</para>
+</text>
+<text><para><underline>Fees</underline></para>
+</text>
+<text><para><underline>Counsel</underline></para>
+</text>
+<text><para>Ms. Lawson                            $94,329.90</para>
+</text>
+<text><para>Mr. Janigan                              $3,094.66</para>
+</text>
+<text><para><underline>Consultants/Analyst</underline></para>
+</text>
+<text><para>Dr. Berkowitz                           $8,776.80</para>
+</text>
+<text><para>Mr. Todd                                  $5,713.20</para>
+</text>
+<text><para>Ms. Vallée                              $12,000.00</para>
+</text>
+<text><para><underline>Experts</underline></para>
+</text>
+<text><para>Dr. Cooper                              $39,210.00</para>
+</text>
+<text><para>Mr. Montgomery                     $19,830.00</para>
+</text>
+<text><para>Mr. Pollard                              $28,390.00</para>
+</text>
+<text><para>Ms. Vallée                              $26,180.00</para>
+</text>
+<text><para><underline>Total Fees</underline>                             <underline>$237,524.56</underline></para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>In-house photocopies                 $1,509.75</para>
+</text>
+<text><para>Other photocopies                     $4,041.82</para>
+</text>
+<text><para>Long distance(telephone/fax)      $2,008.45</para>
+</text>
+<text><para>Courier                                     $3,436.45</para>
+</text>
+<text><para>Postage                                       $690.44</para>
+</text>
+<text><para>Transcripts                                $9,292.23</para>
+</text>
+<text><para>Air travel                                     $638.55</para>
+</text>
+<text><para>Train travel                                  $270.38</para>
+</text>
+<text><para>Taxi                                            $527.17</para>
+</text>
+<text><para>Accommodation                        $3,758.60</para>
+</text>
+<text><para>Access Request                            $119.03</para>
+</text>
+<text><para>Survey Assistance                        $103.50</para>
+</text>
+<text><para>Supplies                                      $621.44</para>
+</text>
+<text><para>Translation                                $1,964.11</para>
+</text>
+<text><para>Meals                                          $268.97</para>
+</text>
+<text><para>Dr. Cooper's expenses               $1,953.16</para>
+</text>
+<text><para>Mr. Montgomery's expenses          $858.88</para>
+</text>
+<text><para>Mr. Pollard's expenses               $4,920.33</para>
+</text>
+<text><para>Mr. Todd's expenses                      $84.87</para>
+</text>
+<text><para>Ms. Vallée's expenses                $2,859.38</para>
+</text>
+<text><para><underline>Total Disbursements</underline>                <underline>$39,927.51</underline></para>
+</text>
+<text><para><underline>Sub-total</underline>                               <underline>$277,452.07</underline></para>
+</text>
+<text><para>Less Costs Not Recoverable</para>
+<para>Pursuant to Costs Order 95-13      $447.74</para>
+</text>
+<text><para>Less Costs Already</para>
+<para>Recovered                               $20,000.00</para>
+</text>
+<text><para><underline>Total Fees and</underline></para>
+<para><underline>Disbursements Owing</underline>            <underline>$257,004.33</underline></para>
+</text>
+<text><para>As noted above, this amount is to be paid by the respondents identified in Costs Order 95-13 in the proportions set out in that order.</para>
+<para>Lori Assheton-Smith</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>  Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa,</lr>
+<date> 12 April 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-5</para>
+<para><underline></underline></para>
+</decision>
+<parties><para>In re:  Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues, Telecom Decision CRTC 95-21 and Telecom Costs Order CRTC 95-12</para>
+</parties>
+<text><para>Rosalie Daly Todd for the Consumers' Association of Canada (CAC).</para>
+</text>
+<text><para>Denis Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</text>
+<text><para><underline></underline></para>
+</text>
+<text><para>TAXATION OF COSTS OF CAC</para>
+</text>
+<text></text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to CAC in the proceeding leading to <underline>Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues</underline>, Telecom Decision CRTC 95-21, 31 October 1995 (Decision 95-21).</para>
+</text>
+<text><para>In Telecom Costs Order CRTC 95-6, 18 May 1995 (Costs Order 95-6), the Commission granted CAC an interim award of costs limited to the cost of a single copy of the hearing transcript, as well as a maximum of $7,500 for disbursements other than fees or transcripts.  The order directed the respondents to contribute to the interim costs award in proportion to their operating revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+</text>
+<text><para>Final costs were awarded to CAC by Telecom Costs Order CRTC 95-12, 1 November 1995 (Costs Order 95-12), in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.  Costs Order 95-12 directed each respondent named in Costs Order 95-6 to contribute to the final award of costs in the proportions set out in Costs Order 95-12.</para>
+</text>
+<text><para>On 13 December 1995, CAC submitted a Final Bill of Costs in the amount of $59,848.36, consisting of $48,465.60 in fees and $11,382.76 in disbursements, of which $10,205.60 was billed and recovered under the terms of Costs Order 95-6.  These amounts are inclusive of PST and 3.5% GST, in recognition of the 50% GST rebate to which CAC is entitled in the circumstances of this case.</para>
+</text>
+<text><para>I note that, according to my calculations, the total amount of disbursements included in the Summary Statement of Disbursements submitted by CAC is $11,758.01, rather than $11,382.76, bringing the total amount claimed in the Final Bill of Costs to $60,223.61.</para>
+</text>
+<text><para>In a letter dated 20 December 1995, Stentor indicated that it had no comments on the Affidavit of Disbursements and Final Bill of Costs submitted by CAC.  The remaining respondents did not file comments.</para>
+<para><underline></underline></para>
+</text>
+<text><para>Counsel and Expert Fees</para>
+</text>
+<text><para>CAC claimed fees of $27,600.00 for its in-house counsel, Ms. Rosalie Daly Todd, and $20,865.60 for its consultant, Mr. Robert Chouinard.  With respect to Ms. Daly Todd, CAC claimed a total of 46 days, consisting of 11.5 days for attendance at the oral hearing and 34.5 days for preparation, at a daily rate of $600.  For Mr. Chouinard, CAC claimed 3 hours for attendance and 123 hours for preparation at an hourly rate of $160.  The rates claimed reflect those set out by the Commission's Legal Directorate in its <underline>Guidelines for the Taxation of Costs</underline>, and I will accept these rates as appropriate.</para>
+</text>
+<text><para>I also find the time claimed by CAC for Ms. Daly Todd and Mr. Chouinard to be reasonable given the nature and extent of CAC's participation in this proceeding.  Accordingly, I will allow the amounts as claimed.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>As noted earlier, my calculations indicate that the total amount of disbursements claimed in CAC's Summary Statement of Disbursements is $11,758.01, of which $10,205.60 has already been recovered pursuant to Costs Order 95-6.</para>
+</text>
+<text><para>I am satisfied that the disbursements claimed by CAC were reasonably and necessarily incurred, and I will allow the amount claimed subject to the following adjustments for PST and GST.</para>
+</text>
+<text><para>CAC has claimed 3.5% GST on its disbursements for in-house photocopies and for Mr. Chouinard's automobile travel.  I note that there is nothing in the supporting documentation to indicate that GST was either paid or payable on these expenses.  Therefore, I have deducted the amount claimed in this regard from CAC's total claim.</para>
+</text>
+<text><para>CAC has also claimed 8% PST on its courier expenses.  Again, the receipts submitted in support of this claim suggest that PST was neither paid nor payable on these disbursements, and I have reduced CAC's claim accordingly.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of PST and 50% of GST, where applicable, as follows:</para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>Ms. Daly Todd                         $27,600.00</para>
+</text>
+<text><para><underline>Consultant Fees</underline></para>
+</text>
+<text><para>Mr. Robert Chouinard               $20,865.60</para>
+</text>
+<text><para><underline>Total Fees</underline>            $</para>
+</text>
+<text><para><underline>48,465.60</underline></para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>In-house photocopies                    $425.85</para>
+</text>
+<text><para>Long distance (telephone/fax)        $274.47</para>
+</text>
+<text><para>Courier                                        $252.25</para>
+</text>
+<text><para>Supplies                                        $69.76</para>
+</text>
+<text><para>Transcripts                                $6,914.32</para>
+</text>
+<text><para>Travel                                       $1,680.00</para>
+</text>
+<text><para>Parking                                          $72.96</para>
+</text>
+<text><para>Taxi                                              $18.96</para>
+</text>
+<text><para>Accommodation                        $1,035.62</para>
+</text>
+<text><para>Meal Allowance                           $912.00</para>
+</text>
+<text><para><underline>Total Disbursements</underline>           <underline>$11,656.19</underline></para>
+</text>
+<text><para><underline>Sub-total</underline>                  $<underline>60,121.79</underline></para>
+</text>
+<text><para>Less costs already recovered    $10,205.60</para>
+</text>
+<text><para><underline></underline></para>
+</text>
+<text><para>Total Fees and</para>
+<para><underline>Disbursements Owing</underline>              $<underline>49,916.19</underline></para>
+</text>
+<text><para>As noted above, this amount is to be paid by the respondents identified in Costs Order 95-12 in the proportions set out in that order.</para>
+</text>
+<text><para>Lori Assheton-Smith</para>
+</text>
+<text><para>Legal Counsel</para>
+</text>
+<text><para>Canadian Radio-television and</para>
+<para>  Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa, </lr>
+<date>27 March 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-4</para>
+</decision>
+<parties><para><underline>In re:  Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues, Telecom Decision CRTC 95-21 and Telecom Costs Order CRTC 95-9</underline></para>
+</parties>
+<text><para>James Wachowich for the Alberta Consumers' Coalition (AltaCC).</para>
+</text>
+<text><para>Denis Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</text>
+<text><para><underline>TAXATION OF COSTS OF ALTACC</underline></para>
+</text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order consitutes the taxation of costs awarded to AltaCC in the proceeding leading to <underline>Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues</underline>, Telecom Decision CRTC 95-21, 31 October 1995 (Decision 95-21).  Costs were awarded to AltaCC by Telecom Costs Order CRTC 95-9, 1 November 1995 (Costs Order 95-9), in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.  Costs Order 95-9 provided that AltaCC is entitled to 50% of its costs in the proceeding leading to Decision 95-21, and further provided that these costs are to be paid by each respondent in proportion to its revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+</text>
+<text><para>On 30 November 1995, AltaCC submitted a Bill of Costs in the amount of $83,149.52, consisting of $79,602.65 in fees and $3,546.87 in disbursements.  On 6 December 1995, AltaCC filed a revised Bill of Costs to correct errors in the original Bill of Costs relating to the rates and hours of the consultants.  In its revised Bill of Costs, AltaCC claimed $69,942.65 in fees and $3,546.87 in disbursements.  These amounts are inclusive of 7% GST.</para>
+</text>
+<text><para>On 13 December 1995, Stentor filed written comments on AltaCC's Bill of Costs, indicating that it had no objection to the claim.  The remaining respondents did not file comments.</para>
+</text>
+<text><para><underline>Fees and Time Allocations</underline></para>
+</text>
+<text><para>AltaCC claimed 109 hours at an hourly rate of $175 for its counsel, Mr. James Wachowich.  For its consultant, Mr. Jeffrey Jodoin, AltaCC claimed 294 hours at an hourly rate of $120, and for its consultant, Mr. A. Merani, it claimed 69 hours at an hourly rate of $160.</para>
+</text>
+<text><para>I note that the rates claimed by AltaCC for its counsel and consultants reflect those set out by the Commission's Legal Directorate in its <underline>Guidelines for the Taxation of Costs</underline>, and I will allow the rates as claimed.</para>
+</text>
+<text><para>In determining whether the time claimed by AltaCC can be said to be reasonable and necessary, consistent with previous taxation orders, I am of the view that it is appropriate to consider the time claimed by AltaCC on a global basis.  In this regard, I note that AltaCC has claimed a total of 472 hours for its counsel and consultants.  In my view, this is excessive given the extent of AltaCC's participation in the proceeding that led to Decision 95-21.  AltaCC prepared interrogatories and filed written argument in the proceeding, but it did not file any evidence, nor did it attend the oral hearing.  Another intervener in the same proceeding, the Consumer Policy Institute (CPI), neither filed evidence nor attended the oral hearing, and claimed a total of 54.6 hours for its participation in the proceeding.  I note that AltaCC, unlike CPI, drafted and submitted interrogatories in this proceeding.  I further note that AltaCC submitted written argument that was considerably more detailed and which touched on a much broader range of issues than that of CPI.  Nevertheless, in light of the nature and extent of AltaCC's participation in this proceeding, and particularly in light of the fact that AltaCC neither submitted evidence nor participated in the oral hearing, I consider AltaCC's claim of 472 hours to be far in excess of what was reasonable or necessary in the circumstances.  In my view, a total time allowance of 350 hours is more appropriate.</para>
+</text>
+<text><para>In apportioning the time allowed amongst AltaCC's counsel and consultants, I note that the bulk of AltaCC's hours were claimed by its consultant, Mr. Jodoin.  In my view, Mr. Jodoin's claim of 294 hours cannot be viewed as reasonable and necessary given AltaCC's level of participation in this proceeding.  In particular, I find Mr. Jodoin's claim of 155 hours for reviewing the file to be excessive in the circumstances.  Again, by way of comparison, another intervener in this proceeding, the Consumers' Association of Canada, claimed a total of 126 hours for its consultant, whereas the B.C. Old Age Pensioners' Organization et al. claimed a total of 168.4 hours for its consultant.  The extent of participation of both of these interveners in this proceeding was considerably greater than that of AltaCC.  At the same time, I note that Mr. Jodoin is a fairly junior consultant, who can be expected to require more time to familiarize himself with the issues, and who in turn claims a lower hourly rate.</para>
+</text>
+<text><para>In light of all of these considerations, I will allow 190 hours for Mr. Jodoin.  With respect to Mr. Wachowich and Mr. Merani, I consider that the fairest and most appropriate manner in which to appropriate the remaining time is to prorate the time claimed for each of these individuals.  Accordingly, I will allow 97.6 hours for Mr. Wachowich and 62.4 hours for Mr. Merani.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>AltaCC claimed disbursements of $3,546.87.  I consider this amount to be reasonable and I will allow the disbursements as claimed.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of GST, as follows:</para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>Mr. James Wachowich             $18,275.60</para>
+</text>
+<text><para><underline>Consultant Fees</underline></para>
+</text>
+<text><para>Mr. J. Jodoin                          $24,396.00</para>
+</text>
+<text><para>Mr. A. Merani                          $10,682.88</para>
+</text>
+<text><para><underline>Total Fees</underline>                               <underline>$53,355.08</underline></para>
+</text>
+<text><para><underline>Consultants' Disbursements</underline></para>
+</text>
+<text><para>Photocopies                                   $52.32</para>
+</text>
+<text><para>Fax charges                                 $974.77</para>
+</text>
+<text><para><underline>Other Disbursements</underline></para>
+</text>
+<text><para>Photocopies                                 $204.48</para>
+</text>
+<text><para>Fax charges                              $2,000.90</para>
+</text>
+<text><para>Long distance telephone</para>
+<para>and fax                                       $301.29</para>
+</text>
+<text><para>Postage                                         $13.11</para>
+</text>
+<text><para><underline>Total Disbursements</underline>                  <underline>$3,546.87</underline></para>
+</text>
+<text><para><underline>Sub-total</underline>                                 <underline>$56,901.35</underline></para>
+</text>
+<text><para>Less 50%                               $28,450.68</para>
+</text>
+<text><para><underline>Total Fees and</underline></para>
+<para><underline>Disbursements Owing</underline>              <underline>$28,450.68</underline></para>
+</text>
+<text><para>As noted above, this amount is to be paid by the respondents to Costs Order 95-9 in the proportions set out in that order.</para>
+<para>Lori Assheton-Smith</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>  Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa, </lr>
+<date>27 March 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-3</para>
+</decision>
+<parties><para><underline>In re:  Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues, Telecom Decision CRTC 95-21 and Telecom Costs Order CRTC 95-8</underline></para>
+</parties>
+<text><para>Michael Koch for the Consumer Policy Institute (CPI).</para>
+</text>
+<text><para>Denis Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</text>
+<text><para><underline>TAXATION OF COSTS OF CPI</underline></para>
+</text>
+<text><para>Taxing Officer:  Lori Assheton-Smith</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to CPI in the proceeding leading to <underline>Implementation of Regulatory Framework - Splitting of the Rate Base and Related Issues</underline>, Telecom Decision CRTC 95-21, 31 October 1995.  Costs were awarded to CPI by Telecom Costs Order CRTC 95-8, 1 November 1995 (Costs Order 95-8), in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.  That order provided that costs were to be paid by each respondent identified therein in proportion to its revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+</text>
+<text><para>On 29 November 1995, CPI submitted a Bill of Costs in the amount of $11,351.97, consisting of $9,889.41 in fees and $1,462.56 in disbursements.  These amounts are inclusive of 8% PST, where applicable, and 3.5% GST, in recognition of the 50% GST rebate available in the circumstances of this case.</para>
+</text>
+<text><para>On 13 December 1995, Stentor filed written comments on CPI's Bill of Costs, indicating that it had no objection to the claim.  The remaining respondents did not file comments.</para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>CPI claimed 54.6 hours for its counsel at an hourly rate of $175.  I note that this rate reflects the rate specified in the Commission's Legal Directorate's <underline>Guidelines for the Taxation of Costs</underline> for counsel of Mr. Koch's experience, and I will allow the rate as claimed.</para>
+</text>
+<text><para>I also find the number of hours claimed by CPI for its counsel to be reasonable in light of the nature and extent of CPI's participation in this proceeding, and I will allow the amount as claimed.</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>I note that CPI has claimed both GST and PST on all of its disbursements other than in-house photocopies.  However, with the exception of one receipt for external photocopy expenses, there is nothing on the face of the receipts submitted in support of the claim to indicate that PST was either paid or payable on these disbursements.  In the absence of such documentation, I will disallow the 8% PST claimed on disbursements where it is not clear that PST has been paid or is payable.</para>
+</text>
+<text><para>I also note that CPI appears to have double counted the GST and PST on one of its external photocopy claims.  The credit card receipt submitted in support of this claim shows that a total of $179.46 was billed to the credit card, suggesting that taxes were included in this total.  Therefore, I will disallow the GST and PST that CPI has added to this amount.</para>
+</text>
+<text><para>The remaining disbursements appear to be reasonable and I will allow them as claimed.</para>
+</text>
+<text><para><underline>Costs as Taxed</underline></para>
+</text>
+<text><para>I hereby tax the fees and disbursements, inclusive of PST and 50% of GST, where applicable, as follows:</para>
+</text>
+<text><para><underline>Counsel Fees</underline></para>
+</text>
+<text><para>Michael Koch                            $9,889.43</para>
+</text>
+<text><para><underline>Disbursements</underline></para>
+</text>
+<text><para>In-house photocopies                    $637.20</para>
+</text>
+<text><para>Other photocopies                        $365.65</para>
+</text>
+<text><para>Long distance telephone/fax          $260.88</para>
+</text>
+<text><para>Courier                                          $85.65</para>
+</text>
+<text><para>Postage                                         $23.32</para>
+</text>
+<text><para><underline>Total Fees and</underline></para>
+<para><underline>Disbursements</underline>                        $<underline>11,262.11</underline></para>
+</text>
+<text><para>This amount is to be paid by the respondents to Costs Order 95-8 in the proportions set out in that order.</para>
+</text>
+<text><para>Lori Assheton-Smith</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>   Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa, </lr>
+<date>23 February 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-1</para>
+</decision>
+<parties><para>In re: Provision of Directory Database Information and Real-Time Access to Directory Assistance Databases, Telecom Decision CRTC 95-3, 8 March 1995, and White Directory - Application to Review and Vary Decision 95-3, Telecom Decision CRTC 95-14, 27 June 1995</para>
+</parties>
+<parties><para>Marie Vallée for the Fédération nationale des associations de consommateurs du Québec (FNACQ).</para>
+</parties>
+<parties><para>Denis E. Henry for Stentor Resource Centre Inc. (Stentor).</para>
+</parties>
+<text><para><underline>TAXATION OF COSTS OF FNACQ</underline></para>
+</text>
+<text><para>Taxing Officer: Geoff Batstone</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to FNACQ in the proceedings leading to <underline>Provision of Directory Database Information and Real-Time Access to Directory Assistance Databases</underline>, Telecom Decision CRTC 95-3, 8 March 1995 (Decision 95-3) and <underline>White Directory - Application to Review and Vary Decision 95-3</underline>, Telecom Decision CRTC 95-14, 27 June 1995 (Decision 95-14).</para>
+<para>Costs were awarded to FNACQ pursuant to Telecom Costs Order CRTC 95-14, 20 November 1995, in accordance with subsection 44(1) of the <underline>CRTC Telecommunications Rules of Procedure</underline>.</para>
+<para>On 14 December 1995, FNACQ submitted a Bill of Costs for its participation in both the Decision 95-3 and Decision 95-14 proceedings, claiming a total of $8,975.10 in fees for its legal counsel and in-house analyst. FNACQ's claim for legal fees included a reduced amount for GST and QST in recognition of the 50% rebate on these taxes to which FNACQ is entitled.</para>
+<para>In a letter dated 20 December 1995, Stentor stated that it had no comments on the Bill of Costs.</para>
+<para><underline>Counsel and Analyst Fees</underline></para>
+<para>FNACQ claimed a total of $7,775.10 representing 32 hours work at a rate of $230.00 per hour for its legal counsel, Mr. Jacques St-Amant. I note that this rate is in accordance with the rate for counsel of Mr. St-Amant's experience specified in the Commission's legal directorate's recent Guidelines for the Taxation of Costs (the guidelines). Accordingly, I will accept this rate as appropriate.</para>
+<para>With respect to the amount of time claimed for counsel's participation, I note a discrepancy between the amount claimed by FNACQ and the amount which appears in the dockets provided by Mr. St-Amant. The dockets indicate that 30.8 hours were expended while FNACQ appears to have claimed for 32 hours. In the circumstances, I find it more appropriate to use the totals supplied by Mr. St-Amant in his dockets, and accordingly have reduced the total claimed to 30.8 hours, an amount which I consider to be reasonable.</para>
+<para>FNACQ also claimed $1,200.00 for its in-house analyst, Marie Vallée. This amount represents a total of 3 days work at a rate of $400.00 per day. As this rate is also in accordance with the guidelines, and I consider the amount of time to be reasonable in the circumstances, I will allow the amount as claimed.</para>
+<para><underline>Costs as Taxed</underline></para>
+<para>I hereby tax the fees, including 50% of GST and QST, as follows:</para>
+<para><underline>Counsel Fees</underline></para>
+<para>Mr. Jacques St-Amant <underline>$7,483.54</underline></para>
+<para>Analyst Fees</para>
+<para>Marie Vallée <underline>$1,200.00</underline></para>
+<para>Total Fees $8,683.54</para>
+<para>Pursuant to Telecom Costs Order CRTC 95-14, the costs as taxed shall be paid by AGT Limited, BC TEL, Bell Canada, The Island Telephone Company Limited, Maritime Tel and Tel Limited, The New Brunswick Telephone Company, Limited and the Newfoundland Telephone Company Limited in proportion to their operating revenues from telecommunications activities, as reported in each company's most recent audited financial statements.</para>
+<para>Geoff Batstone</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and</para>
+<para>Telecommunications Commission </para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa, </lr>
+<date>9 December 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-14</para>
+</decision>
+<parties><para>In re:  Local Service Pricing Options - Telecom Public Notices CRTC 95-49 and 95-56.</para>
+</parties>
+<parties><para>Reference:  1640-036</para>
+</parties>
+<text><para>John Kerr for the Tatlayoko Think Tank (Tatlayoko).</para>
+<para>Michael P. Redmond for BC TEL.</para>
+</text>
+<text><para>TAXATION OF COSTS OF TATLAYOKO</para>
+</text>
+<text><para>Taxing Officer:  Geoff Batstone</para>
+</text>
+<text><para>This Order constitutes the taxation of costs awarded to Tatlayoko in the context of the above-referenced proceeding.  Costs were awarded to Tatlayoko in Telecom Costs Order CRTC 96-9 (Costs Order 96-9), 19 June 1996, in accordance with subsection 44(1) of the CRTC Telecommunications Rules of Procedure (the Rules). Costs Order 96-9 provided that costs are to be paid to Tatlayoko by BC TEL.</para>
+</text>
+<text><para>On 21 June 1996, Tatlayoko filed a Bill of Costs in which it claimed a total of $1,370.75 in costs, consisting of $525.00 in fees, and $845.75 in disbursements.</para>
+</text>
+<text><para>BC TEL filed its comments on the Bill of Costs on 9 August 1996.  Tatlayoko filed its reply on 26 August 1996.</para>
+</text>
+<text><para>Fees</para>
+</text>
+<text><para>In its Bill of Costs, Tatlayoko claimed three days at $175.00 per day to cover the costs of the preparation of its submissions.  Tatlayoko submitted that the rate claimed is fair and reasonable based on the education and past work experience of its partners.  Tatlayoko indicated that as a result of its participation, farm work and substitute teaching did not get done.</para>
+</text>
+<text><para>In its comments, BC TEL noted that Tatlayoko's claim for fees does not represent a claim for reimbursement of legal fees, expert fees, or in-house services, and submitted that Mr. Kerr cannot be considered an in-house salaried employee for the purposes of section 11 of the Commission's Legal Directorate's Guidelines for the Taxation of Costs (the Guidelines).   BC TEL also submitted that Tatlayoko's claim is for compensation for lost opportunities to earn money, and that it would be inappropriate for BC TEL to be required to compensate Tatlayoko in this regard.</para>
+</text>
+<text><para>In its reply, Tatlayoko noted that its claim represents two full days' research and preparation, and one full day's attendance at the Regional Hearing in Vancouver.  Tatlayoko did not deny BC TEL's assertion that its claim for fees is, in effect, a claim for compensation for lost opportunities.  Rather, it stated that "[o]ur reality is that we did lose income from other sources as a result of preparing for and participating in the CRTC hearing."  Tatlayoko argued that it should nevertheless be entitled to recover these losses.</para>
+</text>
+<text><para>The Commission awards costs to compensate interveners for expenses incurred as a result of their participation in a proceeding.  While Tatlayoko has characterized its claim for fees as reimbursement for the costs of preparing its submission, it is unclear what costs, if any, were actually incurred by Tatlayoko in this regard.  There is no indication in the record that Tatlayoko was required to pay out an amount in respect of fees as a result of its participation in the hearing.  On this basis, I am of the view that Tatlayoko's claim for fees should be denied.</para>
+</text>
+<text><para>Disbursements</para>
+</text>
+<text><para>Tatlayoko claimed $561.75 for vehicle mileage representing a total distance of 1605 kilometres at $.35 per kilometre.</para>
+</text>
+<text><para>The rate claimed for automobile travel is consistent with that specified in the Guidelines, and the distance travelled appears to be reasonable.  I accept that this expense was reasonably and necessarily incurred for the purposes of Tatlayoko's participation, and accordingly will allow the amount as claimed.</para>
+</text>
+<text><para>Tatlayoko also claimed $144.00 in respect of meal expenses.  This amount represents meals for one person over three days at a rate of $48.00 per day.  The rate claimed is consistent with that stated in the Guidelines.</para>
+</text>
+<text><para>BC TEL objected to the number of days claimed for meal expenses, noting that Tatlayoko attended the Vancouver hearing for only a portion of one day.</para>
+</text>
+<text><para>It is clear, given the distance which he travelled, that Mr. Kerr would have required a full day of travel both to and from the hearing in order to be able to make his presentation in Vancouver.  As these costs were necessarily incurred in connection with his presentation, I am of the view that it is reasonable in the circumstances that meal expenses for all three days be allowed.  Accordingly, I will allow this expense as claimed. </para>
+</text>
+<text><para>Finally, Tatlayoko also claimed $140.00 for two nights accommodation.  In its Bill of Costs, Tatlayoko had claimed $210.00 on the basis of an arithmetic mistake, but subsequently corrected the amount in its reply.</para>
+</text>
+<text><para>BC TEL noted that no receipts were provided to justify the amount claimed, and that no indication as to why receipts were not provided has been given.  Tatlayoko did not respond to BC TEL's comments on this issue in its reply.</para>
+</text>
+<text><para>Section 28 of the Guidelines states that to the extent possible, applicants for costs shall file receipts for all disbursements claimed, and that where receipts are not available, other evidence of the disbursement should be filed.  In this case, no evidence in the form of receipts or other external documentation in support of Tatlayoko's claim for accommodation has been provided.</para>
+</text>
+<text><para>I appreciate that it was Tatlayoko's first appearance in a proceeding before the Commission and that it has no previous experience with the Commission's taxation process.  In these circumstances, some flexibility with respect to the manner in which the Guidelines are applied may be warranted.  However, I note in this case that the issue of Tatlayoko's lack of receipts was raised expressly by BC TEL in its comments, and that Tatlayoko offered no explanation in its reply as to why it had not provided evidence to substantiate the amounts claimed.</para>
+</text>
+<text><para>In the absence of any receipts or other evidence to justify the expenses as claimed, I am unable to determine, as required by the Rules, that this expense was actually incurred.  Accordingly, I am of the view that Tatlayoko's claim in respect of accommodations should be denied.  However, in the event that Tatlayoko is able to provide me with evidence supporting its claim, or a satisfactory explanation as to why such evidence is not available, I would be prepared to find two nights accommodation at $70.00 or less per night to be reasonable, and to allow such claims.</para>
+</text>
+<text><para>Costs as Taxed</para>
+</text>
+<text><para>I hereby tax the disbursements of Tatlayoko as follows:</para>
+</text>
+<text><para>Automobile travel      $561.75</para>
+<para>Meals                                            144.00</para>
+<para>                                               ________</para>
+<para>Total                                             $705.75</para>
+</text>
+<text><para>Geoff Batstone</para>
+<para>Legal Counsel</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa,</lr>
+<date> 29 November 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-13</para>
+</decision>
+<parties><para>In re:  Bell Canada/Bell Sygma Restructuring and Related Transactions - Telecom Public Notice CRTC 94-53</para>
+</parties>
+<parties><para>Reference:  1640-038</para>
+</parties>
+<text><para>Michael Janigan for the National Anti-Poverty Organization (NAPO).</para>
+<para>Bernard Courtois for Bell Canada (Bell).</para>
+</text>
+<text><para>TAXATION OF COSTS OF NAPO</para>
+</text>
+<text><para>Taxing Officer:  Geoff Batstone</para>
+</text>
+<text><para>This Order constitutes the taxation of costs awarded to NAPO in the proceeding leading to Bell Canada/Bell Sygma Restructuring and Related Transactions, Telecom Decision CRTC 96-3, 9 February 1996.  Costs were awarded to NAPO pursuant to Telecom Costs Order CRTC 96-12, 30 July 1996 (Costs Order 96-12), in accordance with subsection 44(1) of the CRTC Telecommunications Rules of Procedure.</para>
+</text>
+<text><para>In its Bill of Costs and Affidavit of Disbursements, dated 27 August 1996, NAPO claimed a total of $3,132.24 consisting of $1,452.10 in counsel fees, $1,673.60 in consultant fees, and $6.54 in disbursements.  These amounts are inclusive of 3.5% GST in recognition of the 50% GST rebate which is available in the circumstances of this case.</para>
+</text>
+<text><para>By letter dated 29 August 1996, Bell stated that it does not object to the amounts claimed by NAPO in its Bill of Costs and Affidavit of Disbursements with the exception of the hourly rate claimed by NAPO in respect of its consultant, Mr. John Todd.  Bell noted that the Commission's Legal Directorate's Guidelines for the Taxation of Costs (the Guidelines) provide for an hourly rate of $160 for a consultant of Mr. Todd's experience, and submitted, therefore, that the amount claimed for work performed by Mr. Todd should be $1,622.88, rather than $1,673.60.</para>
+</text>
+<text><para>NAPO did not submit a reply.</para>
+</text>
+<text><para>The Guidelines set out an hourly rate of $160 for a consultant of Mr. Todd's experience.  Section six of the Guidelines provides that where the applicant believes that exceptional circumstances exist warranting a departure from the Guidelines, a brief written submission showing cause why this is the case must be filed.  No submission in support of the $165 rate claimed by NAPO was submitted in this case.</para>
+</text>
+<text><para>I find the rate of $160 set out in the Guidelines to be appropriate for the work performed by Mr. Todd, and have reduced NAPO's claim accordingly.  I am of the view that the remaining fees and disbursements set out in NAPO's Bill of Costs are reasonable, and will allow them as claimed.</para>
+</text>
+<text><para>Costs as Taxed</para>
+</text>
+<text><para>I hereby tax the fees and disbursements as follows:</para>
+</text>
+<text><para>Counsel Fees</para>
+</text>
+<text><para>Mr. Janigan                              $1,403.00</para>
+</text>
+<text><para>GST                                         $    49.11</para>
+</text>
+<text><para>Consultant Fees</para>
+</text>
+<text><para>Mr. Todd                                  $1,568.00</para>
+</text>
+<text><para>GST                                         $     54.88</para>
+</text>
+<text><para>Disbursements                          $       6.54</para>
+</text>
+<text><para>Total Fees and </para>
+<para>Disbursements                          $3,081.53</para>
+</text>
+<text><para>As stated in Costs Order 96-12, costs are to be paid to NAPO by Bell.</para>
+</text>
+<text><para>Geoff Batstone</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-television and  </para>
+<para>Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+<telecom>
+<lr>Ottawa,</lr>
+<date> 31 October 1996</date>
+<typdoc>Taxation Order </typdoc>
+<decision><para>CRTC 96-11</para>
+</decision>
+<parties><para>In re:  Regulatory Framework for the Independent Telephone Companies in Quebec and Ontario (Except Ontario Northland Transportation Commission, Québec-Téléphone and Télébec ltée) and Telecom Costs Order CRTC 96-14</para>
+</parties>
+<text><para>Michael Janigan for the Public Interest Advocacy Centre (PIAC).</para>
+<para>Glenn O'Brien for the Ontario Telephone Association (OTA).</para>
+</text>
+<text><para>Christian S. Tacit for the Public Utility Companies (PUCs).</para>
+</text>
+<text><para>TAXATION OF COSTS OF PIAC</para>
+</text>
+<text><para>Taxing Officer:  Peter McCallum</para>
+</text>
+<text><para>This order constitutes the taxation of costs awarded to PIAC in the case of Regulatory Framework for the Independent Telephone Companies in Quebec and Ontario (Except Ontario Northland Transportation Commission, Québec-Téléphone and Télébec ltée), Telecom Decision CRTC 96-6, 7 August 1996 (Decision 96-6).</para>
+</text>
+<text><para>Costs were awarded to PIAC by Telecom Costs Order CRTC 96-14 (Costs Order 96-14), in accordance with section 56 of the Telecommunications Act and subsection 44(1) of the CRTC Telecommunications Rules of Procedure.</para>
+</text>
+<text><para>By letter dated 6 September 1996, PIAC submitted a Bill of Costs in the amount of $3,509.53 consisting of $1,071.22 in counsel fees, $2,384.64 in consultant fees and $53.67 in disbursements.  These amounts are inclusive of 3.5% GST, in recognition of the 50% GST rebate which I understand to be available in the circumstances of this case.</para>
+</text>
+<text><para>In Costs Order 96-14, PIAC was directed to serve copies of its Bill of Costs on the OTA (which represented 25 Ontario telephone companies that were party to the proceeding leading to Decision 96-6) and the PUCs (the municipally-owned systems in Bruce, Dryden, Keewatin, Kenora and Thunder Bay - represented by Tacit and Traynor, attorneys).</para>
+</text>
+<text><para>By letters dated 24 September 1996 and 1 October 1996, the OTA and the PUCs advised that they had no comment with respect to the costs that PIAC has claimed.  I will allow the amounts as claimed, and note that the rates reflect those set out by the Commission's Legal Directorate in its Guidelines for the Taxation of Costs dated 9 June 1995.  Each individual independent telephone company is to pay the proportionate amount of the total amount of the fees and disbursements as taxed below, according to the percentages specified in Appendix A attached to Costs Order 96-14.</para>
+</text>
+<text><para>Costs as Taxed</para>
+</text>
+<text><para>I hereby tax the fees and disbursements as follows:</para>
+</text>
+<text><para>Counsel Fees</para>
+</text>
+<text><para>Michael Janigan                        $1,035.00</para>
+</text>
+<text><para>GST                                        $     36.22</para>
+</text>
+<text><para>Consultant Fees</para>
+</text>
+<text><para>John Todd                                $2,304.00</para>
+</text>
+<text><para>GST                                         $     80.64</para>
+</text>
+<text><para>Disbursements                          $     53.67</para>
+</text>
+<text><para>TOTAL FEES</para>
+<para>AND DISBURSEMENTS              $3,509.53</para>
+</text>
+<text><para>Peter McCallum</para>
+<para>Legal Counsel</para>
+<para>Canadian Radio-Televison and</para>
+<para>  Telecommunications Commission</para>
+</text>
+<warning>The official version of this document is available at the following Internet site: http://www.crtc.gc.ca</warning>
+<copyright>Copyright Canadian Radio-television and Telecommunications Commission,  1999.</copyright>
+</telecom>
+</telecoms>
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831-expected.txt b/LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831-expected.txt
new file mode 100644 (file)
index 0000000..6f1263d
--- /dev/null
@@ -0,0 +1,8 @@
+PASS nodeset.snapshotLength is 2
+PASS nodeset.snapshotItem(0).nodeValue is "normal text"
+PASS nodeset.snapshotItem(1).nodeValue is "<cdatatext>"
+PASS nodeset.singleNodeValue.nodeValue is "<cdatatext>"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831.html b/LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831.html
new file mode 100644 (file)
index 0000000..15c5836
--- /dev/null
@@ -0,0 +1,34 @@
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+test = '<foo>\
+    <bar>normal text</bar>\
+    <f>f1</f>\
+    Free range chickens\
+    <bar><![CDATA[<cdatatext>]]></bar>\
+    <f>f2</f>\
+</foo>'
+
+    doc = (new DOMParser).parseFromString(test, "application/xml");
+
+    nodeset = doc.evaluate('//bar/text()', doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe('nodeset.snapshotLength', '2')
+    shouldBe('nodeset.snapshotItem(0).nodeValue', '"normal text"')
+    shouldBe('nodeset.snapshotItem(1).nodeValue', '"<cdatatext>"')
+
+    nodeset = doc.evaluate('//bar[2]/text()', doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
+    shouldBe('nodeset.singleNodeValue.nodeValue', '"<cdatatext>"')
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217-expected.txt b/LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217-expected.txt
new file mode 100644 (file)
index 0000000..d0ef463
--- /dev/null
@@ -0,0 +1,6 @@
+PASS node_names is "bcd"
+PASS node_names is "b"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217.html b/LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217.html
new file mode 100644 (file)
index 0000000..207c3ab
--- /dev/null
@@ -0,0 +1,32 @@
+<!-- http://lists.fourthought.com/pipermail/4suite/2002-December/004771.html -->
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+    DOC1 = '<a><b><c/><d/></b></a>'
+
+    doc = (new DOMParser).parseFromString(DOC1, "application/xml");
+    nodeset = doc.evaluate('.//*', doc.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
+    node_names = "";
+    while (currNode = nodeset.iterateNext())
+        node_names += currNode.nodeName;
+    shouldBe('node_names', '"bcd"')
+
+    nodeset = doc.evaluate('(.//*)[1]', doc.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
+    node_names = "";
+    while (currNode = nodeset.iterateNext())
+        node_names += currNode.nodeName;
+    shouldBe('node_names', '"b"')
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test.js b/LayoutTests/fast/xpath/4XPath/Core/test.js
new file mode 100644 (file)
index 0000000..a0d7bea
--- /dev/null
@@ -0,0 +1,78 @@
+DOM = (new DOMParser).parseFromString(
+    '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+    '<!DOCTYPE ROOT [' +
+    '  <!ELEMENT CHILD2 (#PCDATA|GCHILD)*>' +
+    '  <!ATTLIST CHILD2 attr1 CDATA #IMPLIED' +
+    '                   CODE ID #REQUIRED>' +
+    ']>' +
+    '<?xml-stylesheet "Data" ?>' +
+    '<ROOT>' +
+    '  <!-- Test Comment -->' +
+    '  <CHILD1 attr1="val1" attr31="31">' +
+    '    <GCHILD name="GCHILD11"/>' +
+    '    <GCHILD name="GCHILD12"/>' +
+    '    Text1' +
+    '  </CHILD1>' +
+    '  <CHILD2 attr1="val2" CODE="1">' +
+    '    <GCHILD name="GCHILD21"/>' +
+    '    <GCHILD name="GCHILD22"/>' +
+    '  </CHILD2>' +
+    '  <foo:CHILD3 xmlns:foo="http://foo.com" foo:name="mike"/>' +
+    '  <lang xml:lang="en">' +
+    '    <foo xml:lang=""/>' +
+    '    <foo/>' +
+    '    <f\xf6\xf8/>' +
+    '  </lang>' +
+    '</ROOT>' +
+    '<?no-data ?>',
+    'application/xml');
+
+DOM = DOM;
+ROOT = DOM.documentElement;
+
+PI = DOM.firstChild;
+while (PI.nodeType != Node.PROCESSING_INSTRUCTION_NODE)
+    PI = PI.nextSibling;
+PI2 = DOM.lastChild;
+COMMENT = ROOT.firstChild
+while (COMMENT.nodeType != Node.COMMENT_NODE)
+    COMMENT = COMMENT.nextSibling;
+
+CHILD1 = DOM.getElementsByTagName("CHILD1")[0];
+ATTR1 = CHILD1.getAttributeNode("attr1");
+ATTR31 = CHILD1.getAttributeNode("attr31");
+CHILD2 = DOM.getElementsByTagName("CHILD2")[0];
+ATTR2 = CHILD2.getAttributeNode("attr1");
+IDATTR2 = CHILD2.getAttributeNode('CODE')
+CHILD3 = DOM.getElementsByTagName("CHILD3")[0];
+text = CHILD1.lastChild;
+LANG = DOM.getElementsByTagName("lang")[0];
+NONASCIIQNAME = DOM.getElementsByTagName("f\xf6\xf8")[0];
+
+CHILDREN = [CHILD1, CHILD2, CHILD3, LANG];
+GCHILDREN1 = [CHILD1.getElementsByTagName("GCHILD")[0], CHILD1.getElementsByTagName("GCHILD")[1]];
+GCHILD11 = GCHILDREN1[0];
+GCHILD12 = GCHILDREN1[1];
+TEXT1 = CHILD1.lastChild;
+GCHILDREN2 = [CHILD2.getElementsByTagName("GCHILD")[0], CHILD2.getElementsByTagName("GCHILD")[1]];
+GCHILD21 = GCHILDREN2[0];
+GCHILD22 = GCHILDREN2[1];
+LCHILDREN = [LANG.getElementsByTagName("foo")[0], LANG.getElementsByTagName("foo")[1], LANG.getElementsByTagName("f\xf6\xf8")[0]];
+LCHILD1 = LCHILDREN[0];
+LCHILD2 = LCHILDREN[1];
+
+function checkSnapshot(comment, actual, expected) {
+    if (actual.snapshotLength != expected.length) {
+        testFailed(comment + " incorrect length (expected " + expected.length + ", actual " + actual.snapshotLength + ")");
+        return;
+    }
+    
+    for (i = 0; i < actual.snapshotLength; ++i) {
+        if (actual.snapshotItem(i) != expected[i]) {
+            testFailed(comment + " item " + i + " incorrect (expected " + expected[i].nodeName + ", actual " + actual.snapshotItem(i).nodeName + ")");
+            return;
+        }
+    }
+    
+    testPassed(comment);
+}
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr-expected.txt
new file mode 100644 (file)
index 0000000..f5057e6
--- /dev/null
@@ -0,0 +1,49 @@
+PASS doc.evaluate("3.14 < -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("3.14 <= -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("3.14 > -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("3.14 >= 3.14", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("number('NaN') < -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("number('NaN') <= -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("number('NaN') > -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("number('NaN') >= 3.14", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/root/@num2 <= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/root/@num2 >= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/root/@num0 <= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/root/@num0 >= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/root/@num4 <= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/root/@num4 >= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("'3.14' = '3.14'", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("'3.14' = 'Hi'", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("'3.14' != -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("number('NaN') = 'Hi'", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("number('NaN') != -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("number('NaN')  = number('NaN')", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("number('NaN') != number('NaN')", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/empty  = true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/empty != true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/empty  = false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/empty != false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/empty  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/empty != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/root/*[1]  = /empty", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/root/*[1] != /empty", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("/root/*[1]  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("/root/*[1] != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("'egg1'  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("'egg1' != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("'egg2'  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("'egg2' != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("'egg1'  = /root/*", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("'egg1' != /root/*", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("true() and true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("true() and false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("false() and true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("false() and false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS doc.evaluate("true() or false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("false() or true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("true() or true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is true
+PASS doc.evaluate("false() or false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr.html b/LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr.html
new file mode 100644 (file)
index 0000000..32c1637
--- /dev/null
@@ -0,0 +1,68 @@
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+
+doc = (new DOMParser).parseFromString("<root num0='0' num2='2' num4='4'><egg1>egg1</egg1><egg2>egg2</egg2></root>", "application/xml");
+
+shouldBe('doc.evaluate("3.14 < -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("3.14 <= -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("3.14 > -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("3.14 >= 3.14", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("number(\'NaN\') < -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("number(\'NaN\') <= -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("number(\'NaN\') > -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("number(\'NaN\') >= 3.14", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/root/@num2 <= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/root/@num2 >= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/root/@num0 <= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/root/@num0 >= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/root/@num4 <= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/root/@num4 >= /root/@num2", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+
+shouldBe('doc.evaluate("\'3.14\' = \'3.14\'", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("\'3.14\' = \'Hi\'", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("\'3.14\' != -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("number(\'NaN\') = \'Hi\'", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("number(\'NaN\') != -4", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("number(\'NaN\')  = number(\'NaN\')", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("number(\'NaN\') != number(\'NaN\')", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/empty  = true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/empty != true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/empty  = false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/empty != false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/empty  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/empty != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/root/*[1]  = /empty", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/root/*[1] != /empty", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("/root/*[1]  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("/root/*[1] != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("\'egg1\'  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("\'egg1\' != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("\'egg2\'  = /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("\'egg2\' != /root/*[1]", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("\'egg1\'  = /root/*", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+// Yeah, non-intuitive, but true acc to XPath spec 3.4
+shouldBe('doc.evaluate("\'egg1\' != /root/*", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+
+shouldBe('doc.evaluate("true() and true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("true() and false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("false() and true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("false() and false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+shouldBe('doc.evaluate("true() or false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("false() or true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("true() or true()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'true');
+shouldBe('doc.evaluate("false() or false()", doc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue', 'false');
+
+var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_core_functions-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_core_functions-expected.txt
new file mode 100644 (file)
index 0000000..f929e60
--- /dev/null
@@ -0,0 +1,77 @@
+FAIL DOM.evaluate("last()", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be 1 (of type number). Was 0 (of type number).
+PASS DOM.evaluate("position()", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("count(/ROOT | /ROOT/CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 2
+FAIL id(1) incorrect length (expected 1, actual 0)
+FAIL id('1 1') incorrect length (expected 1, actual 0)
+PASS id('0')
+FAIL id('0 1') incorrect length (expected 1, actual 0)
+FAIL id('0 1 1') incorrect length (expected 1, actual 0)
+FAIL id('0 0 1 1') incorrect length (expected 1, actual 0)
+PASS DOM.evaluate("local-name(/empty)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is ""
+PASS DOM.evaluate("local-name(//f:CHILD3)", CHILD1, nsResolver, XPathResult.ANY_TYPE, null).stringValue is "CHILD3"
+PASS DOM.evaluate("namespace-uri(/empty)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is ""
+PASS DOM.evaluate("namespace-uri(//f:CHILD3)", CHILD1, nsResolver, XPathResult.ANY_TYPE, null).stringValue is "http://foo.com"
+PASS DOM.evaluate("name(//f:CHILD3)", CHILD1, nsResolver, XPathResult.ANY_TYPE, null).stringValue is "foo:CHILD3"
+PASS DOM.evaluate("string(//CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is strNodeset3
+PASS DOM.evaluate("concat(//CHILD1, '3.14', 'Hi')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is strNodeset3 + "3.14Hi"
+PASS DOM.evaluate("starts-with(//CHILD1, '3.14')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("starts-with(//CHILD1, //CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("starts-with(//CHILD1, '')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("contains(//CHILD1, '3.14')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("contains(//CHILD1, //CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("contains(//CHILD1, '')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("substring-before('3.14Hi', 'Hi')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "3.14"
+PASS DOM.evaluate("substring-before('3.14Hi', '')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is ""
+PASS DOM.evaluate("substring-after('3.14Hi', '3.14')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "Hi"
+PASS DOM.evaluate("substring-after('3.14Hi', '')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is ""
+PASS DOM.evaluate("substring('3.14Hi', '3.14')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "14Hi"
+PASS DOM.evaluate("substring('3.14Hi', '3.14', 1)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "1"
+PASS DOM.evaluate("substring('12345', 2, 3)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "234"
+PASS DOM.evaluate("substring('12345', 2)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "2345"
+PASS DOM.evaluate("substring('12345', 1.5, 2.6)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "234"
+PASS DOM.evaluate("substring('12345', 0, 3)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "12"
+PASS DOM.evaluate("substring('12345', number('NaN'), 3)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is ""
+FAIL DOM.evaluate("substring('12345', 1, number('NaN'))", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue should be  (of type string). Was 12345 (of type string).
+PASS DOM.evaluate("substring('12345', -42, 1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "12345"
+PASS DOM.evaluate("substring('12345', -1 div 0, 1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is ""
+PASS DOM.evaluate("string-length('3.14Hi')", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 6
+PASS DOM.evaluate("normalize-space('Ht          There     Mike')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "Ht There Mike"
+PASS DOM.evaluate("translate('Ht        There     Mike', 'abcdefg', 'ABCDEFG')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "Ht           ThErE     MikE"
+PASS DOM.evaluate("translate('hello world', 'e', 'a')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "hallo world"
+PASS DOM.evaluate("translate('hello world', 'e', 'abc')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "hallo world"
+PASS DOM.evaluate("translate('hello world', 'el', 'a')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "hao word"
+PASS DOM.evaluate("translate('hello world', 'abcdefgabc', 'ABCDEFG123')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "hEllo worlD"
+PASS DOM.evaluate("translate('hello world', 'abcdefghhe', 'ABCDEFGH')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "HEllo worlD"
+PASS DOM.evaluate("translate('hello world', 'abcdefgh', '')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue is "llo worl"
+PASS DOM.evaluate("boolean('3.14')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("not('3.14Hi')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("true()", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("false()", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("floor(3.14)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 3
+PASS DOM.evaluate("floor(number())", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("floor(1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate("floor(-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -Infinity
+PASS DOM.evaluate("floor(0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("floor(-0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -1
+PASS DOM.evaluate("ceiling(3.14)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 4
+PASS DOM.evaluate("ceiling(number('NaN'))", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("ceiling(1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate("ceiling(0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("ceiling(-0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("round(3.14)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 3
+FAIL DOM.evaluate("round(-4.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue should be -4 (of type number). Was -5 (of type number).
+PASS DOM.evaluate("round(number('NaN'))", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("round(1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate("round(-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -Infinity
+PASS DOM.evaluate("round('12345')", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 12345
+PASS DOM.evaluate("lang('en')", LCHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("lang('en')", LCHILD2, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("lang('')", LCHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("lang('')", LCHILD2, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("lang('foo')", LCHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("lang('foo')", LCHILD2, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_core_functions.html b/LayoutTests/fast/xpath/4XPath/Core/test_core_functions.html
new file mode 100644 (file)
index 0000000..739b8fc
--- /dev/null
@@ -0,0 +1,115 @@
+<!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>
+    function nsResolver(prefix) {
+        if (prefix == 'f')
+            return 'http://foo.com';
+        return null;
+    }
+
+    shouldBe('DOM.evaluate("last()", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate("position()", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate("count(/ROOT | /ROOT/CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '2');
+
+    result = DOM.evaluate("id(1)", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("id(1)", result, [CHILD2]);
+
+    result = DOM.evaluate("id('1 1')", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("id('1 1')", result, [CHILD2]);
+
+    result = DOM.evaluate("id('0')", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("id('0')", result, []);
+
+    result = DOM.evaluate("id('0 1')", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("id('0 1')", result, [CHILD2]);
+
+    result = DOM.evaluate("id('0 1 1')", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("id('0 1 1')", result, [CHILD2]);
+
+    result = DOM.evaluate("id('0 0 1 1')", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("id('0 0 1 1')", result, [CHILD2]);
+
+    shouldBe('DOM.evaluate("local-name(/empty)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("local-name(//f:CHILD3)", CHILD1, nsResolver, XPathResult.ANY_TYPE, null).stringValue', '"CHILD3"');
+    shouldBe('DOM.evaluate("namespace-uri(/empty)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("namespace-uri(//f:CHILD3)", CHILD1, nsResolver, XPathResult.ANY_TYPE, null).stringValue', '"http://foo.com"');
+    shouldBe('DOM.evaluate("name(//f:CHILD3)", CHILD1, nsResolver, XPathResult.ANY_TYPE, null).stringValue', '"foo:CHILD3"');
+
+    strNodeset3 = "            Text1  ";
+
+    shouldBe('DOM.evaluate("string(//CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', 'strNodeset3');
+    shouldBe('DOM.evaluate("concat(//CHILD1, \'3.14\', \'Hi\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', 'strNodeset3 + "3.14Hi"');
+    shouldBe('DOM.evaluate("starts-with(//CHILD1, \'3.14\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate("starts-with(//CHILD1, //CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("starts-with(//CHILD1, \'\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("contains(//CHILD1, \'3.14\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate("contains(//CHILD1, //CHILD1)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("contains(//CHILD1, \'\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("substring-before(\'3.14Hi\', \'Hi\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"3.14"');
+    shouldBe('DOM.evaluate("substring-before(\'3.14Hi\', \'\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("substring-after(\'3.14Hi\', \'3.14\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"Hi"');
+    shouldBe('DOM.evaluate("substring-after(\'3.14Hi\', \'\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("substring(\'3.14Hi\', \'3.14\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"14Hi"');
+    shouldBe('DOM.evaluate("substring(\'3.14Hi\', \'3.14\', 1)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"1"');
+    shouldBe('DOM.evaluate("substring(\'12345\', 2, 3)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"234"');
+    shouldBe('DOM.evaluate("substring(\'12345\', 2)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"2345"');
+    shouldBe('DOM.evaluate("substring(\'12345\', 1.5, 2.6)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"234"');
+    shouldBe('DOM.evaluate("substring(\'12345\', 0, 3)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"12"');
+    shouldBe('DOM.evaluate("substring(\'12345\', number(\'NaN\'), 3)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("substring(\'12345\', 1, number(\'NaN\'))", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("substring(\'12345\', -42, 1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"12345"');
+    shouldBe('DOM.evaluate("substring(\'12345\', -1 div 0, 1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '""');
+    shouldBe('DOM.evaluate("string-length(\'3.14Hi\')", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '6');
+    shouldBe('DOM.evaluate("normalize-space(\'Ht    \t There\t   Mike\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"Ht There Mike"');
+    shouldBe('DOM.evaluate("translate(\'Ht    \t There\t   Mike\', \'abcdefg\', \'ABCDEFG\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"Ht    \t ThErE\t   MikE"');
+    shouldBe('DOM.evaluate("translate(\'hello world\', \'e\', \'a\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"hallo world"');
+    shouldBe('DOM.evaluate("translate(\'hello world\', \'e\', \'abc\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"hallo world"');
+    shouldBe('DOM.evaluate("translate(\'hello world\', \'el\', \'a\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"hao word"');
+    shouldBe('DOM.evaluate("translate(\'hello world\', \'abcdefgabc\', \'ABCDEFG123\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"hEllo worlD"');
+    shouldBe('DOM.evaluate("translate(\'hello world\', \'abcdefghhe\', \'ABCDEFGH\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"HEllo worlD"');
+    shouldBe('DOM.evaluate("translate(\'hello world\', \'abcdefgh\', \'\')", CHILD1, null, XPathResult.ANY_TYPE, null).stringValue', '"llo worl"');
+
+    shouldBe('DOM.evaluate("boolean(\'3.14\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("not(\'3.14Hi\')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate("true()", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("false()", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+    shouldBe('DOM.evaluate("number(\'NaN\')", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate("floor(3.14)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3');
+    shouldBe('DOM.evaluate("floor(number())", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate("floor(1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate("floor(-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+    shouldBe('DOM.evaluate("floor(0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0');
+    shouldBe('DOM.evaluate("floor(-0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1');
+    shouldBe('DOM.evaluate("ceiling(3.14)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '4');
+    shouldBe('DOM.evaluate("ceiling(number(\'NaN\'))", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate("ceiling(1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate("ceiling(0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '1');
+    shouldBe('DOM.evaluate("ceiling(-0.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '0'); // actually should be negative zero
+    shouldBe('DOM.evaluate("round(3.14)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '3');
+    shouldBe('DOM.evaluate("round(-4.5)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-4');
+    shouldBe('DOM.evaluate("round(number(\'NaN\'))", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'NaN');
+    shouldBe('DOM.evaluate("round(1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', 'Infinity');
+    shouldBe('DOM.evaluate("round(-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-Infinity');
+    shouldBe('DOM.evaluate("round(\'12345\')", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '12345');
+    shouldBe('DOM.evaluate("lang(\'en\')", LCHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate("lang(\'en\')", LCHILD2, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("lang(\'\')", LCHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'true');
+    shouldBe('DOM.evaluate("lang(\'\')", LCHILD2, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate("lang(\'foo\')", LCHILD1, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+    shouldBe('DOM.evaluate("lang(\'foo\')", LCHILD2, null, XPathResult.ANY_TYPE, null).booleanValue', 'false');
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_literal_expr-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_literal_expr-expected.txt
new file mode 100644 (file)
index 0000000..d63ea4d
--- /dev/null
@@ -0,0 +1,42 @@
+PASS document.evaluate('""', document, null, XPathResult.STRING_TYPE, null).stringValue is ""
+PASS document.evaluate('"Hi"', document, null, XPathResult.STRING_TYPE, null).stringValue is "Hi"
+PASS document.evaluate('"NaN"', document, null, XPathResult.STRING_TYPE, null).stringValue is "NaN"
+PASS document.evaluate('"• = middle dot"', document, null, XPathResult.STRING_TYPE, null).stringValue is "• = middle dot"
+PASS document.evaluate('"0"', document, null, XPathResult.STRING_TYPE, null).stringValue is "0"
+PASS document.evaluate('"1"', document, null, XPathResult.STRING_TYPE, null).stringValue is "1"
+PASS document.evaluate('"2"', document, null, XPathResult.STRING_TYPE, null).stringValue is "2"
+PASS document.evaluate('"3"', document, null, XPathResult.STRING_TYPE, null).stringValue is "3"
+PASS document.evaluate('"4"', document, null, XPathResult.STRING_TYPE, null).stringValue is "4"
+PASS document.evaluate('"5"', document, null, XPathResult.STRING_TYPE, null).stringValue is "5"
+PASS document.evaluate('"31"', document, null, XPathResult.STRING_TYPE, null).stringValue is "31"
+PASS document.evaluate('"-1"', document, null, XPathResult.STRING_TYPE, null).stringValue is "-1"
+PASS document.evaluate('"-2"', document, null, XPathResult.STRING_TYPE, null).stringValue is "-2"
+PASS document.evaluate('"-3"', document, null, XPathResult.STRING_TYPE, null).stringValue is "-3"
+PASS document.evaluate('"-4"', document, null, XPathResult.STRING_TYPE, null).stringValue is "-4"
+PASS document.evaluate('"-5"', document, null, XPathResult.STRING_TYPE, null).stringValue is "-5"
+PASS document.evaluate('"3.1415926535"', document, null, XPathResult.STRING_TYPE, null).stringValue is "3.1415926535"
+PASS document.evaluate('0', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 0.0
+PASS document.evaluate('0.5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 0.5
+PASS document.evaluate('-0.5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -0.5
+PASS document.evaluate('1', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 1.0
+PASS document.evaluate('-1', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -1.0
+PASS document.evaluate('1.5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 1.5
+PASS document.evaluate('-1.5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -1.5
+PASS document.evaluate('2', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 2.0
+PASS document.evaluate('-2', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -2.0
+PASS document.evaluate('2.6', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 2.6
+PASS document.evaluate('-2.6', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -2.6
+PASS document.evaluate('3', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 3.0
+PASS document.evaluate('-3', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -3.0
+PASS document.evaluate('31', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 31.0
+PASS document.evaluate('4', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 4.0
+PASS document.evaluate('-4', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -4.0
+PASS document.evaluate('4.5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 4.5
+PASS document.evaluate('-4.5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -4.5
+PASS document.evaluate('5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is 5.0
+PASS document.evaluate('-5', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -5.0
+PASS document.evaluate('-42', document, null, XPathResult.NUMBER_TYPE, null).numberValue is -42.0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_literal_expr.html b/LayoutTests/fast/xpath/4XPath/Core/test_literal_expr.html
new file mode 100644 (file)
index 0000000..16f0754
--- /dev/null
@@ -0,0 +1,56 @@
+<!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>
+</head>
+<body>
+<div id="console"></div>
+
+<script>
+    shouldBe('document.evaluate(\'""\', document, null, XPathResult.STRING_TYPE, null).stringValue', '""');
+    shouldBe('document.evaluate(\'"Hi"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"Hi"');
+    shouldBe('document.evaluate(\'"NaN"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"NaN"');
+    shouldBe('document.evaluate(\'"\u2022 = middle dot"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"\u2022 = middle dot"');
+    shouldBe('document.evaluate(\'"0"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"0"');
+    shouldBe('document.evaluate(\'"1"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"1"');
+    shouldBe('document.evaluate(\'"2"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"2"');
+    shouldBe('document.evaluate(\'"3"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"3"');
+    shouldBe('document.evaluate(\'"4"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"4"');
+    shouldBe('document.evaluate(\'"5"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"5"');
+    shouldBe('document.evaluate(\'"31"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"31"');
+    shouldBe('document.evaluate(\'"-1"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"-1"');
+    shouldBe('document.evaluate(\'"-2"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"-2"');
+    shouldBe('document.evaluate(\'"-3"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"-3"');
+    shouldBe('document.evaluate(\'"-4"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"-4"');
+    shouldBe('document.evaluate(\'"-5"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"-5"');
+    shouldBe('document.evaluate(\'"3.1415926535"\', document, null, XPathResult.STRING_TYPE, null).stringValue', '"3.1415926535"');
+
+    shouldBe('document.evaluate(\'0\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '0.0');
+    shouldBe('document.evaluate(\'0.5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '0.5');
+    shouldBe('document.evaluate(\'-0.5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-0.5');
+    shouldBe('document.evaluate(\'1\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '1.0');
+    shouldBe('document.evaluate(\'-1\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-1.0');
+    shouldBe('document.evaluate(\'1.5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '1.5');
+    shouldBe('document.evaluate(\'-1.5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-1.5');
+    shouldBe('document.evaluate(\'2\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '2.0');
+    shouldBe('document.evaluate(\'-2\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-2.0');
+    shouldBe('document.evaluate(\'2.6\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '2.6');
+    shouldBe('document.evaluate(\'-2.6\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-2.6');
+    shouldBe('document.evaluate(\'3\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '3.0');
+    shouldBe('document.evaluate(\'-3\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-3.0');
+    shouldBe('document.evaluate(\'31\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '31.0');
+    shouldBe('document.evaluate(\'4\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '4.0');
+    shouldBe('document.evaluate(\'-4\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-4.0');
+    shouldBe('document.evaluate(\'4.5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '4.5');
+    shouldBe('document.evaluate(\'-4.5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-4.5');
+    shouldBe('document.evaluate(\'5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '5.0');
+    shouldBe('document.evaluate(\'-5\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-5.0');
+    shouldBe('document.evaluate(\'-42\', document, null, XPathResult.NUMBER_TYPE, null).numberValue', '-42.0');
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_location_path-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_location_path-expected.txt
new file mode 100644 (file)
index 0000000..441a645
--- /dev/null
@@ -0,0 +1,9 @@
+FAIL //* item 2 incorrect (expected GCHILD, actual CHILD2)
+PASS */*
+PASS /
+PASS /child::*
+PASS child::*/child::*
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_location_path.html b/LayoutTests/fast/xpath/4XPath/Core/test_location_path.html
new file mode 100644 (file)
index 0000000..38634d2
--- /dev/null
@@ -0,0 +1,32 @@
+<!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>
+    result = DOM.evaluate("//*", CHILD2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//*", result, [ROOT, CHILD1].concat(GCHILDREN1, [CHILD2], GCHILDREN2, [CHILD3, LANG], LCHILDREN));
+
+    result = DOM.evaluate("*/*", ROOT, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("*/*", result, GCHILDREN1.concat(GCHILDREN2, LCHILDREN));
+
+    result = DOM.evaluate("/", CHILD1, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("/", result, [DOM]);
+
+    result = DOM.evaluate("/child::*", CHILD2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("/child::*", result, [ROOT]);
+
+    result = DOM.evaluate("child::*/child::*", ROOT, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("child::*/child::*", result, GCHILDREN1.concat(GCHILDREN2, LCHILDREN));
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_node_test-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_node_test-expected.txt
new file mode 100644 (file)
index 0000000..3404030
--- /dev/null
@@ -0,0 +1,21 @@
+PASS nodeInResult(ROOT, result) is true
+PASS nodeInResult(ROOT, result) is false
+PASS nodeInResult(CHILD1, result) is false
+PASS nodeInResult(CHILD3, result) is true
+PASS nodeInResult(ROOT, result) is false
+PASS nodeInResult(CHILD1, result) is false
+PASS nodeInResult(CHILD3, result) is true
+PASS nodeInResult(ROOT, result) is true
+PASS nodeInResult(TEXT1, result) is true
+PASS nodeInResult(ROOT, result) is false
+PASS nodeInResult(TEXT1, result) is true
+PASS nodeInResult(ROOT, result) is false
+PASS nodeInResult(COMMENT, result) is true
+PASS nodeInResult(ROOT, result) is false
+PASS nodeInResult(PI, result) is true
+PASS nodeInResult(PI, result) is true
+PASS nodeInResult(PI2, result) is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_node_test.html b/LayoutTests/fast/xpath/4XPath/Core/test_node_test.html
new file mode 100644 (file)
index 0000000..b20eb95
--- /dev/null
@@ -0,0 +1,63 @@
+<!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>
+    function nsResolver(prefix) {
+        if (prefix == 'bar')
+            return 'http://foo.com';
+        return null;
+    }
+
+    function nodeInResult(node, result) {
+        for (i=0; i < result.snapshotLength; ++i)
+            if (result.snapshotItem(i) == node)
+                return true;
+        return false;
+    }
+
+    result = DOM.evaluate("//*", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "true");
+
+    result = DOM.evaluate("//bar:CHILD3", ROOT, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "false");
+    shouldBe("nodeInResult(CHILD1, result)", "false");
+    shouldBe("nodeInResult(CHILD3, result)", "true");
+
+    result = DOM.evaluate("//bar:*", ROOT, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "false");
+    shouldBe("nodeInResult(CHILD1, result)", "false");
+    shouldBe("nodeInResult(CHILD3, result)", "true");
+
+    result = DOM.evaluate("//node()", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "true");
+    shouldBe("nodeInResult(TEXT1, result)", "true");
+
+    result = DOM.evaluate("//text()", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "false");
+    shouldBe("nodeInResult(TEXT1, result)", "true");
+
+    result = DOM.evaluate("//comment()", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "false");
+    shouldBe("nodeInResult(COMMENT, result)", "true");
+
+    result = DOM.evaluate("//processing-instruction()", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(ROOT, result)", "false");
+    shouldBe("nodeInResult(PI, result)", "true");
+
+    result = DOM.evaluate("//processing-instruction('xml-stylesheet')", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    shouldBe("nodeInResult(PI, result)", "true");
+    shouldBe("nodeInResult(PI2, result)", "false");
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr-expected.txt
new file mode 100644 (file)
index 0000000..38232f2
--- /dev/null
@@ -0,0 +1,7 @@
+PASS (/ROOT | /ROOT/CHILD1)[true()]
+PASS (/ROOT | /ROOT/CHILD1)[.=/ROOT]
+PASS (/ROOT | /ROOT/CHILD1) | (/ROOT)
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr.html b/LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr.html
new file mode 100644 (file)
index 0000000..e94a32f
--- /dev/null
@@ -0,0 +1,26 @@
+<!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>
+    result = DOM.evaluate("(/ROOT | /ROOT/CHILD1)[true()]", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("(/ROOT | /ROOT/CHILD1)[true()]", result, [ROOT, CHILD1]);
+
+    result = DOM.evaluate("(/ROOT | /ROOT/CHILD1)[.=/ROOT]", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("(/ROOT | /ROOT/CHILD1)[.=/ROOT]", result, [ROOT]);
+
+    result = DOM.evaluate("(/ROOT | /ROOT/CHILD1) | (/ROOT)", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("(/ROOT | /ROOT/CHILD1) | (/ROOT)", result, [ROOT, CHILD1]);
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr-expected.txt
new file mode 100644 (file)
index 0000000..fc6dc15
--- /dev/null
@@ -0,0 +1,167 @@
+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 div 0) * (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate("(-1 div 0) * (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+PASS DOM.evaluate("(1 div 0) * (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is -Infinity
+PASS DOM.evaluate("0 div 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+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 div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("1 div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("-1 div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("0 div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("1 div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("-1 div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is 0
+PASS DOM.evaluate("(1 div 0) div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(1 div 0) div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(-1 div 0) div (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+PASS DOM.evaluate("(-1 div 0) div (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+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("(1 div 0) + (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is Infinity
+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("(1 div 0) - (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue is NaN
+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
+PASS DOM.evaluate("5 = 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 = -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("-5 = -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("0 = 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("(1 div 0) = (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("(-1 div 0) = (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 = (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 = number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("number('NaN') = number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("31 = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 != 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 != -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("-5 != -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("0 != 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("(1 div 0) != (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("(-1 div 0) != (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 != (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 != number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("number('NaN') != number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("31 != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 < 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 <= 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 > 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 >= 5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 < -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 <= -5", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 > -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("5 < 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 <= 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 > 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 >= 0", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 < (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 <= (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 > (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 >= (1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 < (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 <= (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 > (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 >= (-1 div 0)", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("5 < number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 <= number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 > number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 >= number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+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).
+PASS DOM.evaluate("5 > @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 >= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+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
+PASS DOM.evaluate("'5' = '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' = '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'-5' = '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'0' = '0'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'Hi' = 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' = 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' = 'NaN'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'NaN' = 'NaN'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'31' = @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' != '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' != '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'-5' != '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'0' != '0'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' != 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'5' != number('NaN')", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'NaN' != 'NaN'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("'31' != @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("31 < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'31' < '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+FAIL DOM.evaluate("5 <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
+PASS DOM.evaluate("31 <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+FAIL DOM.evaluate("'5' <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
+PASS DOM.evaluate("'31' <= '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+FAIL DOM.evaluate("31 > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
+PASS DOM.evaluate("'5' > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+FAIL DOM.evaluate("'31' > '5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue should be true (of type boolean). Was false (of type boolean).
+PASS DOM.evaluate("5 < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("31 < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'31' < '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("5 <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("31 <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'31' <= '-5'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+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).
+PASS DOM.evaluate("'5' < 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' <= 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' > 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' >= 'Hi'", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+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).
+PASS DOM.evaluate("'5' > @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("'5' >= @attr31", CHILD1, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html b/LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr.html
new file mode 100644 (file)
index 0000000..ab4fea2
--- /dev/null
@@ -0,0 +1,206 @@
+<!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'); // in 4XPath test suite, this was -1
+    shouldBe('DOM.evaluate("-5 mod 2", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1'); // in 4XPath test suite, this was +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("(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'); // in 4XPath test suite, this was -1
+    shouldBe('DOM.evaluate("\'-5\' mod \'2\'", CHILD1, null, XPathResult.ANY_TYPE, null).numberValue', '-1'); // in 4XPath test suite, this was +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>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_parser-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_parser-expected.txt
new file mode 100644 (file)
index 0000000..45e6214
--- /dev/null
@@ -0,0 +1,45 @@
+PASS child::*
+PASS /child::*
+PASS /*/*
+PASS /child::*/*/child::GCHILD
+FAIL //* item 2 incorrect (expected GCHILD, actual CHILD2)
+PASS //GCHILD
+PASS //@attr1
+PASS x:GCHILD
+PASS .//GCHILD
+PASS .//GCHILD
+PASS /
+PASS //CHILD1/..
+PASS .//foo:*
+PASS CHILD1 | CHILD2
+PASS descendant::GCHILD[3]
+PASS descendant::GCHILD[parent::CHILD1]
+PASS descendant::GCHILD[position() > 1]
+PASS @attr1[.='val1']
+PASS DOM.evaluate("1", ROOT, null, XPathResult.ANY_TYPE, null).numberValue is 1
+PASS DOM.evaluate("00200", ROOT, null, XPathResult.ANY_TYPE, null).numberValue is 200
+PASS DOM.evaluate("3+4*7", ROOT, null, XPathResult.ANY_TYPE, null).numberValue is 31
+PASS DOM.evaluate("3-4*1", ROOT, null, XPathResult.ANY_TYPE, null).numberValue is -1
+PASS DOM.evaluate("string('1')", ROOT, null, XPathResult.ANY_TYPE, null).stringValue is '1'
+PASS DOM.evaluate("concat('1', '2')", ROOT, null, XPathResult.ANY_TYPE, null).stringValue is '12'
+PASS DOM.evaluate("true()", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("false()", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("1=3<4", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("1 or 2 and 3", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate("1 and 2 = 3", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is false
+PASS DOM.evaluate("-1 or 2", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS DOM.evaluate(". or *", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue is true
+PASS text()
+PASS processing-instruction('f')
+PASS (child::*)
+FAIL DOM.evaluate(". * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue should be NaN (of type number). Was 0 (of type number).
+FAIL DOM.evaluate(".. * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue should be NaN (of type number). Was 0 (of type number).
+FAIL DOM.evaluate("/.. * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue should be NaN (of type number). Was 0 (of type number).
+PASS CHILD2/@CODE
+PASS DOM.evaluate("CHILD2/@CODE * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue is 0
+PASS föø
+PASS DOM.evaluate("\\", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null) threw exception Error: INVALID_EXPRESSION_ERR: DOM XPath Exception 51.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_parser.html b/LayoutTests/fast/xpath/4XPath/Core/test_parser.html
new file mode 100644 (file)
index 0000000..3c49923
--- /dev/null
@@ -0,0 +1,114 @@
+<!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>
+    function nsResolver(prefix) {
+        if (prefix == 'x')
+            return 'http://spam.com';
+        return null;
+    }
+
+    result = DOM.evaluate("child::*", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("child::*", result, CHILDREN);
+
+    result = DOM.evaluate("/child::*", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("/child::*", result, [ROOT]);
+
+    result = DOM.evaluate("/*/*", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("/*/*", result, CHILDREN);
+
+    result = DOM.evaluate("/child::*/*/child::GCHILD", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("/child::*/*/child::GCHILD", result, GCHILDREN1.concat(GCHILDREN2));
+
+    result = DOM.evaluate("//*", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//*", result, [ROOT, CHILD1].concat(GCHILDREN1, [CHILD2], GCHILDREN2, [CHILD3, LANG], LCHILDREN));
+
+    result = DOM.evaluate("//GCHILD", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//GCHILD", result, GCHILDREN1.concat(GCHILDREN2));
+
+    result = DOM.evaluate("//@attr1", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//@attr1", result, [ATTR1, ATTR2]);
+
+    result = DOM.evaluate("x:GCHILD", CHILD1, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("x:GCHILD", result, []);
+
+    result = DOM.evaluate(".//GCHILD", CHILD2, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot(".//GCHILD", result, GCHILDREN2);
+
+    result = DOM.evaluate(".//GCHILD", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot(".//GCHILD", result, GCHILDREN1.concat(GCHILDREN2));
+
+    result = DOM.evaluate("/", text, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("/", result, [DOM]);
+
+    result = DOM.evaluate("//CHILD1/..", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//CHILD1/..", result, [ROOT]);
+
+    result = DOM.evaluate(".//foo:*", CHILD3, DOM.createNSResolver(CHILD3), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot(".//foo:*", result, []);
+
+    result = DOM.evaluate("CHILD1 | CHILD2", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("CHILD1 | CHILD2", result, [CHILD1, CHILD2]);
+
+    result = DOM.evaluate("descendant::GCHILD[3]", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("descendant::GCHILD[3]", result, [GCHILD21]);
+
+    result = DOM.evaluate("descendant::GCHILD[parent::CHILD1]", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("descendant::GCHILD[parent::CHILD1]", result, GCHILDREN1);
+
+    result = DOM.evaluate("descendant::GCHILD[position() > 1]", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("descendant::GCHILD[position() > 1]", result, [GCHILD12].concat(GCHILDREN2));
+
+    result = DOM.evaluate("@attr1[.='val1']", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("@attr1[.='val1']", result, [ATTR1]);
+
+    shouldBe('DOM.evaluate("1", ROOT, null, XPathResult.ANY_TYPE, null).numberValue', "1");
+    shouldBe('DOM.evaluate("00200", ROOT, null, XPathResult.ANY_TYPE, null).numberValue', "200");
+    shouldBe('DOM.evaluate("3+4*7", ROOT, null, XPathResult.ANY_TYPE, null).numberValue', "31");
+    shouldBe('DOM.evaluate("3-4*1", ROOT, null, XPathResult.ANY_TYPE, null).numberValue', "-1");
+    shouldBe('DOM.evaluate("string(\'1\')", ROOT, null, XPathResult.ANY_TYPE, null).stringValue', "'1'");
+    shouldBe('DOM.evaluate("concat(\'1\', \'2\')", ROOT, null, XPathResult.ANY_TYPE, null).stringValue', "'12'");
+    shouldBe('DOM.evaluate("true()", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "true");
+    shouldBe('DOM.evaluate("false()", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "false");
+    shouldBe('DOM.evaluate("1=3<4", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "true");
+    shouldBe('DOM.evaluate("1 or 2 and 3", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "true");
+    shouldBe('DOM.evaluate("1 and 2 = 3", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "false");
+    shouldBe('DOM.evaluate("-1 or 2", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "true");
+    shouldBe('DOM.evaluate(". or *", ROOT, null, XPathResult.ANY_TYPE, null).booleanValue', "true");
+
+    result = DOM.evaluate("text()", CHILD3, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("text()", result, []);
+
+    result = DOM.evaluate("processing-instruction('f')", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("processing-instruction('f')", result, []);
+
+    result = DOM.evaluate("(child::*)", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("(child::*)", result, CHILDREN);
+
+    shouldBe('DOM.evaluate(". * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue', "NaN");
+    shouldBe('DOM.evaluate(".. * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue', "NaN");
+    shouldBe('DOM.evaluate("/.. * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue', "NaN");
+
+    result = DOM.evaluate("CHILD2/@CODE", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("CHILD2/@CODE", result, [IDATTR2]);
+
+    shouldBe('DOM.evaluate("CHILD2/@CODE * 0", ROOT, null, XPathResult.NUMBER_TYPE, null).numberValue', "0");
+
+    result = DOM.evaluate("f\xf6\xf8", LANG, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("f\xf6\xf8", result, [NONASCIIQNAME]);
+
+    shouldThrow('DOM.evaluate("\\\\", ROOT, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)');
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_predicate_list-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_predicate_list-expected.txt
new file mode 100644 (file)
index 0000000..b80d829
--- /dev/null
@@ -0,0 +1,9 @@
+PASS self::node()[true() and false()][true()]
+PASS self::node()[true() or false()][true()]
+PASS //element[descendant::y[.='z']]
+PASS //element[descendant::y[.='z']][1]
+PASS //element[descendant::y[.='z']][2]
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_predicate_list.html b/LayoutTests/fast/xpath/4XPath/Core/test_predicate_list.html
new file mode 100644 (file)
index 0000000..a8c1caf
--- /dev/null
@@ -0,0 +1,48 @@
+<!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>
+    result = DOM.evaluate("self::node()[true() and false()][true()]", ROOT, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("self::node()[true() and false()][true()]", result, []);
+
+    result = DOM.evaluate("self::node()[true() or false()][true()]", ROOT, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("self::node()[true() or false()][true()]", result, [ROOT]);
+
+    dom2 = (new DOMParser).parseFromString(
+        "<?xml version='1.0'?>" +
+        "<elementList>" +
+        "    <element>" +
+        "        <x>" +
+        "           <y>a</y>" +
+        "        </x>" +
+        "    </element>" +
+        "    <element>" +
+        "        <x>" +
+        "            <y>z</y>" +
+        "        </x>" +
+        "    </element>" +
+        "</elementList>",
+        "application/xml");
+
+    result = dom2.evaluate("//element[descendant::y[.='z']]", dom2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//element[descendant::y[.='z']]", result, [dom2.getElementsByTagName("element")[1]]);
+
+    result = dom2.evaluate("//element[descendant::y[.='z']][1]", dom2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//element[descendant::y[.='z']][1]", result, [dom2.getElementsByTagName("element")[1]]);
+
+    result = dom2.evaluate("//element[descendant::y[.='z']][2]", dom2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("//element[descendant::y[.='z']][2]", result, []);
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_step-expected.txt b/LayoutTests/fast/xpath/4XPath/Core/test_step-expected.txt
new file mode 100644 (file)
index 0000000..9c94b2a
--- /dev/null
@@ -0,0 +1,9 @@
+PASS ancestor::*
+FAIL ancestor-or-self::* item 0 incorrect (expected ROOT, actual CHILD1)
+PASS descendant-or-self::*
+PASS child::GCHILD[position()=1]
+PASS child::GCHILD[1]
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/xpath/4XPath/Core/test_step.html b/LayoutTests/fast/xpath/4XPath/Core/test_step.html
new file mode 100644 (file)
index 0000000..62f3c34
--- /dev/null
@@ -0,0 +1,32 @@
+<!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>
+    result = DOM.evaluate("ancestor::*", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("ancestor::*", result, [ROOT]);
+
+    result = DOM.evaluate("ancestor-or-self::*", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("ancestor-or-self::*", result, [ROOT, CHILD1]);
+
+    result = DOM.evaluate("descendant-or-self::GCHILD", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("descendant-or-self::*", result, GCHILDREN1);
+
+    result = DOM.evaluate("child::GCHILD[position()=1]", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("child::GCHILD[position()=1]", result, [GCHILD11]);
+
+    result = DOM.evaluate("child::GCHILD[1]", CHILD1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    checkSnapshot("child::GCHILD[1]", result, [GCHILD11]);
+
+    var successfullyParsed = true;
+
+</script>
+<script src="../../../js/resources/js-test-post.js"></script>
+</body>
+</html>
index 7f4f4dc..15c0e4c 100644 (file)
@@ -1,3 +1,27 @@
+2007-03-05  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Darin.
+
+        http://bugs.webkit.org/show_bug.cgi?id=12954
+        XPath relative operations are implemented incorrectly
+
+        * xml/XPathPredicate.cpp:
+        (WebCore::XPath::NumericOp::doEvaluate):
+        (WebCore::XPath::EqTestOp::compare):
+        (WebCore::XPath::EqTestOp::doEvaluate):
+        Reimplemented relative equality operations to match the spec.
+
+        * xml/XPathPredicate.h:
+        (WebCore::XPath::NumericOp::):
+        (WebCore::XPath::EqTestOp::):
+        Moved relative operations to EqTestOp.
+
+        * xml/XPathGrammar.y:
+        * xml/XPathParser.cpp:
+        (WebCore::XPath::Parser::nextTokenInternal):
+        (WebCore::XPath::Parser::lex):
+        Adapted for the above changes.
+
 2007-03-05  Mark Rowe  <mrowe@apple.com>
 
         Reviewed by Lars.
index 2641ebe..38678d3 100644 (file)
@@ -72,8 +72,8 @@ void xpathyyerror(const char *str) { }
     
 %}
 
-%left <numop> MULOP RELOP
-%left <eqop> EQOP
+%left <numop> MULOP
+%left <eqop> EQOP RELOP
 %left PLUS MINUS
 %left OR AND
 %token <axis> AXISNAME
@@ -483,7 +483,7 @@ RelationalExpr:
     |
     RelationalExpr RELOP AdditiveExpr
     {
-        $$ = new NumericOp($2, $1, $3);
+        $$ = new EqTestOp($2, $1, $3);
         PARSER->unregisterParseNode($1);
         PARSER->unregisterParseNode($3);
         PARSER->registerParseNode($$);
index d9055a6..1abb45c 100644 (file)
@@ -307,12 +307,12 @@ Token Parser::nextTokenInternal()
             return Token(ERROR);
         case '<':
             if (peekAheadHelper() == '=')
-                return makeTokenAndAdvance(RELOP, NumericOp::OP_LE, 2);
-            return makeTokenAndAdvance(RELOP, NumericOp::OP_LT);
+                return makeTokenAndAdvance(RELOP, EqTestOp::OP_LE, 2);
+            return makeTokenAndAdvance(RELOP, EqTestOp::OP_LT);
         case '>':
             if (peekAheadHelper() == '=')
-                return makeTokenAndAdvance(RELOP, NumericOp::OP_GE, 2);
-            return makeTokenAndAdvance(RELOP, NumericOp::OP_GT);
+                return makeTokenAndAdvance(RELOP, EqTestOp::OP_GE, 2);
+            return makeTokenAndAdvance(RELOP, EqTestOp::OP_GT);
         case '*':
             if (isOperatorContext())
                 return makeTokenAndAdvance(MULOP, NumericOp::OP_Mul);
@@ -425,9 +425,9 @@ int Parser::lex(void* data)
             yylval->axis = tok.axis;
             break;
         case MULOP:
-        case RELOP:
             yylval->numop = tok.numop;
             break;
+        case RELOP:
         case EQOP:
             yylval->eqop = tok.eqop;
             break;
index cc54b1c..5a27ef2 100644 (file)
@@ -108,14 +108,6 @@ Value NumericOp::doEvaluate() const
             return leftVal / rightVal;
         case OP_Mod:
             return remainder(leftVal, rightVal);
-        case OP_GT:
-            return leftVal > rightVal;
-        case OP_GE:
-            return leftVal >= rightVal;
-        case OP_LT:
-            return leftVal < rightVal;
-        case OP_LE:
-            return leftVal <= rightVal;
     }
     
     return Value();
@@ -128,23 +120,100 @@ EqTestOp::EqTestOp(Opcode opcode, Expression* lhs, Expression* rhs)
     addSubExpression(rhs);
 }
 
+bool EqTestOp::compare(const Value& lhs, const Value& rhs) const
+{
+    if (lhs.isNodeVector()) {
+        const NodeVector& lhsVector = lhs.toNodeVector();
+        if (rhs.isNodeVector()) {
+            // If both objects to be compared are node-sets, then the comparison will be true if and only if
+            // there is a node in the first node-set and a node in the second node-set such that the result of
+            // performing the comparison on the string-values of the two nodes is true.
+            const NodeVector& rhsVector = rhs.toNodeVector();
+            for (unsigned lindex = 0; lindex < lhsVector.size(); ++lindex)
+                for (unsigned rindex = 0; rindex < rhsVector.size(); ++rindex)
+                    if (compare(stringValue(lhsVector[lindex].get()), stringValue(rhsVector[rindex].get())))
+                        return true;
+            return false;
+        }
+        if (rhs.isNumber()) {
+            // If one object to be compared is a node-set and the other is a number, then the comparison will be true
+            // if and only if there is a node in the node-set such that the result of performing the comparison on the number
+            // to be compared and on the result of converting the string-value of that node to a number using the number function is true.
+            for (unsigned lindex = 0; lindex < lhsVector.size(); ++lindex)
+                if (compare(Value(stringValue(lhsVector[lindex].get())).toNumber(), rhs))
+                    return true;
+            return false;
+        }
+        if (rhs.isString()) {
+            // If one object to be compared is a node-set and the other is a string, then the comparison will be true
+            // if and only if there is a node in the node-set such that the result of performing the comparison on
+            // the string-value of the node and the other string is true.
+            for (unsigned lindex = 0; lindex < lhsVector.size(); ++lindex)
+                if (compare(stringValue(lhsVector[lindex].get()), rhs))
+                    return true;
+            return false;
+        }
+        if (rhs.isBoolean()) {
+            // If one object to be compared is a node-set and the other is a boolean, then the comparison will be true
+            // if and only if the result of performing the comparison on the boolean and on the result of converting
+            // the node-set to a boolean using the boolean function is true.
+            return compare(lhs.toBoolean(), rhs);
+        }
+        ASSERT(0);
+    }
+    if (rhs.isNodeVector()) {
+        const NodeVector& rhsVector = rhs.toNodeVector();
+        if (lhs.isNumber()) {
+            for (unsigned rindex = 0; rindex < rhsVector.size(); ++rindex)
+                if (compare(lhs, Value(stringValue(rhsVector[rindex].get())).toNumber()))
+                    return true;
+            return false;
+        }
+        if (lhs.isString()) {
+            for (unsigned rindex = 0; rindex < rhsVector.size(); ++rindex)
+                if (compare(lhs, stringValue(rhsVector[rindex].get())))
+                    return true;
+            return false;
+        }
+        if (lhs.isBoolean())
+            return compare(lhs, rhs.toBoolean());
+        ASSERT(0);
+    }
+    
+    // Neither side is a NodeVector.
+    switch (m_opcode) {
+        case OP_EQ:
+        case OP_NE:
+            bool equal;
+            if (lhs.isBoolean() || rhs.isBoolean())
+                equal = lhs.toBoolean() == rhs.toBoolean();
+            else if (lhs.isNumber() || rhs.isNumber())
+                equal = lhs.toNumber() == rhs.toNumber();
+            else
+                equal = lhs.toString() == rhs.toString();
+
+            if (m_opcode == OP_EQ)
+                return equal;
+            return !equal;
+        case OP_GT:
+            return lhs.toNumber() > rhs.toNumber();
+        case OP_GE:
+            return lhs.toNumber() >= rhs.toNumber();
+        case OP_LT:
+            return lhs.toNumber() < rhs.toNumber();
+        case OP_LE:
+            return lhs.toNumber() <= rhs.toNumber();
+    }
+    ASSERT(0);
+    return false;
+}
+
 Value EqTestOp::doEvaluate() const
 {
     Value lhs(subExpr(0)->evaluate());
     Value rhs(subExpr(1)->evaluate());
 
-    bool equal;
-    if (lhs.isBoolean() || rhs.isBoolean())
-        equal = lhs.toBoolean() == rhs.toBoolean();
-    else if (lhs.isNumber() || rhs.isNumber())
-        equal = lhs.toNumber() == rhs.toNumber();
-    else
-        equal = lhs.toString() == rhs.toString();
-
-    if (m_opcode == OP_EQ)
-        return equal;
-
-    return !equal;
+    return compare(lhs, rhs);
 }
 
 LogicalOp::LogicalOp(Opcode opcode, Expression* lhs, Expression* rhs)
index 6fadf6b..acb036f 100644 (file)
@@ -61,8 +61,7 @@ namespace WebCore {
         class NumericOp : public Expression {
         public:
             enum Opcode {
-                OP_Add, OP_Sub, OP_Mul, OP_Div, OP_Mod,
-                OP_GT, OP_LT, OP_GE, OP_LE
+                OP_Add, OP_Sub, OP_Mul, OP_Div, OP_Mod
             };
             NumericOp(Opcode, Expression* lhs, Expression* rhs);
         private:
@@ -72,10 +71,11 @@ namespace WebCore {
 
         class EqTestOp : public Expression {
         public:
-            enum Opcode { OP_EQ, OP_NE };
+            enum Opcode { OP_EQ, OP_NE, OP_GT, OP_LT, OP_GE, OP_LE };
             EqTestOp(Opcode, Expression* lhs, Expression* rhs);
         private:
             virtual Value doEvaluate() const;
+            bool compare(const Value&, const Value&) const;
             Opcode m_opcode;
         };