1   
  2   
  3  """ 
  4  Test cases related to RelaxNG parsing and validation 
  5  """ 
  6   
  7  import unittest, sys, os.path 
  8   
  9  this_dir = os.path.dirname(__file__) 
 10  if this_dir not in sys.path: 
 11      sys.path.insert(0, this_dir)  
 12   
 13  from common_imports import etree, BytesIO, _bytes, HelperTestCase, fileInTestDir 
 14  from common_imports import doctest, make_doctest, skipif 
 15   
 16  try: 
 17      import rnc2rng 
 18  except ImportError: 
 19      rnc2rng = None 
 20   
 21   
 44   
 46          tree_valid = self.parse('<a><b></b></a>') 
 47          tree_invalid = self.parse('<a><c></c></a>') 
 48          schema_file = BytesIO('''\ 
 49  <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> 
 50    <zeroOrMore> 
 51       <element name="b"> 
 52         <text /> 
 53       </element> 
 54    </zeroOrMore> 
 55  </element> 
 56  ''') 
 57          schema = etree.RelaxNG(file=schema_file) 
 58          self.assertTrue(schema.validate(tree_valid)) 
 59          self.assertFalse(schema.validate(tree_invalid)) 
  60   
 63   
 65          tree_invalid = self.parse('<a><c></c></a>') 
 66          schema = self.parse('''\ 
 67  <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> 
 68    <zeroOrMore> 
 69       <element name="b"> 
 70         <text /> 
 71       </element> 
 72    </zeroOrMore> 
 73  </element> 
 74  ''') 
 75          schema = etree.RelaxNG(schema) 
 76          self.assertFalse(schema.validate(tree_invalid)) 
 77          errors = schema.error_log 
 78          self.assertTrue([log for log in errors 
 79                           if log.level_name == "ERROR"]) 
 80          self.assertTrue([log for log in errors 
 81                           if "not expect" in log.message]) 
  82   
 84          tree_invalid = self.parse('''\ 
 85          <test> 
 86            <reference id="my-ref">This is my unique ref.</reference> 
 87            <data ref="my-ref">Valid data</data> 
 88            <data ref="myref">Invalid data</data> 
 89          </test> 
 90          ''') 
 91          schema = self.parse('''\ 
 92          <grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" 
 93                   xmlns="http://relaxng.org/ns/structure/1.0"> 
 94            <define name="by-ref"> 
 95              <data type="IDREF"/> 
 96            </define> 
 97            <start> 
 98              <element name="test"> 
 99                <zeroOrMore> 
100                  <element name="reference"> 
101                    <attribute name="id"> 
102                      <data type="ID"/> 
103                    </attribute> 
104                    <text/> 
105                  </element> 
106                </zeroOrMore> 
107                <zeroOrMore> 
108                  <element name="data"> 
109                    <attribute name="ref"> 
110                      <data type="IDREF"/> 
111                    </attribute> 
112                    <text/> 
113                  </element> 
114                </zeroOrMore> 
115              </element> 
116            </start> 
117          </grammar> 
118          ''') 
119   
120          schema = etree.RelaxNG(schema) 
121          self.assertFalse(schema.validate(tree_invalid)) 
122          errors = schema.error_log 
123          self.assertTrue(errors) 
124          self.assertTrue([log for log in errors if "IDREF" in log.message]) 
125          self.assertTrue([log for log in errors if "myref" in log.message]) 
 126   
128          schema = self.parse('''\ 
129  <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> 
130    <zeroOrMore> 
131       <element name="b" /> 
132    </zeroOrMore> 
133  </element> 
134  ''') 
135          self.assertRaises(etree.RelaxNGParseError, 
136                            etree.RelaxNG, schema) 
 137   
144   
146          schema = self.parse('''\ 
147  <grammar xmlns="http://relaxng.org/ns/structure/1.0"> 
148    <define name="test"> 
149      <element name="test"/> 
150    </define> 
151  </grammar> 
152  ''') 
153          self.assertRaises(etree.RelaxNGParseError, 
154                            etree.RelaxNG, schema) 
 155   
163   
172   
174          tree_valid = self.parse('<a><b></b></a>') 
175          tree_invalid = self.parse('<a><c></c></a>') 
176          schema = self.parse('''\ 
177  <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> 
178    <zeroOrMore> 
179       <element name="b"> 
180         <text /> 
181       </element> 
182    </zeroOrMore> 
183  </element> 
184  ''') 
185          self.assertTrue(tree_valid.relaxng(schema)) 
186          self.assertFalse(tree_invalid.relaxng(schema)) 
 187   
 220   
244   
245   
254   
255  if __name__ == '__main__': 
256      print('to test use test.py %s' % __file__) 
257