annotate genshi/tests/path.py @ 1044:ddb9354ad555 stable-0.7.x

Merge r1269 from trunk (fix for selecting namespaced attributes).
author hodgestar
date Thu, 20 Mar 2014 13:01:30 +0000
parents f91289c7d092
children
rev   line source
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
2 #
66
59eb24184e9c Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents: 38
diff changeset
3 # Copyright (C) 2006 Edgewall Software
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
4 # All rights reserved.
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
5 #
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
230
84168828b074 Renamed Markup to Genshi in repository.
cmlenz
parents: 228
diff changeset
8 # are also available at http://genshi.edgewall.org/wiki/License.
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
9 #
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
230
84168828b074 Renamed Markup to Genshi in repository.
cmlenz
parents: 228
diff changeset
12 # history and logs, available at http://genshi.edgewall.org/log/.
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
13
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
14 import doctest
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
15 import unittest
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
16
1044
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
17 from genshi.core import Attrs, QName
230
84168828b074 Renamed Markup to Genshi in repository.
cmlenz
parents: 228
diff changeset
18 from genshi.input import XML
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
19 from genshi.path import Path, PathParser, PathSyntaxError, GenericStrategy, \
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
20 SingleStepStrategy, SimplePathStrategy
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
21
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
22
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
23 class FakePath(Path):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
24 def __init__(self, strategy):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
25 self.strategy = strategy
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
26 def test(self, ignore_context = False):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
27 return self.strategy.test(ignore_context)
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
28
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
29
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
30 class PathTestCase(unittest.TestCase):
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
31
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
32 strategies = [GenericStrategy, SingleStepStrategy, SimplePathStrategy]
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
33
111
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
34 def test_error_no_absolute_path(self):
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
35 self.assertRaises(PathSyntaxError, Path, '/root')
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
36
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
37 def test_error_unsupported_axis(self):
137
ac0bc4a6aeba Further cleanup of XPath engine.
cmlenz
parents: 128
diff changeset
38 self.assertRaises(PathSyntaxError, Path, '..')
111
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
39 self.assertRaises(PathSyntaxError, Path, 'parent::ma')
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
40
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
41 def test_1step(self):
38
ee669cb9cccc Fix for #2 (incorrect context node in path expressions). Still some paths that produce incorrect results, but the common case seems to work now.
cmlenz
parents: 27
diff changeset
42 xml = XML('<root><elem/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
43 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
44 path = 'elem',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
45 equiv = '<Path "child::elem">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
46 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
47 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
48 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
49 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
50 path = 'elem',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
51 equiv = '<Path "child::elem">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
52 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
53 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
54 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
55 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
56 path = 'child::elem',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
57 equiv = '<Path "child::elem">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
58 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
59 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
60 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
61 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
62 path = '//elem',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
63 equiv = '<Path "descendant-or-self::elem">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
64 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
65 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
66 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
67 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
68 path = 'descendant::elem',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
69 equiv = '<Path "descendant::elem">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
70 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
71 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
72 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
73
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
74 def test_1step_self(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
75 xml = XML('<root><elem/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
76 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
77 path = '.',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
78 equiv = '<Path "self::node()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
79 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
80 output = '<root><elem/></root>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
81 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
82 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
83 path = 'self::node()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
84 equiv = '<Path "self::node()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
85 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
86 output = '<root><elem/></root>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
87 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
88
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
89 def test_1step_wildcard(self):
38
ee669cb9cccc Fix for #2 (incorrect context node in path expressions). Still some paths that produce incorrect results, but the common case seems to work now.
cmlenz
parents: 27
diff changeset
90 xml = XML('<root><elem/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
91 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
92 path = '*',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
93 equiv = '<Path "child::*">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
94 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
95 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
96 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
97 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
98 path = 'child::*',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
99 equiv = '<Path "child::*">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
100 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
101 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
102 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
103 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
104 path = 'child::node()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
105 equiv = '<Path "child::node()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
106 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
107 output = '<elem/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
108 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
109 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
110 path = '//*',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
111 equiv = '<Path "descendant-or-self::*">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
112 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
113 output = '<root><elem/></root>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
114 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
115
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
116 def test_1step_attribute(self):
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
117 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
118 path = '@foo',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
119 equiv = '<Path "attribute::foo">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
120 input = XML('<root/>'),
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
121 output = ''
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
122 )
111
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
123 xml = XML('<root foo="bar"/>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
124 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
125 path = '@foo',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
126 equiv = '<Path "attribute::foo">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
127 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
128 output = 'bar'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
129 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
130 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
131 path = './@foo',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
132 equiv = '<Path "self::node()/attribute::foo">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
133 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
134 output = 'bar'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
135 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
136
111
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
137 def test_1step_text(self):
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
138 xml = XML('<root>Hey</root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
139 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
140 path = 'text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
141 equiv = '<Path "child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
142 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
143 output = 'Hey'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
144 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
145 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
146 path = './text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
147 equiv = '<Path "self::node()/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
148 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
149 output = 'Hey'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
150 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
151 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
152 path = '//text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
153 equiv = '<Path "descendant-or-self::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
154 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
155 output = 'Hey'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
156 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
157 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
158 path = './/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
159 equiv = '<Path "self::node()/descendant-or-self::node()/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
160 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
161 output = 'Hey'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
162 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
163
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
164 def test_2step(self):
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
165 xml = XML('<root><foo/><bar/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
166 self._test_eval('*', input=xml, output='<foo/><bar/>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
167 self._test_eval('bar', input=xml, output='<bar/>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
168 self._test_eval('baz', input=xml, output='')
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
169
145
47bbd9d2a5af * Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents: 138
diff changeset
170 def test_2step_attribute(self):
47bbd9d2a5af * Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents: 138
diff changeset
171 xml = XML('<elem class="x"><span id="joe">Hey Joe</span></elem>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
172 self._test_eval('@*', input=xml, output='x')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
173 self._test_eval('./@*', input=xml, output='x')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
174 self._test_eval('.//@*', input=xml, output='xjoe')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
175 self._test_eval('*/@*', input=xml, output='joe')
145
47bbd9d2a5af * Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents: 138
diff changeset
176
215
94120e6b0ce4 A couple of minor XPath fixes.
cmlenz
parents: 179
diff changeset
177 xml = XML('<elem><foo id="1"/><foo id="2"/></elem>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
178 self._test_eval('@*', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
179 self._test_eval('foo/@*', input=xml, output='12')
145
47bbd9d2a5af * Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents: 138
diff changeset
180
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
181 def test_2step_complex(self):
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
182 xml = XML('<root><foo><bar/></foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
183 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
184 path = 'foo/bar',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
185 equiv = '<Path "child::foo/child::bar">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
186 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
187 output = '<bar/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
188 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
189 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
190 path = './bar',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
191 equiv = '<Path "self::node()/child::bar">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
192 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
193 output = ''
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
194 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
195 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
196 path = 'foo/*',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
197 equiv = '<Path "child::foo/child::*">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
198 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
199 output = '<bar/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
200 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
201 xml = XML('<root><foo><bar id="1"/></foo><bar id="2"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
202 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
203 path = './bar',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
204 equiv = '<Path "self::node()/child::bar">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
205 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
206 output = '<bar id="2"/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
207 )
833
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
208 xml = XML('''<table>
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
209 <tr><td>1</td><td>One</td></tr>
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
210 <tr><td>2</td><td>Two</td></tr>
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
211 </table>''')
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
212 self._test_eval(
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
213 path = 'tr/td[1]',
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
214 input = xml,
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
215 output = '<td>1</td><td>2</td>'
b3f1486af964 Added XPath unit test for #234.
cmlenz
parents: 832
diff changeset
216 )
835
11a0cee8e8f5 Added XPath unit test for #271 (was already incorrectly committed in [1043], oops)
cmlenz
parents: 834
diff changeset
217 xml = XML('''<ul>
834
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
218 <li>item1
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
219 <ul><li>subitem11</li></ul>
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
220 </li>
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
221 <li>item2
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
222 <ul><li>subitem21</li></ul>
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
223 </li>
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
224 </ul>''')
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
225 self._test_eval(
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
226 path = 'li[2]/ul',
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
227 input = xml,
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
228 output = '<ul><li>subitem21</li></ul>'
c965ea40311e Added XPath unit test for #234.
cmlenz
parents: 833
diff changeset
229 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
230
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
231 def test_2step_text(self):
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
232 xml = XML('<root><item>Foo</item></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
233 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
234 path = 'item/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
235 equiv = '<Path "child::item/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
236 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
237 output = 'Foo'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
238 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
239 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
240 path = '*/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
241 equiv = '<Path "child::*/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
242 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
243 output = 'Foo'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
244 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
245 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
246 path = '//text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
247 equiv = '<Path "descendant-or-self::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
248 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
249 output = 'Foo'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
250 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
251 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
252 path = './text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
253 equiv = '<Path "self::node()/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
254 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
255 output = ''
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
256 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
257 xml = XML('<root><item>Foo</item><item>Bar</item></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
258 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
259 path = 'item/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
260 equiv = '<Path "child::item/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
261 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
262 output = 'FooBar'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
263 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
264 xml = XML('<root><item><name>Foo</name><sub><name>Bar</name></sub></item></root>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
265 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
266 path = 'item/name/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
267 equiv = '<Path "child::item/child::name/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
268 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
269 output = 'Foo'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
270 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
271
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
272 def test_3step(self):
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
273 xml = XML('<root><foo><bar/></foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
274 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
275 path = 'foo/*',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
276 equiv = '<Path "child::foo/child::*">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
277 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
278 output = '<bar/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
279 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
280
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
281 def test_3step_complex(self):
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
282 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
283 path = '*/bar',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
284 equiv = '<Path "child::*/child::bar">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
285 input = XML('<root><foo><bar/></foo></root>'),
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
286 output = '<bar/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
287 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
288 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
289 path = '//bar',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
290 equiv = '<Path "descendant-or-self::bar">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
291 input = XML('<root><foo><bar id="1"/></foo><bar id="2"/></root>'),
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
292 output = '<bar id="1"/><bar id="2"/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
293 )
138
8ad716b4180d Add some more assertions to the XPath tests.
cmlenz
parents: 137
diff changeset
294
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
295 def test_3step_complex_text(self):
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
296 xml = XML('<root><item><bar>Some text </bar><baz><bar>in here.</bar></baz></item></root>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
297 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
298 path = 'item/bar/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
299 equiv = '<Path "child::item/child::bar/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
300 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
301 output = 'Some text '
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
302 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
303 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
304 path = 'item//bar/text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
305 equiv = '<Path "child::item/descendant-or-self::node()/child::bar/child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
306 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
307 output = 'Some text in here.'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
308 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
309
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
310 def test_node_type_comment(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
311 xml = XML('<root><!-- commented --></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
312 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
313 path = 'comment()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
314 equiv = '<Path "child::comment()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
315 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
316 output = '<!-- commented -->'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
317 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
318
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
319 def test_node_type_text(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
320 xml = XML('<root>Some text <br/>in here.</root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
321 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
322 path = 'text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
323 equiv = '<Path "child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
324 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
325 output = 'Some text in here.'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
326 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
327
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
328 def test_node_type_node(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
329 xml = XML('<root>Some text <br/>in here.</root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
330 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
331 path = 'node()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
332 equiv = '<Path "child::node()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
333 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
334 output = 'Some text <br/>in here.'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
335 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
336
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
337 def test_node_type_processing_instruction(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
338 xml = XML('<?python x = 2 * 3 ?><root><?php echo("x") ?></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
339 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
340 path = '//processing-instruction()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
341 equiv = '<Path "descendant-or-self::processing-instruction()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
342 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
343 output = '<?python x = 2 * 3 ?><?php echo("x") ?>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
344 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
345 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
346 path = 'processing-instruction()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
347 equiv = '<Path "child::processing-instruction()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
348 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
349 output = '<?php echo("x") ?>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
350 )
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
351 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
352 path = 'processing-instruction("php")',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
353 equiv = '<Path "child::processing-instruction(\"php\")">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
354 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
355 output = '<?php echo("x") ?>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
356 )
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
357
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
358 def test_simple_union(self):
259
fe8dbe9066c1 Fix bug in evaluating XPath expressions using the union operator `|`, which caused any path but the first to get out of sync with the event stream, and the whole thing returning too few results.
cmlenz
parents: 234
diff changeset
359 xml = XML("""<body>1<br />2<br />3<br /></body>""")
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
360 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
361 path = '*|text()',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
362 equiv = '<Path "child::*|child::text()">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
363 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
364 output = '1<br/>2<br/>3<br/>'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
365 )
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
366
121
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
367 def test_predicate_name(self):
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
368 xml = XML('<root><foo/><bar/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
369 self._test_eval('*[name()="foo"]', input=xml, output='<foo/>')
121
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
370
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
371 def test_predicate_localname(self):
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
372 xml = XML('<root><foo xmlns="NS"/><bar/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
373 self._test_eval('*[local-name()="foo"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
374 output='<foo xmlns="NS"/>')
121
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
375
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
376 def test_predicate_namespace(self):
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
377 xml = XML('<root><foo xmlns="NS"/><bar/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
378 self._test_eval('*[namespace-uri()="NS"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
379 output='<foo xmlns="NS"/>')
121
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
380
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
381 def test_predicate_not_name(self):
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
382 xml = XML('<root><foo/><bar/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
383 self._test_eval('*[not(name()="foo")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
384 output='<bar/>')
121
062e51ad7b19 Added support for the XPath functions `name()`, `namespace-uri()`, `local-name()`, and `not()`.
cmlenz
parents: 111
diff changeset
385
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
386 def test_predicate_attr(self):
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
387 xml = XML('<root><item/><item important="very"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
388 self._test_eval('item[@important]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
389 output='<item important="very"/>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
390 self._test_eval('item[@important="very"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
391 output='<item important="very"/>')
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
392
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
393 def test_predicate_attr_equality(self):
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
394 xml = XML('<root><item/><item important="notso"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
395 self._test_eval('item[@important="very"]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
396 self._test_eval('item[@important!="very"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
397 output='<item/><item important="notso"/>')
162
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
398
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
399 def test_predicate_attr_greater_than(self):
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
400 xml = XML('<root><item priority="3"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
401 self._test_eval('item[@priority>3]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
402 self._test_eval('item[@priority>2]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
403 output='<item priority="3"/>')
162
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
404
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
405 def test_predicate_attr_less_than(self):
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
406 xml = XML('<root><item priority="3"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
407 self._test_eval('item[@priority<3]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
408 self._test_eval('item[@priority<4]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
409 output='<item priority="3"/>')
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
410
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
411 def test_predicate_attr_and(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
412 xml = XML('<root><item/><item important="very"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
413 self._test_eval('item[@important and @important="very"]',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
414 input=xml, output='<item important="very"/>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
415 self._test_eval('item[@important and @important="notso"]',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
416 input=xml, output='')
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
417
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
418 def test_predicate_attr_or(self):
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
419 xml = XML('<root><item/><item important="very"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
420 self._test_eval('item[@urgent or @important]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
421 output='<item important="very"/>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
422 self._test_eval('item[@urgent or @notso]', input=xml, output='')
106
f9473bdc93b2 Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
cmlenz
parents: 66
diff changeset
423
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
424 def test_predicate_boolean_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
425 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
426 self._test_eval('*[boolean("")]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
427 self._test_eval('*[boolean("yo")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
428 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
429 self._test_eval('*[boolean(0)]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
430 self._test_eval('*[boolean(42)]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
431 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
432 self._test_eval('*[boolean(false())]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
433 self._test_eval('*[boolean(true())]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
434 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
435
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
436 def test_predicate_ceil_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
437 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
438 self._test_eval('*[ceiling("4.5")=5]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
439 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
440
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
441 def test_predicate_concat_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
442 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
443 self._test_eval('*[name()=concat("f", "oo")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
444 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
445
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
446 def test_predicate_contains_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
447 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
448 self._test_eval('*[contains(name(), "oo")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
449 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
450
534
57b5d5138f1a Add XPath `matches()` function which, of course, supports the Python regular
athomas
parents: 413
diff changeset
451 def test_predicate_matches_function(self):
57b5d5138f1a Add XPath `matches()` function which, of course, supports the Python regular
athomas
parents: 413
diff changeset
452 xml = XML('<root><foo>bar</foo><bar>foo</bar></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
453 self._test_eval('*[matches(name(), "foo|bar")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
454 output='<foo>bar</foo><bar>foo</bar>')
534
57b5d5138f1a Add XPath `matches()` function which, of course, supports the Python regular
athomas
parents: 413
diff changeset
455
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
456 def test_predicate_false_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
457 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
458 self._test_eval('*[false()]', input=xml, output='')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
459
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
460 def test_predicate_floor_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
461 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
462 self._test_eval('*[floor("4.5")=4]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
463 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
464
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
465 def test_predicate_normalize_space_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
466 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
467 self._test_eval('*[normalize-space(" foo bar ")="foo bar"]',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
468 input=xml, output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
469
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
470 def test_predicate_number_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
471 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
472 self._test_eval('*[number("3.0")=3]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
473 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
474 self._test_eval('*[number("3.0")=3.0]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
475 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
476 self._test_eval('*[number("0.1")=.1]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
477 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
478
162
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
479 def test_predicate_round_function(self):
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
480 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
481 self._test_eval('*[round("4.4")=4]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
482 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
483 self._test_eval('*[round("4.6")=5]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
484 output='<foo>bar</foo>')
162
456039594db9 Implement the XPath relational operators and the `round()` function.
cmlenz
parents: 155
diff changeset
485
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
486 def test_predicate_starts_with_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
487 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
488 self._test_eval('*[starts-with(name(), "f")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
489 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
490 self._test_eval('*[starts-with(name(), "b")]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
491 output='')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
492
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
493 def test_predicate_string_length_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
494 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
495 self._test_eval('*[string-length(name())=3]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
496 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
497
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
498 def test_predicate_substring_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
499 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
500 self._test_eval('*[substring(name(), 1)="oo"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
501 output='<foo>bar</foo>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
502 self._test_eval('*[substring(name(), 1, 1)="o"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
503 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
504
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
505 def test_predicate_substring_after_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
506 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
507 self._test_eval('*[substring-after(name(), "f")="oo"]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
508 output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
509
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
510 def test_predicate_substring_before_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
511 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
512 self._test_eval('*[substring-before(name(), "oo")="f"]',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
513 input=xml, output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
514
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
515 def test_predicate_translate_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
516 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
517 self._test_eval('*[translate(name(), "fo", "ba")="baa"]',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
518 input=xml, output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
519
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
520 def test_predicate_true_function(self):
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
521 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
522 self._test_eval('*[true()]', input=xml, output='<foo>bar</foo>')
155
9a5aedda1099 * String literals in XPath expressions that contains spaces are now tokenizes correctly.
cmlenz
parents: 145
diff changeset
523
179
13909179e5e1 Implemented support for XPath variables in predicates (#31).
cmlenz
parents: 164
diff changeset
524 def test_predicate_variable(self):
13909179e5e1 Implemented support for XPath variables in predicates (#31).
cmlenz
parents: 164
diff changeset
525 xml = XML('<root><foo>bar</foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
526 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
527 path = '*[name()=$bar]',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
528 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
529 output = '<foo>bar</foo>',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
530 variables = {'bar': 'foo'}
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
531 )
224
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
532
228
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
533 def test_predicate_position(self):
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
534 xml = XML('<root><foo id="a1"/><foo id="a2"/><foo id="a3"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
535 self._test_eval('*[2]', input=xml, output='<foo id="a2"/>')
228
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
536
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
537 def test_predicate_attr_and_position(self):
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
538 xml = XML('<root><foo/><foo id="a1"/><foo id="a2"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
539 self._test_eval('*[@id][2]', input=xml, output='<foo id="a2"/>')
228
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
540
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
541 def test_predicate_position_and_attr(self):
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
542 xml = XML('<root><foo/><foo id="a1"/><foo id="a2"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
543 self._test_eval('*[1][@id]', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
544 self._test_eval('*[2][@id]', input=xml, output='<foo id="a1"/>')
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
545
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
546 def test_predicate_advanced_position(self):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
547 xml = XML('<root><a><b><c><d><e/></d></c></b></a></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
548 self._test_eval( 'descendant-or-self::*/'
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
549 'descendant-or-self::*/'
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
550 'descendant-or-self::*[2]/'
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
551 'self::*/descendant::*[3]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
552 output='<d><e/></d>')
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
553
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
554 def test_predicate_child_position(self):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
555 xml = XML('\
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
556 <root><a><b>1</b><b>2</b><b>3</b></a><a><b>4</b><b>5</b></a></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
557 self._test_eval('//a/b[2]', input=xml, output='<b>2</b><b>5</b>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
558 self._test_eval('//a/b[3]', input=xml, output='<b>3</b>')
228
a5b38b459cbb Add support for position predicates in XPath expressions.
cmlenz
parents: 224
diff changeset
559
224
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
560 def test_name_with_namespace(self):
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
561 xml = XML('<root xmlns:f="FOO"><f:foo>bar</f:foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
562 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
563 path = 'f:foo',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
564 equiv = '<Path "child::f:foo">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
565 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
566 output = '<foo xmlns="FOO">bar</foo>',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
567 namespaces = {'f': 'FOO'}
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
568 )
224
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
569
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
570 def test_wildcard_with_namespace(self):
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
571 xml = XML('<root xmlns:f="FOO"><f:foo>bar</f:foo></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
572 self._test_eval(
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
573 path = 'f:*',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
574 equiv = '<Path "child::f:*">',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
575 input = xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
576 output = '<foo xmlns="FOO">bar</foo>',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
577 namespaces = {'f': 'FOO'}
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
578 )
224
90d62225f411 Implement support for namespace prefixes in XPath expressions.
cmlenz
parents: 216
diff changeset
579
384
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
580 def test_predicate_termination(self):
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
581 """
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
582 Verify that a patch matching the self axis with a predicate doesn't
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
583 cause an infinite loop. See <http://genshi.edgewall.org/ticket/82>.
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
584 """
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
585 xml = XML('<ul flag="1"><li>a</li><li>b</li></ul>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
586 self._test_eval('.[@flag="1"]/*', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
587 output='<li>a</li><li>b</li>')
384
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
588
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
589 xml = XML('<ul flag="1"><li>a</li><li>b</li></ul>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
590 self._test_eval('.[@flag="0"]/*', input=xml, output='')
384
5b6e4335ee21 Fix for infinite loop in XPath test. Closes #82.
cmlenz
parents: 282
diff changeset
591
410
d14d89995c29 Improve the handling of namespaces in serialization.
cmlenz
parents: 384
diff changeset
592 def test_attrname_with_namespace(self):
d14d89995c29 Improve the handling of namespaces in serialization.
cmlenz
parents: 384
diff changeset
593 xml = XML('<root xmlns:f="FOO"><foo f:bar="baz"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
594 self._test_eval('foo[@f:bar]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
595 output='<foo xmlns:ns1="FOO" ns1:bar="baz"/>',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
596 namespaces={'f': 'FOO'})
410
d14d89995c29 Improve the handling of namespaces in serialization.
cmlenz
parents: 384
diff changeset
597
d14d89995c29 Improve the handling of namespaces in serialization.
cmlenz
parents: 384
diff changeset
598 def test_attrwildcard_with_namespace(self):
d14d89995c29 Improve the handling of namespaces in serialization.
cmlenz
parents: 384
diff changeset
599 xml = XML('<root xmlns:f="FOO"><foo f:bar="baz"/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
600 self._test_eval('foo[@f:*]', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
601 output='<foo xmlns:ns1="FOO" ns1:bar="baz"/>',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
602 namespaces={'f': 'FOO'})
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
603
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
604 def test_self_and_descendant(self):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
605 xml = XML('<root><foo/></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
606 self._test_eval('self::root', input=xml, output='<root><foo/></root>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
607 self._test_eval('self::foo', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
608 self._test_eval('descendant::root', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
609 self._test_eval('descendant::foo', input=xml, output='<foo/>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
610 self._test_eval('descendant-or-self::root', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
611 output='<root><foo/></root>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
612 self._test_eval('descendant-or-self::foo', input=xml, output='<foo/>')
179
13909179e5e1 Implemented support for XPath variables in predicates (#31).
cmlenz
parents: 164
diff changeset
613
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
614 def test_long_simple_paths(self):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
615 xml = XML('<root><a><b><a><d><a><b><a><b><a><b><a><c>!'
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
616 '</c></a></b></a></b></a></b></a></d></a></b></a></root>')
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
617 self._test_eval('//a/b/a/b/a/c', input=xml, output='<c>!</c>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
618 self._test_eval('//a/b/a/c', input=xml, output='<c>!</c>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
619 self._test_eval('//a/c', input=xml, output='<c>!</c>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
620 self._test_eval('//c', input=xml, output='<c>!</c>')
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
621 # Please note that a//b is NOT the same as a/descendant::b
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
622 # it is a/descendant-or-self::node()/b, which SimplePathStrategy
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
623 # does NOT support
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
624 self._test_eval('a/b/descendant::a/c', input=xml, output='<c>!</c>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
625 self._test_eval('a/b/descendant::a/d/descendant::a/c',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
626 input=xml, output='<c>!</c>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
627 self._test_eval('a/b/descendant::a/d/a/c', input=xml, output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
628 self._test_eval('//d/descendant::b/descendant::b/descendant::b'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
629 '/descendant::c', input=xml, output='<c>!</c>')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
630 self._test_eval('//d/descendant::b/descendant::b/descendant::b'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
631 '/descendant::b/descendant::c', input=xml,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
632 output='')
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
633
1044
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
634 def test_attr_selection(self):
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
635 xml = XML('<root><foo bar="abc"></foo></root>')
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
636 path = Path('foo/@bar')
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
637 result = path.select(xml)
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
638 self.assertEqual(list(result), [
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
639 Attrs([(QName('bar'), u'abc')])
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
640 ])
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
641
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
642 def test_attr_selection_with_namespace(self):
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
643 xml = XML(
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
644 '<root xmlns:ns1="http://example.com">'
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
645 '<foo ns1:bar="abc"></foo>'
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
646 '</root>')
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
647 path = Path('foo/@ns1:bar')
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
648 result = path.select(xml, namespaces={'ns1': 'http://example.com'})
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
649 self.assertEqual(list(result), [
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
650 Attrs([(QName('http://example.com}bar'), u'abc')])
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
651 ])
ddb9354ad555 Merge r1269 from trunk (fix for selecting namespaced attributes).
hodgestar
parents: 864
diff changeset
652
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
653 def _test_support(self, strategy_class, text):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
654 path = PathParser(text, None, -1).parse()[0]
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
655 return strategy_class.supports(path)
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
656
818
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
657 def test_simple_strategy_support(self):
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
658 self.assert_(self._test_support(SimplePathStrategy, 'a/b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
659 self.assert_(self._test_support(SimplePathStrategy, 'self::a/b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
660 self.assert_(self._test_support(SimplePathStrategy, 'descendant::a/b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
661 self.assert_(self._test_support(SimplePathStrategy,
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
662 'descendant-or-self::a/b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
663 self.assert_(self._test_support(SimplePathStrategy, '//a/b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
664 self.assert_(self._test_support(SimplePathStrategy, 'a/@b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
665 self.assert_(self._test_support(SimplePathStrategy, 'a/text()'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
666
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
667 # a//b is a/descendant-or-self::node()/b
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
668 self.assert_(not self._test_support(SimplePathStrategy, 'a//b'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
669 self.assert_(not self._test_support(SimplePathStrategy, 'node()/@a'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
670 self.assert_(not self._test_support(SimplePathStrategy, '@a'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
671 self.assert_(not self._test_support(SimplePathStrategy, 'foo:bar'))
2886abff9502 Merged soc2008-xpath branch back into trunk.
cmlenz
parents: 638
diff changeset
672 self.assert_(not self._test_support(SimplePathStrategy, 'a/@foo:bar'))
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
673
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
674 def _test_strategies(self, input, path, output,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
675 namespaces=None, variables=None):
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
676 for strategy in self.strategies:
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
677 if not strategy.supports(path):
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
678 continue
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
679 s = strategy(path)
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
680 rendered = FakePath(s).select(input, namespaces=namespaces,
864
f91289c7d092 Also skip the encoding step in the XPath tests.
cmlenz
parents: 835
diff changeset
681 variables=variables) \
f91289c7d092 Also skip the encoding step in the XPath tests.
cmlenz
parents: 835
diff changeset
682 .render(encoding=None)
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
683 msg = 'Bad render using %s strategy' % str(strategy)
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
684 msg += '\nExpected:\t%r' % output
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
685 msg += '\nRendered:\t%r' % rendered
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
686 self.assertEqual(output, rendered, msg)
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
687
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
688 def _test_eval(self, path, equiv=None, input=None, output='',
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
689 namespaces=None, variables=None):
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
690 path = Path(path)
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
691 if equiv is not None:
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
692 self.assertEqual(equiv, repr(path))
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
693
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
694 if input is None:
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
695 return
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
696
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
697 rendered = path.select(input, namespaces=namespaces,
864
f91289c7d092 Also skip the encoding step in the XPath tests.
cmlenz
parents: 835
diff changeset
698 variables=variables).render(encoding=None)
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
699 msg = 'Bad output using whole path'
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
700 msg += '\nExpected:\t%r' % output
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
701 msg += '\nRendered:\t%r' % rendered
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
702 self.assertEqual(output, rendered, msg)
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
703
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
704 if len(path.paths) == 1:
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
705 self._test_strategies(input, path.paths[0], output,
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
706 namespaces=namespaces, variables=variables)
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
707
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
708
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
709 def suite():
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
710 suite = unittest.TestSuite()
111
2368c3becc52 Some fixes and more unit tests for the XPath engine.
cmlenz
parents: 106
diff changeset
711 suite.addTest(doctest.DocTestSuite(Path.__module__))
26
3c1a022be04c * Split out the XPath tests into a separate `unittest`-based file.
cmlenz
parents: 1
diff changeset
712 suite.addTest(unittest.makeSuite(PathTestCase, 'test'))
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
713 return suite
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
714
832
395b701f10d3 Cleaned up XPath tests, added tests from #185.
cmlenz
parents: 818
diff changeset
715
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
716 if __name__ == '__main__':
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
717 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software