# HG changeset patch
# User cmlenz
# Date 1237299922 0
# Node ID 395b701f10d35ebf7196baab507bcd0e7eacc3cc
# Parent 7a422be6f6a653833b4ba646e28fb3b5eb811213
Cleaned up XPath tests, added tests from #185.
diff --git a/genshi/tests/path.py b/genshi/tests/path.py
--- a/genshi/tests/path.py
+++ b/genshi/tests/path.py
@@ -25,45 +25,10 @@
def test(self, ignore_context = False):
return self.strategy.test(ignore_context)
+
class PathTestCase(unittest.TestCase):
strategies = [GenericStrategy, SingleStepStrategy, SimplePathStrategy]
- def _create_path(self, expression, expected):
- return path
-
- def _test_strategies(self, stream, path, render,
- namespaces=None, variables=None):
- for strategy in self.strategies:
- if not strategy.supports(path):
- continue
- s = strategy(path)
- rendered = FakePath(s).select(stream,namespaces=namespaces,
- variables=variables).render()
- msg = "Bad render using %s strategy"%str(strategy)
- msg += "\nExpected:\t'%s'"%render
- msg += "\nRendered:\t'%s'"%rendered
- self.assertEqual(render, rendered, msg)
-
- def _test_expression(self, text, expected, stream=None, render="",
- namespaces=None, variables=None):
- path = Path(text)
- if expected is not None:
- self.assertEqual(expected, repr(path))
-
- if stream is None:
- return
-
- rendered = path.select(stream, namespaces=namespaces,
- variables=variables).render()
- msg = "Bad render using whole path"
- msg += "\nExpected:\t'%s'"%render
- msg += "\nRendered:\t'%s'"%rendered
- self.assertEqual(render, rendered, msg)
-
- if len(path.paths) == 1:
- self._test_strategies(stream, path.paths[0], render,
- namespaces=namespaces, variables=variables)
-
def test_error_no_absolute_path(self):
self.assertRaises(PathSyntaxError, Path, '/root')
@@ -74,442 +39,520 @@
def test_1step(self):
xml = XML('')
-
- self._test_expression( 'elem',
- '',
- xml,
- '')
-
- self._test_expression( 'elem',
- '',
- xml,
- '')
-
- self._test_expression( 'child::elem',
- '',
- xml,
- '')
-
- self._test_expression( '//elem',
- '',
- xml,
- '')
-
- self._test_expression( 'descendant::elem',
- '',
- xml,
- '')
+ self._test_eval(
+ path = 'elem',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'elem',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'child::elem',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = '//elem',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'descendant::elem',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_1step_self(self):
xml = XML('')
-
- self._test_expression( '.',
- '',
- xml,
- '')
-
- self._test_expression( 'self::node()',
- '',
- xml,
- '')
+ self._test_eval(
+ path = '.',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'self::node()',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_1step_wildcard(self):
xml = XML('')
-
- self._test_expression( '*',
- '',
- xml,
- '')
-
- self._test_expression( 'child::*',
- '',
- xml,
- '')
-
- self._test_expression( 'child::node()',
- '',
- xml,
- '')
-
- self._test_expression( '//*',
- '',
- xml,
- '')
+ self._test_eval(
+ path = '*',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'child::*',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'child::node()',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = '//*',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_1step_attribute(self):
- self._test_expression( '@foo',
- '',
- XML(''),
- '')
-
+ self._test_eval(
+ path = '@foo',
+ equiv = '',
+ input = XML(''),
+ output = ''
+ )
xml = XML('')
-
- self._test_expression( '@foo',
- '',
- xml,
- 'bar')
-
- self._test_expression( './@foo',
- '',
- xml,
- 'bar')
+ self._test_eval(
+ path = '@foo',
+ equiv = '',
+ input = xml,
+ output = 'bar'
+ )
+ self._test_eval(
+ path = './@foo',
+ equiv = '',
+ input = xml,
+ output = 'bar'
+ )
def test_1step_text(self):
xml = XML('Hey')
-
- self._test_expression( 'text()',
- '',
- xml,
- 'Hey')
-
- self._test_expression( './text()',
- '',
- xml,
- 'Hey')
-
- self._test_expression( '//text()',
- '',
- xml,
- 'Hey')
-
- self._test_expression( './/text()',
- '',
- xml,
- 'Hey')
+ self._test_eval(
+ path = 'text()',
+ equiv = '',
+ input = xml,
+ output = 'Hey'
+ )
+ self._test_eval(
+ path = './text()',
+ equiv = '',
+ input = xml,
+ output = 'Hey'
+ )
+ self._test_eval(
+ path = '//text()',
+ equiv = '',
+ input = xml,
+ output = 'Hey'
+ )
+ self._test_eval(
+ path = './/text()',
+ equiv = '',
+ input = xml,
+ output = 'Hey'
+ )
def test_2step(self):
xml = XML('')
- self._test_expression('*', None, xml, '')
- self._test_expression('bar', None, xml, '')
- self._test_expression('baz', None, xml, '')
+ self._test_eval('*', input=xml, output='')
+ self._test_eval('bar', input=xml, output='')
+ self._test_eval('baz', input=xml, output='')
def test_2step_attribute(self):
xml = XML('Hey Joe')
- self._test_expression('@*', None, xml, 'x')
- self._test_expression('./@*', None, xml, 'x')
- self._test_expression('.//@*', None, xml, 'xjoe')
- self._test_expression('*/@*', None, xml, 'joe')
+ self._test_eval('@*', input=xml, output='x')
+ self._test_eval('./@*', input=xml, output='x')
+ self._test_eval('.//@*', input=xml, output='xjoe')
+ self._test_eval('*/@*', input=xml, output='joe')
xml = XML('')
- self._test_expression('@*', None, xml, '')
- self._test_expression('foo/@*', None, xml, '12')
+ self._test_eval('@*', input=xml, output='')
+ self._test_eval('foo/@*', input=xml, output='12')
def test_2step_complex(self):
xml = XML('')
-
- self._test_expression( 'foo/bar',
- '',
- xml,
- '')
-
- self._test_expression( './bar',
- '',
- xml,
- '')
-
- self._test_expression( 'foo/*',
- '',
- xml,
- '')
-
+ self._test_eval(
+ path = 'foo/bar',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = './bar',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'foo/*',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
xml = XML('')
- self._test_expression( './bar',
- '',
- xml,
- '')
+ self._test_eval(
+ path = './bar',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_2step_text(self):
xml = XML('- Foo
')
-
- self._test_expression( 'item/text()',
- '',
- xml,
- 'Foo')
-
- self._test_expression( '*/text()',
- '',
- xml,
- 'Foo')
-
- self._test_expression( '//text()',
- '',
- xml,
- 'Foo')
-
- self._test_expression( './text()',
- '',
- xml,
- '')
-
+ self._test_eval(
+ path = 'item/text()',
+ equiv = '',
+ input = xml,
+ output = 'Foo'
+ )
+ self._test_eval(
+ path = '*/text()',
+ equiv = '',
+ input = xml,
+ output = 'Foo'
+ )
+ self._test_eval(
+ path = '//text()',
+ equiv = '',
+ input = xml,
+ output = 'Foo'
+ )
+ self._test_eval(
+ path = './text()',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
xml = XML('- Foo
- Bar
')
- self._test_expression( 'item/text()',
- '',
- xml,
- 'FooBar')
+ self._test_eval(
+ path = 'item/text()',
+ equiv = '',
+ input = xml,
+ output = 'FooBar'
+ )
+ xml = XML('- FooBar
')
+ self._test_eval(
+ path = 'item/name/text()',
+ equiv = '',
+ input = xml,
+ output = 'Foo'
+ )
def test_3step(self):
xml = XML('')
- self._test_expression( 'foo/*',
- '',
- xml,
- '')
+ self._test_eval(
+ path = 'foo/*',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_3step_complex(self):
- xml = XML('')
- self._test_expression( '*/bar',
- '',
- xml,
- '')
+ self._test_eval(
+ path = '*/bar',
+ equiv = '',
+ input = XML(''),
+ output = ''
+ )
+ self._test_eval(
+ path = '//bar',
+ equiv = '',
+ input = XML(''),
+ output = ''
+ )
- xml = XML('')
- self._test_expression( '//bar',
- '',
- xml,
- '')
+ def test_3step_complex_text(self):
+ xml = XML('- Some text in here.
')
+ self._test_eval(
+ path = 'item/bar/text()',
+ equiv = '',
+ input = xml,
+ output = 'Some text '
+ )
+ self._test_eval(
+ path = 'item//bar/text()',
+ equiv = '',
+ input = xml,
+ output = 'Some text in here.'
+ )
def test_node_type_comment(self):
xml = XML('')
- self._test_expression( 'comment()',
- '',
- xml,
- '')
+ self._test_eval(
+ path = 'comment()',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_node_type_text(self):
xml = XML('Some text
in here.')
- self._test_expression( 'text()',
- '',
- xml,
- 'Some text in here.')
+ self._test_eval(
+ path = 'text()',
+ equiv = '',
+ input = xml,
+ output = 'Some text in here.'
+ )
def test_node_type_node(self):
xml = XML('Some text
in here.')
- self._test_expression( 'node()',
- '',
- xml,
- 'Some text
in here.',)
+ self._test_eval(
+ path = 'node()',
+ equiv = '',
+ input = xml,
+ output = 'Some text
in here.'
+ )
def test_node_type_processing_instruction(self):
xml = XML('')
-
- self._test_expression( '//processing-instruction()',
- '',
- xml,
- '')
-
- self._test_expression( 'processing-instruction()',
- '',
- xml,
- '')
-
- self._test_expression( 'processing-instruction("php")',
- '',
- xml,
- '')
+ self._test_eval(
+ path = '//processing-instruction()',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'processing-instruction()',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
+ self._test_eval(
+ path = 'processing-instruction("php")',
+ equiv = '',
+ input = xml,
+ output = ''
+ )
def test_simple_union(self):
xml = XML("""1
2
3
""")
- self._test_expression( '*|text()',
- '',
- xml,
- '1
2
3
')
+ self._test_eval(
+ path = '*|text()',
+ equiv = '',
+ input = xml,
+ output = '1
2
3
'
+ )
def test_predicate_name(self):
xml = XML('')
- self._test_expression('*[name()="foo"]', None, xml, '')
+ self._test_eval('*[name()="foo"]', input=xml, output='')
def test_predicate_localname(self):
xml = XML('')
- self._test_expression('*[local-name()="foo"]', None, xml,
- '')
+ self._test_eval('*[local-name()="foo"]', input=xml,
+ output='')
def test_predicate_namespace(self):
xml = XML('')
- self._test_expression('*[namespace-uri()="NS"]', None, xml,
- '')
+ self._test_eval('*[namespace-uri()="NS"]', input=xml,
+ output='')
def test_predicate_not_name(self):
xml = XML('')
- self._test_expression('*[not(name()="foo")]', None, xml, '')
+ self._test_eval('*[not(name()="foo")]', input=xml,
+ output='')
def test_predicate_attr(self):
xml = XML(' ')
- self._test_expression('item[@important]', None, xml,
- ' ')
- self._test_expression('item[@important="very"]', None, xml,
- ' ')
+ self._test_eval('item[@important]', input=xml,
+ output=' ')
+ self._test_eval('item[@important="very"]', input=xml,
+ output=' ')
def test_predicate_attr_equality(self):
xml = XML(' ')
- self._test_expression('item[@important="very"]', None, xml, '')
- self._test_expression('item[@important!="very"]', None, xml,
- ' ')
+ self._test_eval('item[@important="very"]', input=xml, output='')
+ self._test_eval('item[@important!="very"]', input=xml,
+ output=' ')
def test_predicate_attr_greater_than(self):
xml = XML(' ')
- self._test_expression('item[@priority>3]', None, xml, '')
- self._test_expression('item[@priority>2]', None, xml,
- ' ')
+ self._test_eval('item[@priority>3]', input=xml, output='')
+ self._test_eval('item[@priority>2]', input=xml,
+ output=' ')
def test_predicate_attr_less_than(self):
xml = XML(' ')
- self._test_expression('item[@priority<3]', None, xml, '')
- self._test_expression('item[@priority<4]', None, xml,
- ' ')
+ self._test_eval('item[@priority<3]', input=xml, output='')
+ self._test_eval('item[@priority<4]', input=xml,
+ output=' ')
def test_predicate_attr_and(self):
xml = XML(' ')
- self._test_expression('item[@important and @important="very"]',
- None, xml, ' ')
- self._test_expression('item[@important and @important="notso"]',
- None, xml, '')
+ self._test_eval('item[@important and @important="very"]',
+ input=xml, output=' ')
+ self._test_eval('item[@important and @important="notso"]',
+ input=xml, output='')
def test_predicate_attr_or(self):
xml = XML(' ')
- self._test_expression('item[@urgent or @important]', None, xml,
- ' ')
- self._test_expression('item[@urgent or @notso]', None, xml, '')
+ self._test_eval('item[@urgent or @important]', input=xml,
+ output=' ')
+ self._test_eval('item[@urgent or @notso]', input=xml, output='')
def test_predicate_boolean_function(self):
xml = XML('bar')
- self._test_expression('*[boolean("")]', None, xml, '')
- self._test_expression('*[boolean("yo")]', None, xml, 'bar')
- self._test_expression('*[boolean(0)]', None, xml, '')
- self._test_expression('*[boolean(42)]', None, xml, 'bar')
- self._test_expression('*[boolean(false())]', None, xml, '')
- self._test_expression('*[boolean(true())]', None, xml,
- 'bar')
+ self._test_eval('*[boolean("")]', input=xml, output='')
+ self._test_eval('*[boolean("yo")]', input=xml,
+ output='bar')
+ self._test_eval('*[boolean(0)]', input=xml, output='')
+ self._test_eval('*[boolean(42)]', input=xml,
+ output='bar')
+ self._test_eval('*[boolean(false())]', input=xml, output='')
+ self._test_eval('*[boolean(true())]', input=xml,
+ output='bar')
def test_predicate_ceil_function(self):
xml = XML('bar')
- self._test_expression('*[ceiling("4.5")=5]', None, xml,
- 'bar')
+ self._test_eval('*[ceiling("4.5")=5]', input=xml,
+ output='bar')
def test_predicate_concat_function(self):
xml = XML('bar')
- self._test_expression('*[name()=concat("f", "oo")]', None, xml,
- 'bar')
+ self._test_eval('*[name()=concat("f", "oo")]', input=xml,
+ output='bar')
def test_predicate_contains_function(self):
xml = XML('bar')
- self._test_expression('*[contains(name(), "oo")]', None, xml,
- 'bar')
+ self._test_eval('*[contains(name(), "oo")]', input=xml,
+ output='bar')
def test_predicate_matches_function(self):
xml = XML('barfoo')
- self._test_expression('*[matches(name(), "foo|bar")]', None, xml,
- 'barfoo')
+ self._test_eval('*[matches(name(), "foo|bar")]', input=xml,
+ output='barfoo')
def test_predicate_false_function(self):
xml = XML('bar')
- self._test_expression('*[false()]', None, xml, '')
+ self._test_eval('*[false()]', input=xml, output='')
def test_predicate_floor_function(self):
xml = XML('bar')
- self._test_expression('*[floor("4.5")=4]', None, xml,
- 'bar')
+ self._test_eval('*[floor("4.5")=4]', input=xml,
+ output='bar')
def test_predicate_normalize_space_function(self):
xml = XML('bar')
- self._test_expression('*[normalize-space(" foo bar ")="foo bar"]',
- None, xml, 'bar')
+ self._test_eval('*[normalize-space(" foo bar ")="foo bar"]',
+ input=xml, output='bar')
def test_predicate_number_function(self):
xml = XML('bar')
- self._test_expression('*[number("3.0")=3]', None, xml,
- 'bar')
- self._test_expression('*[number("3.0")=3.0]', None, xml,
- 'bar')
- self._test_expression('*[number("0.1")=.1]', None, xml,
- 'bar')
+ self._test_eval('*[number("3.0")=3]', input=xml,
+ output='bar')
+ self._test_eval('*[number("3.0")=3.0]', input=xml,
+ output='bar')
+ self._test_eval('*[number("0.1")=.1]', input=xml,
+ output='bar')
def test_predicate_round_function(self):
xml = XML('bar')
- self._test_expression('*[round("4.4")=4]', None, xml,
- 'bar')
- self._test_expression('*[round("4.6")=5]', None, xml,
- 'bar')
+ self._test_eval('*[round("4.4")=4]', input=xml,
+ output='bar')
+ self._test_eval('*[round("4.6")=5]', input=xml,
+ output='bar')
def test_predicate_starts_with_function(self):
xml = XML('bar')
- self._test_expression('*[starts-with(name(), "f")]', None, xml,
- 'bar')
- self._test_expression('*[starts-with(name(), "b")]', None, xml, '')
+ self._test_eval('*[starts-with(name(), "f")]', input=xml,
+ output='bar')
+ self._test_eval('*[starts-with(name(), "b")]', input=xml,
+ output='')
def test_predicate_string_length_function(self):
xml = XML('bar')
- self._test_expression('*[string-length(name())=3]', None, xml,
- 'bar')
+ self._test_eval('*[string-length(name())=3]', input=xml,
+ output='bar')
def test_predicate_substring_function(self):
xml = XML('bar')
- self._test_expression('*[substring(name(), 1)="oo"]', None, xml,
- 'bar')
- self._test_expression('*[substring(name(), 1, 1)="o"]', None, xml,
- 'bar')
+ self._test_eval('*[substring(name(), 1)="oo"]', input=xml,
+ output='bar')
+ self._test_eval('*[substring(name(), 1, 1)="o"]', input=xml,
+ output='bar')
def test_predicate_substring_after_function(self):
xml = XML('bar')
- self._test_expression('*[substring-after(name(), "f")="oo"]', None, xml,
- 'bar')
+ self._test_eval('*[substring-after(name(), "f")="oo"]', input=xml,
+ output='bar')
def test_predicate_substring_before_function(self):
xml = XML('bar')
- self._test_expression('*[substring-before(name(), "oo")="f"]',
- None, xml, 'bar')
+ self._test_eval('*[substring-before(name(), "oo")="f"]',
+ input=xml, output='bar')
def test_predicate_translate_function(self):
xml = XML('bar')
- self._test_expression('*[translate(name(), "fo", "ba")="baa"]',
- None, xml, 'bar')
+ self._test_eval('*[translate(name(), "fo", "ba")="baa"]',
+ input=xml, output='bar')
def test_predicate_true_function(self):
xml = XML('bar')
- self._test_expression('*[true()]', None, xml, 'bar')
+ self._test_eval('*[true()]', input=xml, output='bar')
def test_predicate_variable(self):
xml = XML('bar')
- variables = {'bar': 'foo'}
- self._test_expression('*[name()=$bar]', None, xml, 'bar',
- variables = variables)
+ self._test_eval(
+ path = '*[name()=$bar]',
+ input = xml,
+ output = 'bar',
+ variables = {'bar': 'foo'}
+ )
def test_predicate_position(self):
xml = XML('')
- self._test_expression('*[2]', None, xml, '')
+ self._test_eval('*[2]', input=xml, output='')
def test_predicate_attr_and_position(self):
xml = XML('')
- self._test_expression('*[@id][2]', None, xml, '')
+ self._test_eval('*[@id][2]', input=xml, output='')
def test_predicate_position_and_attr(self):
xml = XML('')
- self._test_expression('*[1][@id]', None, xml, '')
- self._test_expression('*[2][@id]', None, xml, '')
+ self._test_eval('*[1][@id]', input=xml, output='')
+ self._test_eval('*[2][@id]', input=xml, output='')
def test_predicate_advanced_position(self):
xml = XML('')
- self._test_expression( 'descendant-or-self::*/'
+ self._test_eval( 'descendant-or-self::*/'
'descendant-or-self::*/'
'descendant-or-self::*[2]/'
- 'self::*/descendant::*[3]', None, xml,
- '')
+ 'self::*/descendant::*[3]', input=xml,
+ output='')
def test_predicate_child_position(self):
xml = XML('\
12345')
- self._test_expression('//a/b[2]', None, xml, '25')
- self._test_expression('//a/b[3]', None, xml, '3')
+ self._test_eval('//a/b[2]', input=xml, output='25')
+ self._test_eval('//a/b[3]', input=xml, output='3')
def test_name_with_namespace(self):
xml = XML('bar')
- self._test_expression('f:foo', '', xml,
- 'bar',
- namespaces = {'f': 'FOO'})
+ self._test_eval(
+ path = 'f:foo',
+ equiv = '',
+ input = xml,
+ output = 'bar',
+ namespaces = {'f': 'FOO'}
+ )
def test_wildcard_with_namespace(self):
xml = XML('bar')
- self._test_expression('f:*', '', xml,
- 'bar',
- namespaces = {'f': 'FOO'})
+ self._test_eval(
+ path = 'f:*',
+ equiv = '',
+ input = xml,
+ output = 'bar',
+ namespaces = {'f': 'FOO'}
+ )
def test_predicate_termination(self):
"""
@@ -517,54 +560,58 @@
cause an infinite loop. See .
"""
xml = XML('')
- self._test_expression('.[@flag="1"]/*', None, xml,
- 'ab')
+ self._test_eval('.[@flag="1"]/*', input=xml,
+ output='ab')
xml = XML('')
- self._test_expression('.[@flag="0"]/*', None, xml, '')
+ self._test_eval('.[@flag="0"]/*', input=xml, output='')
def test_attrname_with_namespace(self):
xml = XML('')
- self._test_expression('foo[@f:bar]', None, xml,
- '',
- namespaces={'f': 'FOO'})
+ self._test_eval('foo[@f:bar]', input=xml,
+ output='',
+ namespaces={'f': 'FOO'})
def test_attrwildcard_with_namespace(self):
xml = XML('')
- self._test_expression('foo[@f:*]', None, xml,
- '',
- namespaces={'f': 'FOO'})
+ self._test_eval('foo[@f:*]', input=xml,
+ output='',
+ namespaces={'f': 'FOO'})
+
def test_self_and_descendant(self):
xml = XML('')
- self._test_expression('self::root', None, xml, '')
- self._test_expression('self::foo', None, xml, '')
- self._test_expression('descendant::root', None, xml, '')
- self._test_expression('descendant::foo', None, xml, '')
- self._test_expression('descendant-or-self::root', None, xml,
- '')
- self._test_expression('descendant-or-self::foo', None, xml, '')
+ self._test_eval('self::root', input=xml, output='')
+ self._test_eval('self::foo', input=xml, output='')
+ self._test_eval('descendant::root', input=xml, output='')
+ self._test_eval('descendant::foo', input=xml, output='')
+ self._test_eval('descendant-or-self::root', input=xml,
+ output='')
+ self._test_eval('descendant-or-self::foo', input=xml, output='')
def test_long_simple_paths(self):
xml = XML('!'
'')
- self._test_expression('//a/b/a/b/a/c', None, xml, '!')
- self._test_expression('//a/b/a/c', None, xml, '!')
- self._test_expression('//a/c', None, xml, '!')
- self._test_expression('//c', None, xml, '!')
+ self._test_eval('//a/b/a/b/a/c', input=xml, output='!')
+ self._test_eval('//a/b/a/c', input=xml, output='!')
+ self._test_eval('//a/c', input=xml, output='!')
+ self._test_eval('//c', input=xml, output='!')
# Please note that a//b is NOT the same as a/descendant::b
# it is a/descendant-or-self::node()/b, which SimplePathStrategy
# does NOT support
- self._test_expression('a/b/descendant::a/c', None, xml, '!')
- self._test_expression('a/b/descendant::a/d/descendant::a/c',
- None, xml, '!')
- self._test_expression('a/b/descendant::a/d/a/c', None, xml, '')
- self._test_expression('//d/descendant::b/descendant::b/descendant::b'
- '/descendant::c', None, xml, '!')
- self._test_expression('//d/descendant::b/descendant::b/descendant::b'
- '/descendant::b/descendant::c', None, xml, '')
+ self._test_eval('a/b/descendant::a/c', input=xml, output='!')
+ self._test_eval('a/b/descendant::a/d/descendant::a/c',
+ input=xml, output='!')
+ self._test_eval('a/b/descendant::a/d/a/c', input=xml, output='')
+ self._test_eval('//d/descendant::b/descendant::b/descendant::b'
+ '/descendant::c', input=xml, output='!')
+ self._test_eval('//d/descendant::b/descendant::b/descendant::b'
+ '/descendant::b/descendant::c', input=xml,
+ output='')
+
def _test_support(self, strategy_class, text):
path = PathParser(text, None, -1).parse()[0]
return strategy_class.supports(path)
+
def test_simple_strategy_support(self):
self.assert_(self._test_support(SimplePathStrategy, 'a/b'))
self.assert_(self._test_support(SimplePathStrategy, 'self::a/b'))
@@ -582,11 +629,46 @@
self.assert_(not self._test_support(SimplePathStrategy, 'foo:bar'))
self.assert_(not self._test_support(SimplePathStrategy, 'a/@foo:bar'))
+ def _test_strategies(self, input, path, output,
+ namespaces=None, variables=None):
+ for strategy in self.strategies:
+ if not strategy.supports(path):
+ continue
+ s = strategy(path)
+ rendered = FakePath(s).select(input, namespaces=namespaces,
+ variables=variables).render()
+ msg = 'Bad render using %s strategy' % str(strategy)
+ msg += '\nExpected:\t%r' % output
+ msg += '\nRendered:\t%r' % rendered
+ self.assertEqual(output, rendered, msg)
+
+ def _test_eval(self, path, equiv=None, input=None, output='',
+ namespaces=None, variables=None):
+ path = Path(path)
+ if equiv is not None:
+ self.assertEqual(equiv, repr(path))
+
+ if input is None:
+ return
+
+ rendered = path.select(input, namespaces=namespaces,
+ variables=variables).render()
+ msg = 'Bad output using whole path'
+ msg += '\nExpected:\t%r' % output
+ msg += '\nRendered:\t%r' % rendered
+ self.assertEqual(output, rendered, msg)
+
+ if len(path.paths) == 1:
+ self._test_strategies(input, path.paths[0], output,
+ namespaces=namespaces, variables=variables)
+
+
def suite():
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(Path.__module__))
suite.addTest(unittest.makeSuite(PathTestCase, 'test'))
return suite
+
if __name__ == '__main__':
unittest.main(defaultTest='suite')