1# Coding declaration for unicode strings
2# -*- coding: utf-8 -*-
3from __future__ import unicode_literals
4import logging
5if __name__ == '__main__':
6    logging.basicConfig()
7_log = logging.getLogger(__name__)
8# See also:
9# http://www.evanjones.ca/python-utf8.html
10# http://bytes.com/topic/python/answers/41153-xml-unicode-what-am-i-doing-wrong
11
12import pyxb.binding.generate
13import pyxb.binding.datatypes as xs
14import pyxb.binding.basis
15import pyxb.utils.domutils
16import xml.sax
17import io
18
19import os.path
20xsd='''<?xml version="1.0" encoding="UTF-8"?>
21<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
22    <xs:element name="foo" type="xs:string"/>
23    <xs:element name="bar">
24        <xs:complexType>
25            <xs:sequence>
26                <xs:element name="e" type="xs:string" minOccurs="0"/>
27            </xs:sequence>
28            <xs:attribute name="a" type="xs:string"/>
29        </xs:complexType>
30    </xs:element>
31</xs:schema>'''
32
33code = pyxb.binding.generate.GeneratePython(schema_text=xsd)
34#open('code.py', 'w').write(code)
35
36rv = compile(code, 'test', 'exec')
37eval(rv)
38
39from pyxb.exceptions_ import *
40
41import unittest
42
43class TestTrac0131 (unittest.TestCase):
44    # Unicode string, UTF-8 encoding (per declaration at script top)
45    strt = 'Sign of Leser-Trélat'
46    strd = strt.encode('utf-8')
47    base_xmlt = '<bar><e>' + strt + '</e></bar>'
48    declared_xmlt = '<?xml version="1.0" encoding="UTF-8"?>' + base_xmlt
49
50    def setUp (self):
51        self.__xmlStyle = pyxb._XMLStyle
52
53    def tearDown (self):
54        pyxb._SetXMLStyle(self.__xmlStyle)
55
56    def testRepresentation (self):
57        self.assertEqual(self.strd, b'Sign of Leser-Tr\xc3\xa9lat')
58
59    def testBasicParse (self):
60        xmlt = self.base_xmlt
61        xmld = xmlt.encode('utf-8')
62        self.assertTrue(isinstance(xmlt, six.text_type))
63        self.assertTrue(isinstance(xmld, six.binary_type))
64        pyxb._SetXMLStyle(pyxb.XMLStyle_saxer)
65        instance = CreateFromDocument(xmlt)
66        self.assertEqual(instance.e, self.strt)
67        instance = CreateFromDocument(xmld)
68        self.assertEqual(instance.e, self.strt)
69        pyxb._SetXMLStyle(pyxb.XMLStyle_minidom)
70        instance = CreateFromDocument(xmlt)
71        self.assertEqual(instance.e, self.strt)
72        instance = CreateFromDocument(xmld)
73        self.assertEqual(instance.e, self.strt)
74        # saxdom can handle Unicode representation
75        pyxb._SetXMLStyle(pyxb.XMLStyle_saxdom)
76        instance = CreateFromDocument(xmlt)
77        self.assertEqual(instance.e, self.strt)
78        instance = CreateFromDocument(xmld)
79        self.assertEqual(instance.e, self.strt)
80
81    def testDeclaredParse (self):
82        xmlt = self.declared_xmlt
83        xmld = xmlt.encode('utf-8')
84        self.assertTrue(isinstance(xmlt, six.text_type))
85        self.assertTrue(isinstance(xmld, six.binary_type))
86        pyxb._SetXMLStyle(pyxb.XMLStyle_saxer)
87        instance = CreateFromDocument(xmlt)
88        self.assertEqual(instance.e, self.strt)
89        instance = CreateFromDocument(xmld)
90        self.assertEqual(instance.e, self.strt)
91        pyxb._SetXMLStyle(pyxb.XMLStyle_minidom)
92        instance = CreateFromDocument(xmlt)
93        self.assertEqual(instance.e, self.strt)
94        instance = CreateFromDocument(xmld)
95        self.assertEqual(instance.e, self.strt)
96        # saxdom can handle Unicode representation
97        pyxb._SetXMLStyle(pyxb.XMLStyle_saxdom)
98        instance = CreateFromDocument(xmlt)
99        self.assertEqual(instance.e, self.strt)
100        instance = CreateFromDocument(xmld)
101        self.assertEqual(instance.e, self.strt)
102
103    def testElementEncode (self):
104        instance = bar()
105        instance.e = self.strt
106        self.assertEqual(instance.e, self.strt)
107
108    def testAttributeEncode (self):
109        instance = bar()
110        instance.a = self.strt
111        self.assertEqual(instance.a, self.strt)
112
113    def testuEncode (self):
114        instance = foo(self.strt)
115        self.assertEqual(instance, self.strt)
116
117if __name__ == '__main__':
118    unittest.main()
119