Package lxml :: Package tests :: Module test_io
[hide private]
[frames] | no frames]

Source Code for Module lxml.tests.test_io

  1  # -*- coding: utf-8 -*- 
  2   
  3  """ 
  4  IO test cases that apply to both etree and ElementTree 
  5  """ 
  6   
  7  import unittest 
  8  import tempfile, gzip, os 
  9   
 10  from common_imports import etree, ElementTree, fileInTestDir 
 11  from common_imports import SillyFileLike, LargeFileLike 
 12   
13 -class IOTestCaseBase(unittest.TestCase):
14 """(c)ElementTree compatibility for IO functions/methods 15 """ 16 etree = None 17
18 - def setUp(self):
19 """Setting up a minimal tree 20 """ 21 self.root = self.etree.Element('a') 22 self.root_str = self.etree.tostring(self.root) 23 self.tree = self.etree.ElementTree(self.root)
24
25 - def test_write_filename(self):
26 # (c)ElementTree supports filename strings as write argument 27 28 handle, filename = tempfile.mkstemp(suffix=".xml") 29 self.tree.write(filename) 30 try: 31 self.assertEqual(open(filename).read(), self.root_str) 32 finally: 33 os.close(handle) 34 os.remove(filename)
35
37 # (c)ElementTree supports gzip instance as parse argument 38 handle, filename = tempfile.mkstemp(suffix=".xml.gz") 39 f = gzip.open(filename, 'wb') 40 f.write(self.root_str) 41 f.close() 42 try: 43 f_gz = gzip.open(filename, 'r') 44 tree = self.etree.parse(f_gz) 45 f_gz.close() 46 self.assertEqual(self.etree.tostring(tree.getroot()), self.root_str) 47 finally: 48 os.close(handle) 49 os.remove(filename)
50
52 # (c)ElementTree class ElementTree has a 'parse' method that returns 53 # the root of the tree 54 55 # parse from filename 56 57 handle, filename = tempfile.mkstemp(suffix=".xml") 58 open(filename, 'wb').write(self.root_str) 59 try: 60 tree = self.etree.ElementTree() 61 root = tree.parse(filename) 62 self.assertEqual(self.etree.tostring(root), self.root_str) 63 finally: 64 os.close(handle) 65 os.remove(filename)
66
68 handle, filename = tempfile.mkstemp(suffix=".xml") 69 open(filename, 'wb').write(self.root_str) 70 try: 71 tree = self.etree.ElementTree() 72 root = tree.parse(filename) 73 # and now do it again; previous content should still be there 74 root2 = tree.parse(filename) 75 self.assertEquals('a', root.tag) 76 self.assertEquals('a', root2.tag) 77 # now remove all references to root2, and parse again 78 del root2 79 root3 = tree.parse(filename) 80 self.assertEquals('a', root.tag) 81 self.assertEquals('a', root3.tag) 82 # root2's memory should've been freed here 83 # XXX how to check? 84 finally: 85 os.close(handle) 86 os.remove(filename)
87
89 # (c)ElementTree class ElementTree has a 'parse' method that returns 90 # the root of the tree 91 92 # parse from file object 93 94 handle, filename = tempfile.mkstemp(suffix=".xml") 95 os.write(handle, self.root_str) 96 try: 97 f = open(filename, 'r') 98 tree = self.etree.ElementTree() 99 root = tree.parse(f) 100 f.close() 101 self.assertEqual(self.etree.tostring(root), self.root_str) 102 finally: 103 os.close(handle) 104 os.remove(filename)
105
107 # (c)ElementTree class ElementTree has a 'parse' method that returns 108 # the root of the tree 109 110 # parse from unamed file object 111 f = SillyFileLike() 112 root = self.etree.ElementTree().parse(f) 113 self.assert_(root.tag.endswith('foo'))
114
116 # parse from unamed file object 117 f = LargeFileLike() 118 tree = self.etree.parse(f) 119 root = tree.getroot() 120 self.assert_(root.tag.endswith('root'))
121
123 class LocalError(Exception): 124 pass
125 class TestFile: 126 def read(*args): 127 raise LocalError
128 f = TestFile() 129 self.assertRaises(LocalError, self.etree.parse, f) 130
131 - def test_module_parse_fileobject_late_error(self):
132 class LocalError(Exception): 133 pass
134 class TestFile: 135 data = '<root>test</' 136 next_char = iter(data).next 137 counter = 0 138 def read(self, amount=None): 139 if amount is None: 140 while True: 141 self.read(1) 142 else: 143 try: 144 self.counter += 1 145 return self.next_char() 146 except StopIteration: 147 raise LocalError 148 f = TestFile() 149 self.assertRaises(LocalError, self.etree.parse, f) 150 self.assertEquals(f.counter, len(f.data)+1) 151
152 - def test_module_parse_fileobject_type_error(self):
153 class TestFile: 154 def read(*args): 155 return 1
156 f = TestFile() 157 self.assertRaises(TypeError, self.etree.parse, f) 158 159
160 -class ETreeIOTestCase(IOTestCaseBase):
161 etree = etree
162 163 if ElementTree:
164 - class ElementTreeIOTestCase(IOTestCaseBase):
165 etree = ElementTree
166
167 -def test_suite():
168 suite = unittest.TestSuite() 169 suite.addTests([unittest.makeSuite(ETreeIOTestCase)]) 170 if ElementTree: 171 suite.addTests([unittest.makeSuite(ElementTreeIOTestCase)]) 172 return suite
173 174 if __name__ == '__main__': 175 unittest.main() 176