# -*- coding: utf-8 -*- """ Test cases related to RelaxNG parsing and validation """ import unittest, sys, os.path this_dir = os.path.dirname(__file__) if this_dir not in sys.path: sys.path.insert(0, this_dir) # needed for Py3 from common_imports import etree, BytesIO, _bytes, HelperTestCase, fileInTestDir from common_imports import doctest, make_doctest class ETreeRelaxNGTestCase(HelperTestCase): def test_relaxng(self): tree_valid = self.parse('') tree_invalid = self.parse('') schema = self.parse('''\ ''') schema = etree.RelaxNG(schema) self.assert_(schema.validate(tree_valid)) self.assert_(not schema.validate(tree_invalid)) def test_relaxng_stringio(self): tree_valid = self.parse('') tree_invalid = self.parse('') schema_file = BytesIO('''\ ''') schema = etree.RelaxNG(file=schema_file) self.assert_(schema.validate(tree_valid)) self.assert_(not schema.validate(tree_invalid)) def test_relaxng_elementtree_error(self): self.assertRaises(ValueError, etree.RelaxNG, etree.ElementTree()) def test_relaxng_error(self): tree_invalid = self.parse('') schema = self.parse('''\ ''') schema = etree.RelaxNG(schema) self.assert_(not schema.validate(tree_invalid)) errors = schema.error_log self.assert_([ log for log in errors if log.level_name == "ERROR" ]) self.assert_([ log for log in errors if "not expect" in log.message ]) def test_relaxng_invalid_schema(self): schema = self.parse('''\ ''') self.assertRaises(etree.RelaxNGParseError, etree.RelaxNG, schema) def test_relaxng_invalid_schema2(self): schema = self.parse('''\ ''') self.assertRaises(etree.RelaxNGParseError, etree.RelaxNG, schema) def test_relaxng_invalid_schema3(self): schema = self.parse('''\ ''') self.assertRaises(etree.RelaxNGParseError, etree.RelaxNG, schema) def test_relaxng_invalid_schema4(self): # segfault schema = self.parse('''\ ''') self.assertRaises(etree.RelaxNGParseError, etree.RelaxNG, schema) def test_relaxng_include(self): # this will only work if we access the file through path or # file object.. f = open(fileInTestDir('test1.rng'), 'rb') try: schema = etree.RelaxNG(file=f) finally: f.close() def test_relaxng_shortcut(self): tree_valid = self.parse('') tree_invalid = self.parse('') schema = self.parse('''\ ''') self.assert_(tree_valid.relaxng(schema)) self.assert_(not tree_invalid.relaxng(schema)) def test_multiple_elementrees(self): tree = self.parse('BC') schema = etree.RelaxNG( self.parse('''\ ''') ) self.assert_(schema.validate(tree)) self.assert_(schema.validate(tree)) schema = etree.RelaxNG( self.parse('''\ ''') ) c_tree = etree.ElementTree(tree.getroot()[1]) self.assertEqual(self._rootstring(c_tree), _bytes('C')) self.assert_(not schema.validate(c_tree)) b_tree = etree.ElementTree(tree.getroot()[0]) self.assertEqual(self._rootstring(b_tree), _bytes('B')) self.assert_(schema.validate(b_tree)) def test_suite(): suite = unittest.TestSuite() suite.addTests([unittest.makeSuite(ETreeRelaxNGTestCase)]) suite.addTests( [make_doctest('../../../doc/validation.txt')]) return suite if __name__ == '__main__': print('to test use test.py %s' % __file__)