root/livinglogic.python.xist/test/test_publish.py @ 2627:189275058071

Revision 2627:189275058071, 7.8 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Update the publishing tests for the new namespace handling.

  • Property exe set to *
Line 
1#! /usr/bin/env/python
2# -*- coding: iso-8859-1 -*-
3
4## Copyright 1999-2007 by LivingLogic AG, Bayreuth/Germany.
5## Copyright 1999-2007 by Walter Dörwald
6##
7## All Rights Reserved
8##
9## See xist/__init__.py for the license
10
11
12import sys, re
13
14from ll.xist import xsc, helpers, parsers
15from ll.xist.ns import html, xml, php, abbr, xlink, specials
16
17
18# The following includes \x00 in addition to those characters defined in
19# http://www.w3.org/TR/2004/REC-xml11-20040204/#NT-RestrictedChar
20restrictedchars = re.compile(u"[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\x84\x86-\x9F]")
21
22
23def test_publishelement():
24    node = html.html()
25
26    assert node.asBytes(prefixdefault=False) == """<html></html>"""
27    assert node.asBytes(prefixdefault=None) == """<html xmlns="http://www.w3.org/1999/xhtml"></html>"""
28    assert node.asBytes(prefixdefault="h") == """<h:html xmlns:h="http://www.w3.org/1999/xhtml"></h:html>"""
29    assert node.asBytes(prefixdefault=True) == """<ns:html xmlns:ns="http://www.w3.org/1999/xhtml"></ns:html>"""
30    assert node.asBytes(prefixes={html: False}) == """<html></html>"""
31    assert node.asBytes(prefixes={html: None}) == """<html xmlns="http://www.w3.org/1999/xhtml"></html>"""
32    assert node.asBytes(prefixes={html: "h"}) == """<h:html xmlns:h="http://www.w3.org/1999/xhtml"></h:html>"""
33    assert node.asBytes(prefixes={html: True}) == """<ns:html xmlns:ns="http://www.w3.org/1999/xhtml"></ns:html>"""
34    assert node.asBytes(prefixdefault="h", hidexmlns=[html]) == """<h:html></h:html>"""
35
36
37def test_publishentity():
38    node = abbr.xml()
39
40    assert node.asBytes(prefixdefault=False) == """&xml;"""
41    assert node.asBytes(prefixdefault=None) == """&xml;"""
42    assert node.asBytes(prefixdefault="x") == """&xml;"""
43    assert node.asBytes(prefixdefault=True) == """&xml;"""
44    assert node.asBytes(prefixes={abbr: False}) == """&xml;"""
45    assert node.asBytes(prefixes={abbr: None}) == """&xml;"""
46    assert node.asBytes(prefixes={abbr: "x"}) == """&xml;"""
47    assert node.asBytes(prefixes={abbr: True}) == """&xml;"""
48
49
50def test_publishprocinst():
51    node = php.php("x")
52
53    assert node.asBytes(prefixdefault=False) == """<?php x?>"""
54    assert node.asBytes(prefixdefault=None) == """<?php x?>"""
55    assert node.asBytes(prefixdefault="p") == """<?php x?>"""
56    assert node.asBytes(prefixdefault=True) == """<?php x?>"""
57    assert node.asBytes(prefixes={php: False}) == """<?php x?>"""
58    assert node.asBytes(prefixes={php: None}) == """<?php x?>"""
59    assert node.asBytes(prefixes={php: "p"}) == """<?php x?>"""
60    assert node.asBytes(prefixes={php: True}) == """<?php x?>"""
61
62
63def test_publishboolattr():
64    node = html.td("?", nowrap=None)
65    assert node.asBytes(xhtml=0) == """<td>?</td>"""
66
67    node = html.td("?", nowrap=True)
68    assert node.asBytes(xhtml=0) == """<td nowrap>?</td>"""
69    assert node.asBytes(xhtml=1) == """<td nowrap="nowrap">?</td>"""
70    assert node.asBytes(xhtml=2) == """<td nowrap="nowrap">?</td>"""
71
72    class foo(xsc.Element):
73        class Attrs(xsc.Element.Attrs):
74            class bar(xsc.BoolAttr):
75                xmlname = "baz"
76
77    # Check that the XML name is used as the value
78    assert foo("?", bar=True).asBytes(xhtml=2) == """<foo baz="baz">?</foo>"""
79
80
81def test_publishurlattr():
82    node = html.link(href=None)
83    assert node.asBytes(xhtml=1) == """<link />"""
84
85    node = html.link(href="root:gurk.html")
86    assert node.asBytes(xhtml=1) == """<link href="root:gurk.html" />"""
87    assert node.asBytes(xhtml=1, base="root:gurk.html") == """<link href="" />"""
88    assert node.asBytes(xhtml=1, base="root:hurz.html") == """<link href="gurk.html" />"""
89
90
91def test_publishstyleattr():
92    node = html.div(style=None)
93    assert node.asBytes(xhtml=1) == """<div></div>"""
94
95    node = html.div(style="background-image: url(root:gurk.html)")
96    assert node.asBytes(xhtml=1) == """<div style="background-image: url(root:gurk.html)"></div>"""
97    assert node.asBytes(xhtml=1, base="root:gurk.html") == """<div style="background-image: url()"></div>"""
98    assert node.asBytes(xhtml=1, base="root:hurz.html") == """<div style="background-image: url(gurk.html)"></div>"""
99
100
101def test_publishxmlattr():
102    node = html.html(xml.Attrs(space="preserve"))
103    assert node.asBytes(prefixdefault=False) == """<html xml:space="preserve"></html>"""
104    assert node.asBytes(prefixdefault=True) == """<ns:html xmlns:ns="http://www.w3.org/1999/xhtml" xml:space="preserve"></ns:html>"""
105    assert node.asBytes(prefixdefault=None) == """<html xmlns="http://www.w3.org/1999/xhtml" xml:space="preserve"></html>"""
106    assert node.asBytes(prefixes={html: "h"}) == """<h:html xmlns:h="http://www.w3.org/1999/xhtml" xml:space="preserve"></h:html>"""
107    # Prefix for XML namespace can't be overwritten
108    assert node.asBytes(prefixes={html: "h", xml: "spam"}) == """<h:html xmlns:h="http://www.w3.org/1999/xhtml" xml:space="preserve"></h:html>"""
109
110
111def test_publishglobalattr():
112    # FIXME: Some of those tests depend on dict iteration order
113    node = html.html(xlink.Attrs(title="the foo bar"))
114    assert node.asBytes(prefixdefault=False) == """<html xmlns:ns="http://www.w3.org/1999/xlink" ns:title="the foo bar"></html>"""
115    assert node.asBytes(prefixdefault=None) == """<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ns="http://www.w3.org/1999/xlink" ns:title="the foo bar"></html>"""
116    assert node.asBytes(prefixdefault=True) == """<ns:html xmlns:ns="http://www.w3.org/1999/xhtml" xmlns:ns2="http://www.w3.org/1999/xlink" ns2:title="the foo bar"></ns:html>"""
117    assert node.asBytes(prefixdefault="h") == """<h:html xmlns:h="http://www.w3.org/1999/xhtml" xmlns:ns="http://www.w3.org/1999/xlink" ns:title="the foo bar"></h:html>"""
118    assert node.asBytes(prefixes={html: "h", xlink: "xl"}) == """<h:html xmlns:h="http://www.w3.org/1999/xhtml" xmlns:xl="http://www.w3.org/1999/xlink" xl:title="the foo bar"></h:html>"""
119
120
121def test_publishempty():
122    node = xsc.Frag(html.br(), html.div())
123    assert node.asBytes(xhtml=0) == """<br><div></div>"""
124    assert node.asBytes(xhtml=1) == """<br /><div></div>"""
125    assert node.asBytes(xhtml=2) == """<br/><div/>"""
126
127
128def test_publishescaped():
129    s = u"""<&'"\xff>"""
130    node = xsc.Text(s)
131    assert node.asBytes(encoding="ascii") == """&lt;&amp;'"&#255;&gt;"""
132    node = html.span(class_=s)
133    assert node.asBytes(encoding="ascii", xhtml=2) == """<span class="&lt;&amp;'&quot;&#255;&gt;"/>"""
134
135
136escape_input = u"".join([unichr(i) for i in xrange(1000)] + [unichr(i) for i in xrange(sys.maxunicode-10, sys.maxunicode+1)])
137
138
139def test_helpersescapetext():
140    escape_output = []
141    for c in escape_input:
142        if c==u"&":
143            escape_output.append(u"&amp;")
144        elif c==u"<":
145            escape_output.append(u"&lt;")
146        elif c==u">":
147            escape_output.append(u"&gt;")
148        elif restrictedchars.match(c) is not None:
149            escape_output.append(u"&#%d;" % ord(c))
150        else:
151            escape_output.append(c)
152    escape_output = "".join(escape_output)
153    assert helpers.escapetext(escape_input) == escape_output
154
155
156def test_helpersescapeattr():
157    escape_output = []
158    for c in escape_input:
159        if c==u"&":
160            escape_output.append(u"&amp;")
161        elif c==u"<":
162            escape_output.append(u"&lt;")
163        elif c==u">":
164            escape_output.append(u"&gt;")
165        elif c==u'"':
166            escape_output.append(u"&quot;")
167        elif restrictedchars.match(c) is not None:
168            escape_output.append(u"&#%d;" % ord(c))
169        else:
170            escape_output.append(c)
171    escape_output = "".join(escape_output)
172    assert helpers.escapeattr(escape_input) == escape_output
173
174
175def test_helpercssescapereplace():
176    escape_output = []
177    for c in escape_input:
178        try:
179            c.encode("ascii")
180            escape_output.append(c)
181        except UnicodeError:
182            escape_output.append((u"\\%x" % ord(c)).upper())
183    escape_output = u"".join(escape_output)
184    assert helpers.cssescapereplace(escape_input, "ascii") == escape_output
185
186
187def test_encoding():
188    def check(encoding):
189        node = xsc.Frag(
190            html.div(
191                php.php("echo $foo"),
192                abbr.html(),
193                html.div("gurk", class_="hurz"),
194                u"\u3042",
195            )
196        )
197        s = node.asBytes(encoding=encoding)
198        node2 = parsers.parseString(s, saxparser=parsers.ExpatParser, prefixes={None: [html, php, abbr]})
199        assert node == node2
200
201    for encoding in ("utf-8", "utf-16", "utf-16-be", "utf-16-le", "latin-1", "ascii"):
202        yield check, encoding
Note: See TracBrowser for help on using the browser.