1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
# -*- coding: utf-8 -*-
import logging
if __name__ == '__main__':
logging.basicConfig()
_log = logging.getLogger(__name__)
import pyxb.binding.generate
import pyxb.utils.domutils
from xml.dom import Node
import os.path
schema_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../schemas/test-mg-sequence.xsd'))
code = pyxb.binding.generate.GeneratePython(schema_location=schema_path)
rv = compile(code, 'test', 'exec')
eval(rv)
from pyxb.exceptions_ import *
from pyxb.utils import domutils
def ToDOM (instance, tag=None):
return instance.toDOM().documentElement
import unittest
import collections
class TestMGSeq (unittest.TestCase):
def setUp (self):
# Hide the warning about failure to convert DOM node {}third
# to a binding
self.__basis_log = logging.getLogger('pyxb.binding.basis')
self.__basis_loglevel = self.__basis_log.level
def tearDown (self):
self.__basis_log.level = self.__basis_loglevel
def testBad (self):
# Second is wrong element tag
# Hide warning about failure to convert
self.__basis_log.level = logging.ERROR
xml = '<ns1:wrapper xmlns:ns1="URN:test-mg-sequence"><first/><second/><third/><fourth_0_2/></ns1:wrapper>'
dom = pyxb.utils.domutils.StringToDOM(xml)
self.assertRaises(UnrecognizedContentError, wrapper.createFromDOM, dom.documentElement)
def testBasics (self):
xmlt = u'<ns1:wrapper xmlns:ns1="URN:test-mg-sequence"><first/><second_opt/><third/><fourth_0_2/></ns1:wrapper>'
xmld = xmlt.encode('utf-8')
dom = pyxb.utils.domutils.StringToDOM(xmlt)
instance = wrapper.createFromDOM(dom.documentElement)
self.assertTrue(isinstance(instance.first, sequence._ElementMap['first'].elementBinding().typeDefinition()))
self.assertTrue(isinstance(instance.second_opt, sequence._ElementMap['second_opt'].elementBinding().typeDefinition()))
self.assertTrue(isinstance(instance.third, sequence._ElementMap['third'].elementBinding().typeDefinition()))
self.assertTrue(isinstance(instance.fourth_0_2, collections.MutableSequence))
self.assertEqual(1, len(instance.fourth_0_2))
self.assertTrue(isinstance(instance.fourth_0_2[0], sequence._ElementMap['fourth_0_2'].elementBinding().typeDefinition()))
self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
def testMultiplesAtEnd (self):
xmlt = u'<ns1:wrapper xmlns:ns1="URN:test-mg-sequence"><first/><third/><fourth_0_2/><fourth_0_2/></ns1:wrapper>'
xmld = xmlt.encode('utf-8')
dom = pyxb.utils.domutils.StringToDOM(xmlt)
instance = wrapper.createFromDOM(dom.documentElement)
self.assertTrue(isinstance(instance.first, sequence._ElementMap['first'].elementBinding().typeDefinition()))
self.assertTrue(instance.second_opt is None)
self.assertTrue(isinstance(instance.third, sequence._ElementMap['third'].elementBinding().typeDefinition()))
self.assertTrue(isinstance(instance.fourth_0_2, collections.MutableSequence))
self.assertEqual(2, len(instance.fourth_0_2))
self.assertTrue(isinstance(instance.fourth_0_2[0], sequence._ElementMap['fourth_0_2'].elementBinding().typeDefinition()))
self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
def testMultiplesInMiddle (self):
xmlt = u'<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"><first/><second_multi/><second_multi/><third/></ns1:altwrapper>'
xmld = xmlt.encode('utf-8')
dom = pyxb.utils.domutils.StringToDOM(xmlt)
instance = altwrapper.createFromDOM(dom.documentElement)
self.assertTrue(isinstance(instance.first, collections.MutableSequence))
self.assertEqual(1, len(instance.first))
self.assertEqual(2, len(instance.second_multi))
self.assertTrue(isinstance(instance.third, altsequence._ElementMap['third'].elementBinding().typeDefinition()))
self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
def testMultiplesAtStart (self):
xmlt = u'<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"><first/><first/><third/></ns1:altwrapper>'
xmld = xmlt.encode('utf-8')
dom = pyxb.utils.domutils.StringToDOM(xmlt)
instance = altwrapper.createFromDOM(dom.documentElement)
self.assertTrue(isinstance(instance.first, collections.MutableSequence))
self.assertEqual(2, len(instance.first))
self.assertEqual(0, len(instance.second_multi))
self.assertTrue(isinstance(instance.third, altsequence._ElementMap['third'].elementBinding().typeDefinition()))
self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
instance = altwrapper(first=[ altsequence._ElementMap['first'].elementBinding()(), altsequence._ElementMap['first'].elementBinding()() ], third=altsequence._ElementMap['third'].elementBinding()())
self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
def testMissingInMiddle (self):
xmlt = u'<ns1:wrapper xmlns:ns1="URN:test-mg-sequence"><first/><third/></ns1:wrapper>'
xmld = xmlt.encode('utf-8')
dom = pyxb.utils.domutils.StringToDOM(xmlt)
instance = wrapper.createFromDOM(dom.documentElement)
self.assertTrue(isinstance(instance.first, sequence._ElementMap['first'].elementBinding().typeDefinition()))
self.assertTrue(instance.second_opt is None)
self.assertTrue(isinstance(instance.third, sequence._ElementMap['third'].elementBinding().typeDefinition()))
self.assertTrue(isinstance(instance.fourth_0_2, collections.MutableSequence))
self.assertEqual(0, len(instance.fourth_0_2))
self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
def testMissingAtStart (self):
xmlt = u'<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"><third/></ns1:altwrapper>'
dom = pyxb.utils.domutils.StringToDOM(xmlt)
self.assertRaises(UnrecognizedContentError, altwrapper.createFromDOM, dom.documentElement)
instance = altwrapper(third=altsequence._ElementMap['third'].elementBinding()())
self.assertRaises(pyxb.IncompleteElementContentError, ToDOM, instance)
def testMissingAtEndLeadingContent (self):
xmlt = u'<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"><first/></ns1:altwrapper>'
dom = pyxb.utils.domutils.StringToDOM(xmlt)
self.assertRaises(IncompleteElementContentError, altwrapper.createFromDOM, dom.documentElement)
def testMissingAtEndNoContent (self):
xmlt = u'<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"></ns1:altwrapper>'
dom = pyxb.utils.domutils.StringToDOM(xmlt)
self.assertRaises(IncompleteElementContentError, altwrapper.createFromDOM, dom.documentElement)
def testTooManyAtEnd (self):
xmlt = u'<ns1:wrapper xmlns:ns1="URN:test-mg-sequence"><first/><third/><fourth_0_2/><fourth_0_2/><fourth_0_2/></ns1:wrapper>'
dom = pyxb.utils.domutils.StringToDOM(xmlt)
self.assertRaises(UnrecognizedContentError, wrapper.createFromDOM, dom.documentElement)
def testTooManyAtStart (self):
xmlt = u'<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"><first/><first/><first/><third/></ns1:altwrapper>'
dom = pyxb.utils.domutils.StringToDOM(xmlt)
self.assertRaises(UnrecognizedContentError, altwrapper.createFromDOM, dom.documentElement)
instance = altwrapper(first=[ altsequence._ElementMap['first'].elementBinding()(), altsequence._ElementMap['first'].elementBinding()(), altsequence._ElementMap['first'].elementBinding()() ], third=altsequence._ElementMap['third'].elementBinding()())
self.assertRaises(pyxb.UnprocessedElementContentError, ToDOM, instance)
if sys.version_info[:2] >= (2, 7):
with self.assertRaises(UnprocessedElementContentError) as cm:
instance.toxml('utf-8')
# Verify the exception tells us what was being processed
self.assertEqual(instance, cm.exception.instance)
# Verify the exception tells us what was left over
first_ed = altsequence._ElementMap['first']
self.assertEqual(instance.first[2], cm.exception.symbol_set[first_ed][0])
def testTooManyInMiddle (self):
xml = '<ns1:altwrapper xmlns:ns1="URN:test-mg-sequence"><second_multi/><second_multi/><second_multi/><third/></ns1:altwrapper>'
dom = pyxb.utils.domutils.StringToDOM(xml)
self.assertRaises(UnrecognizedContentError, altwrapper.createFromDOM, dom.documentElement)
if __name__ == '__main__':
unittest.main()
|