#!/usr/bin/env python
#
# this tests the entities substitutions with the XmlTextReader interface
#
import sys
import libxml2
try:
    import StringIO
    str_io = StringIO.StringIO
except:
    import io
    str_io = io.StringIO

schema="""<element name="foo" xmlns="http://relaxng.org/ns/structure/1.0"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <oneOrMore>
    <element name="label">
      <text/>
    </element>
    <optional>
      <element name="opt">
        <empty/>
      </element>
    </optional>
    <element name="item">
      <data type="byte"/>
    </element>
  </oneOrMore>
</element>
"""
# Memory debug specific
libxml2.debugMemory(1)

#
# Parse the Relax NG Schemas
# 
rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
rngs = rngp.relaxNGParse()
del rngp

#
# Parse and validate the correct document
#
docstr="""<foo>
<label>some text</label>
<item>100</item>
</foo>"""

f = str_io(docstr)
input = libxml2.inputBuffer(f)
reader = input.newTextReader("correct")
reader.RelaxNGSetSchema(rngs)
ret = reader.Read()
while ret == 1:
    ret = reader.Read()

if ret != 0:
    print("Error parsing the document")
    sys.exit(1)

if reader.IsValid() != 1:
    print("Document failed to validate")
    sys.exit(1)

#
# Parse and validate the incorrect document
#
docstr="""<foo>
<label>some text</label>
<item>1000</item>
</foo>"""

err=""
# RNG errors are not as good as before , TODO
#expect="""RNG validity error: file error line 3 element text
#Type byte doesn't allow value '1000'
#RNG validity error: file error line 3 element text
#Error validating datatype byte
#RNG validity error: file error line 3 element text
#Element item failed to validate content
#"""
expect="""Type byte doesn't allow value '1000'
Error validating datatype byte
Element item failed to validate content
"""

def callback(ctx, str):
    global err
    err = err + "%s" % (str)
libxml2.registerErrorHandler(callback, "")

f = str_io(docstr)
input = libxml2.inputBuffer(f)
reader = input.newTextReader("error")
reader.RelaxNGSetSchema(rngs)
ret = reader.Read()
while ret == 1:
    ret = reader.Read()

if ret != 0:
    print("Error parsing the document")
    sys.exit(1)

if reader.IsValid() != 0:
    print("Document failed to detect the validation error")
    sys.exit(1)

if err != expect:
    print("Did not get the expected error message:")
    print(err)
    sys.exit(1)

#
# cleanup
#
del f
del input
del reader
del rngs
libxml2.relaxNGCleanupTypes()

# Memory debug specific
libxml2.cleanupParser()
if libxml2.debugMemory(1) == 0:
    print("OK")
else:
    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
    libxml2.dumpMemory()
