root/livinglogic.python.xist/test/test_publish.py @ 2630:389d8f4e136e

Revision 2630:389d8f4e136e, 8.1 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

Add a publishing test for specials.url

  • 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_publishspecialsurl():
122    node = specials.url("root:gurk.html")
123    assert node.asBytes() == """root:gurk.html"""
124    assert node.asBytes(base="root:gurk.html") == """"""
125    assert node.asBytes(base="root:hurz.html") == """gurk.html"""
126
127
128def test_publishempty():
129    node = xsc.Frag(html.br(), html.div())
130    assert node.asBytes(xhtml=0) == """<br><div></div>"""
131    assert node.asBytes(xhtml=1) == """<br /><div></div>"""
132    assert node.asBytes(xhtml=2) == """<br/><div/>"""
133
134
135def test_publishescaped():
136    s = u"""<&'"\xff>"""
137    node = xsc.Text(s)
138    assert node.asBytes(encoding="ascii") == """&lt;&amp;'"&#255;&gt;"""
139    node = html.span(class_=s)
140    assert node.asBytes(encoding="ascii", xhtml=2) == """<span class="&lt;&amp;'&quot;&#255;&gt;"/>"""
141
142
143escape_input = u"".join([unichr(i) for i in xrange(1000)] + [unichr(i) for i in xrange(sys.maxunicode-10, sys.maxunicode+1)])
144
145
146def test_helpersescapetext():
147    escape_output = []
148    for c in escape_input:
149        if c==u"&":
150            escape_output.append(u"&amp;")
151        elif c==u"<":
152            escape_output.append(u"&lt;")
153        elif c==u">":
154            escape_output.append(u"&gt;")
155        elif restrictedchars.match(c) is not None:
156            escape_output.append(u"&#%d;" % ord(c))
157        else:
158            escape_output.append(c)
159    escape_output = "".join(escape_output)
160    assert helpers.escapetext(escape_input) == escape_output
161
162
163def test_helpersescapeattr():
164    escape_output = []
165    for c in escape_input:
166        if c==u"&":
167            escape_output.append(u"&amp;")
168        elif c==u"<":
169            escape_output.append(u"&lt;")
170        elif c==u">":
171            escape_output.append(u"&gt;")
172        elif c==u'"':
173            escape_output.append(u"&quot;")
174        elif restrictedchars.match(c) is not None:
175            escape_output.append(u"&#%d;" % ord(c))
176        else:
177            escape_output.append(c)
178    escape_output = "".join(escape_output)
179    assert helpers.escapeattr(escape_input) == escape_output
180
181
182def test_helpercssescapereplace():
183    escape_output = []
184    for c in escape_input:
185        try:
186            c.encode("ascii")
187            escape_output.append(c)
188        except UnicodeError:
189            escape_output.append((u"\\%x" % ord(c)).upper())
190    escape_output = u"".join(escape_output)
191    assert helpers.cssescapereplace(escape_input, "ascii") == escape_output
192
193
194def test_encoding():
195    def check(encoding):
196        node = xsc.Frag(
197            html.div(
198                php.php("echo $foo"),
199                abbr.html(),
200                html.div("gurk", class_="hurz"),
201                u"\u3042",
202            )
203        )
204        s = node.asBytes(encoding=encoding)
205        node2 = parsers.parseString(s, saxparser=parsers.ExpatParser, prefixes={None: [html, php, abbr]})
206        assert node == node2
207
208    for encoding in ("utf-8", "utf-16", "utf-16-be", "utf-16-le", "latin-1", "ascii"):
209        yield check, encoding
Note: See TracBrowser for help on using the browser.