1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
<html>
<head>
<script src="../../js/resources/js-test-pre.js"></script>
<script src="../xpath-test-pre.js"></script>
</head>
<body>
<div id="console"></div>
<script>
var doc = (new DOMParser).parseFromString(
'<doc>' +
'<item id="1" />' +
'<item id="2" />' +
'<item id="3" />' +
'<item id="4" />' +
'<item id="5" />' +
'</doc>',
'application/xml');
var ROOT = doc.documentElement;
var ITEM1 = ROOT.firstChild;
var ITEM2 = ITEM1.nextSibling;
var ITEM3 = ITEM2.nextSibling;
var ITEM4 = ITEM3.nextSibling;
test(doc, doc.documentElement, '//item[@id >= 2 and @id <= "4"]', [ITEM2, ITEM3, ITEM4]);
test(doc, doc.documentElement, '//item[@id >= 2 and @id <= 3]', [ITEM2, ITEM3]);
shouldThrow('doc.evaluate("position(1)", doc.documentElement, null, XPathResult.ANY_TYPE, null)');
shouldThrow('doc.evaluate("not()", doc.documentElement, null, XPathResult.ANY_TYPE, null)');
test(doc, doc, "string-length(100)", 3);
shouldThrow('doc.evaluate("count(100)", doc.documentElement, null, XPathResult.ANY_TYPE, null)');
shouldThrow('doc.evaluate("adumbrate()", doc.documentElement, null, XPathResult.ANY_TYPE, null)');
var doc = (new DOMParser).parseFromString(
'<doc>' +
'<item id="1" />' +
'<item id="2" />' +
'<item id="3" />' +
'<item id="4" />' +
'<item id="5" />' +
'<item id="6" />' +
'<item id="7" />' +
'<item id="8" />' +
'<item id="9" />' +
'</doc>',
'application/xml');
var ROOT = doc.documentElement;
var ITEM1 = ROOT.firstChild;
var ITEM2 = ITEM1.nextSibling;
var ITEM3 = ITEM2.nextSibling;
var ITEM4 = ITEM3.nextSibling;
var ITEM5 = ITEM4.nextSibling;
var ITEM6 = ITEM5.nextSibling;
var ITEM7 = ITEM6.nextSibling;
var ITEM8 = ITEM7.nextSibling;
var ITEM9 = ITEM8.nextSibling;
test(doc, doc.documentElement, '//item[@id mod 2 = 0] | //item[@id mod 3 = 0]', [ITEM2, ITEM3, ITEM4, ITEM6, ITEM8, ITEM9]);
shouldThrow('doc.evaluate("//item | 42", doc.documentElement, null, XPathResult.ANY_TYPE, null)');
shouldThrow('doc.evaluate("/doc/(item[@id = 2] | item[@id = 6])/@id", doc.documentElement, null, XPathResult.ANY_TYPE, null)'); // This test doesn't throw in py-dom-path, which is a bug.
shouldThrow("doc.evaluate('\"monty\"/anaconda', doc.documentElement, null, XPathResult.ANY_TYPE, null)");
shouldThrow("doc.evaluate('/doc/string(item[@id = 2])/@id', doc.documentElement, null, XPathResult.ANY_TYPE, null)");
shouldThrow("doc.evaluate('(1)[1]', doc.documentElement, null, XPathResult.ANY_TYPE, null)");
// Added for WebKit.
test(doc, doc.documentElement, '(1)', 1);
test(doc, doc.documentElement, '((1 + 1))', 2);
var doc = (new DOMParser).parseFromString(
'<doc>' +
' <set id="1">' +
' <item>1</item>' +
' <item>2</item>' +
' <item>3</item>' +
' <item>4</item>' +
' </set>' +
' <set id="2">' +
' <item>5</item>' +
' <item>6</item>' +
' <item>7</item>' +
' <item>8</item>' +
' </set>' +
' <set id="3">' +
' <item>0</item>' +
' <item>3</item>' +
' <item>6</item>' +
' <item>9</item>' +
' </set>' +
' <set id="4">' +
' <item>42.0</item>' +
' </set>' +
'</doc>',
'application/xml');
test(doc, doc.documentElement, '1 or 1', true);
test(doc, doc.documentElement, '1 or 0', true);
test(doc, doc.documentElement, '0 or 1', true);
test(doc, doc.documentElement, '0 or 0', false);
test(doc, doc.documentElement, '1 and 1', true);
test(doc, doc.documentElement, '1 and 0', false);
test(doc, doc.documentElement, '0 and 1', false);
test(doc, doc.documentElement, '0 and 0', false);
test(doc, doc.documentElement, '(//set[@id=1]/*) = (//set[@id=3]/*)', true);
test(doc, doc.documentElement, '(//set[@id=1]/*) = (//set[@id=2]/*)', false);
test(doc, doc.documentElement, '(//set[@id=1]/*) != (//set[@id=1]/*)', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) != (//set[@id=4]/*)', false);
test(doc, doc.documentElement, '(//set[@id=1]/*) <= (//set[@id=2]/*)', true);
test(doc, doc.documentElement, '(//set[@id=2]/*) <= (//set[@id=1]/*)', false);
test(doc, doc.documentElement, '(//set[@id=1]/*) < (//set[@id=2]/*)', true);
test(doc, doc.documentElement, '(//set[@id=2]/*) < (//set[@id=1]/*)', false);
test(doc, doc.documentElement, '(//set[@id=2]/*) > (//set[@id=1]/*)', true);
test(doc, doc.documentElement, '(//set[@id=1]/*) > (//set[@id=2]/*)', false);
test(doc, doc.documentElement, '(//set[@id=2]/*) >= (//set[@id=1]/*)', true);
test(doc, doc.documentElement, '(//set[@id=1]/*) >= (//set[@id=2]/*)', false);
test(doc, doc.documentElement, '(//set[@id=4]/*) = (1 = 1)', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) = (1 = 0)', false);
test(doc, doc.documentElement, '(//set[@id=4]/*) != (1 = 0)', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) != (1 = 1)', false);
test(doc, doc.documentElement, '(//set[@id=4]/*) = 42', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) = 43', false);
test(doc, doc.documentElement, '(//set[@id=4]/*) != 43', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) != 42', false);
test(doc, doc.documentElement, '(//set[@id=4]/*) = "42.0"', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) = "42"', false);
test(doc, doc.documentElement, '(//set[@id=4]/*) != "42"', true);
test(doc, doc.documentElement, '(//set[@id=4]/*) != "42.0"', false);
test(doc, doc.documentElement, '"a" <= "a"', false);
test(doc, doc.documentElement, '"a" <= "b"', false);
test(doc, doc.documentElement, '"a" >= "a"', false);
test(doc, doc.documentElement, '"b" > "a"', false);
test(doc, doc.documentElement, '1 <= 1', true);
test(doc, doc.documentElement, '2 <= 1', false);
test(doc, doc.documentElement, '1 < 2', true);
test(doc, doc.documentElement, '1 < 1', false);
test(doc, doc.documentElement, '1 >= 1', true);
test(doc, doc.documentElement, '1 >= 2', false);
test(doc, doc.documentElement, '2 > 1', true);
test(doc, doc.documentElement, '1 > 1', false);
</script>
</body>
</html>
|