comparison markup/tests/path.py @ 106:f9473bdc93b2 trunk

Complete rewrite of the XPath parsing, which was a mess before. Closes #19.
author cmlenz
date Fri, 28 Jul 2006 16:51:35 +0000
parents 59eb24184e9c
children 2368c3becc52
comparison
equal deleted inserted replaced
105:71f3db26eecb 106:f9473bdc93b2
22 22
23 def test_1step(self): 23 def test_1step(self):
24 xml = XML('<root><elem/></root>') 24 xml = XML('<root><elem/></root>')
25 self.assertEqual('<elem/>', Path('elem').select(xml).render()) 25 self.assertEqual('<elem/>', Path('elem').select(xml).render())
26 self.assertEqual('<elem/>', Path('//elem').select(xml).render()) 26 self.assertEqual('<elem/>', Path('//elem').select(xml).render())
27 27
28 def test_1step_self(self):
29 xml = XML('<root><elem/></root>')
30 self.assertEqual('<root><elem/></root>', Path('.').select(xml).render())
31
28 def test_1step_wildcard(self): 32 def test_1step_wildcard(self):
29 xml = XML('<root><elem/></root>') 33 xml = XML('<root><elem/></root>')
30 self.assertEqual('<elem/>', Path('*').select(xml).render()) 34 self.assertEqual('<elem/>', Path('*').select(xml).render())
31 self.assertEqual('<elem/>', Path('//*').select(xml).render()) 35 self.assertEqual('<elem/>', Path('//*').select(xml).render())
32 36
33 def test_1step_attribute(self): 37 def test_1step_attribute(self):
34 path = Path('@foo') 38 path = Path('@foo')
35 self.assertEqual('', path.select(XML('<root/>')).render()) 39 self.assertEqual('', path.select(XML('<root/>')).render())
36 self.assertEqual('bar', path.select(XML('<root foo="bar"/>')).render()) 40 self.assertEqual('bar', path.select(XML('<root foo="bar"/>')).render())
37 41
65 xml = XML('<root><foo><bar/></foo></root>') 69 xml = XML('<root><foo><bar/></foo></root>')
66 self.assertEqual('<bar/>', Path('root/foo/*').select(xml).render()) 70 self.assertEqual('<bar/>', Path('root/foo/*').select(xml).render())
67 71
68 def test_3step_complex(self): 72 def test_3step_complex(self):
69 xml = XML('<root><foo><bar/></foo></root>') 73 xml = XML('<root><foo><bar/></foo></root>')
70 self.assertEqual('<bar/>', Path('root/*/bar').select(xml).render()) 74 self.assertEqual('<bar/>', Path('*/bar').select(xml).render())
71 xml = XML('<root><foo><bar id="1"/></foo><bar id="2"/></root>') 75 xml = XML('<root><foo><bar id="1"/></foo><bar id="2"/></root>')
72 self.assertEqual('<bar id="1"/><bar id="2"/>', 76 self.assertEqual('<bar id="1"/><bar id="2"/>',
73 Path('root//bar').select(xml).render()) 77 Path('//bar').select(xml).render())
78
79 def test_node_type_comment(self):
80 xml = XML('<root><!-- commented --></root>')
81 self.assertEqual('<!-- commented -->',
82 Path('comment()').select(xml).render())
83
84 def test_node_type_text(self):
85 xml = XML('<root>Some text <br/>in here.</root>')
86 self.assertEqual('Some text in here.',
87 Path('text()').select(xml).render())
88
89 def test_node_type_node(self):
90 xml = XML('<root>Some text <br/>in here.</root>')
91 self.assertEqual('<root>Some text <br/>in here.</root>',
92 Path('node()').select(xml).render())
93
94 def test_node_type_processing_instruction(self):
95 xml = XML('<?python x = 2 * 3 ?><root><?php echo("x") ?></root>')
96 self.assertEqual('<?python x = 2 * 3 ?><?php echo("x") ?>',
97 Path('processing-instruction()').select(xml).render())
98 self.assertEqual('<?php echo("x") ?>',
99 Path('processing-instruction("php")').select(xml).render())
100
101 def test_simple_union(self):
102 xml = XML('<root>Oh <foo>my</foo></root>')
103 self.assertEqual('Oh <foo>my</foo>',
104 Path('*|text()').select(xml).render())
74 105
75 def test_predicate_attr(self): 106 def test_predicate_attr(self):
76 xml = XML('<root><item/><item important="very"/></root>') 107 xml = XML('<root><item/><item important="very"/></root>')
77 self.assertEqual('<item important="very"/>', 108 self.assertEqual('<item important="very"/>',
78 Path('root/item[@important]').select(xml).render()) 109 Path('root/item[@important]').select(xml).render())
79 self.assertEqual('<item important="very"/>', 110 self.assertEqual('<item important="very"/>',
80 Path('root/item[@important="very"]').select(xml).render()) 111 Path('root/item[@important="very"]').select(xml).render())
81 112
113 def test_predicate_attr_equality(self):
82 xml = XML('<root><item/><item important="notso"/></root>') 114 xml = XML('<root><item/><item important="notso"/></root>')
83 self.assertEqual('', 115 self.assertEqual('',
84 Path('root/item[@important="very"]').select(xml).render()) 116 Path('root/item[@important="very"]').select(xml).render())
85 self.assertEqual('<item/><item important="notso"/>', 117 self.assertEqual('<item/><item important="notso"/>',
86 Path('root/item[@important!="very"]').select(xml).render()) 118 Path('root/item[@important!="very"]').select(xml).render())
87 119
120 def test_predicate_attr_and(self):
121 xml = XML('<root><item/><item important="very"/></root>')
122 path = Path('root/item[@important and @important="very"]')
123 self.assertEqual('<item important="very"/>', path.select(xml).render())
124 path = Path('root/item[@important and @important="notso"]')
125 self.assertEqual('', path.select(xml).render())
126
127 def test_predicate_attr_or(self):
128 xml = XML('<root><item/><item important="very"/></root>')
129 path = Path('root/item[@urgent or @important]')
130 self.assertEqual('<item important="very"/>', path.select(xml).render())
131 path = Path('root/item[@urgent or @notso]')
132 self.assertEqual('', path.select(xml).render())
133
88 134
89 def suite(): 135 def suite():
90 suite = unittest.TestSuite() 136 suite = unittest.TestSuite()
91 suite.addTest(doctest.DocTestSuite(Path.__module__)) 137 #suite.addTest(doctest.DocTestSuite(Path.__module__))
92 suite.addTest(unittest.makeSuite(PathTestCase, 'test')) 138 suite.addTest(unittest.makeSuite(PathTestCase, 'test'))
93 return suite 139 return suite
94 140
95 if __name__ == '__main__': 141 if __name__ == '__main__':
96 unittest.main(defaultTest='suite') 142 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software