# -*- coding: utf-8 -*- """ Test cases related to RelaxNG parsing and validation """ from __future__ import absolute_import import unittest from .common_imports import ( etree, BytesIO, _bytes, HelperTestCase, fileInTestDir, make_doctest, skipif ) try: import rnc2rng except ImportError: rnc2rng = None class ETreeRelaxNGTestCase(HelperTestCase): def test_relaxng(self): tree_valid = self.parse('') tree_invalid = self.parse('') schema = self.parse('''\ ''') schema = etree.RelaxNG(schema) self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.error_log.filter_from_errors()) self.assertFalse(schema.validate(tree_invalid)) self.assertTrue(schema.error_log.filter_from_errors()) self.assertTrue(schema.validate(tree_valid)) # repeat valid self.assertFalse(schema.error_log.filter_from_errors()) # repeat valid def test_relaxng_stringio(self): tree_valid = self.parse('') tree_invalid = self.parse('') schema_file = BytesIO('''\ ''') schema = etree.RelaxNG(file=schema_file) self.assertTrue(schema.validate(tree_valid)) self.assertFalse(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.assertFalse(schema.validate(tree_invalid)) errors = schema.error_log self.assertTrue([log for log in errors if log.level_name == "ERROR"]) self.assertTrue([log for log in errors if "not expect" in log.message]) def test_relaxng_generic_error(self): tree_invalid = self.parse('''\ This is my unique ref. Valid data Invalid data ''') schema = self.parse('''\ ''') schema = etree.RelaxNG(schema) self.assertFalse(schema.validate(tree_invalid)) errors = schema.error_log self.assertTrue(errors) self.assertTrue([log for log in errors if "IDREF" in log.message]) self.assertTrue([log for log in errors if "myref" 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.assertTrue(tree_valid.relaxng(schema)) self.assertFalse(tree_invalid.relaxng(schema)) def test_multiple_elementrees(self): tree = self.parse('BC') schema = etree.RelaxNG( self.parse('''\ ''') ) self.assertTrue(schema.validate(tree)) self.assertFalse(schema.error_log.filter_from_errors()) self.assertTrue(schema.validate(tree)) # repeat valid self.assertFalse(schema.error_log.filter_from_errors()) # repeat valid schema = etree.RelaxNG( self.parse('''\ ''') ) c_tree = etree.ElementTree(tree.getroot()[1]) self.assertEqual(self._rootstring(c_tree), _bytes('C')) self.assertFalse(schema.validate(c_tree)) self.assertTrue(schema.error_log.filter_from_errors()) b_tree = etree.ElementTree(tree.getroot()[0]) self.assertEqual(self._rootstring(b_tree), _bytes('B')) self.assertTrue(schema.validate(b_tree)) self.assertFalse(schema.error_log.filter_from_errors()) class RelaxNGCompactTestCase(HelperTestCase): pytestmark = skipif('rnc2rng is None') def test_relaxng_compact(self): tree_valid = self.parse('BC') tree_invalid = self.parse('') schema = etree.RelaxNG(file=fileInTestDir('test.rnc')) self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.validate(tree_invalid)) def test_relaxng_compact_file_obj(self): with open(fileInTestDir('test.rnc'), 'r') as f: schema = etree.RelaxNG(file=f) tree_valid = self.parse('BC') tree_invalid = self.parse('') self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.validate(tree_invalid)) def test_relaxng_compact_str(self): tree_valid = self.parse('B') tree_invalid = self.parse('X') rnc_str = 'element a { element b { "B" } }' schema = etree.RelaxNG.from_rnc_string(rnc_str) self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.validate(tree_invalid)) def test_suite(): suite = unittest.TestSuite() suite.addTests([unittest.makeSuite(ETreeRelaxNGTestCase)]) suite.addTests( [make_doctest('../../../doc/validation.txt')]) if rnc2rng is not None: suite.addTests([unittest.makeSuite(RelaxNGCompactTestCase)]) return suite if __name__ == '__main__': print('to test use test.py %s' % __file__)