1# Copyright (c) 2004 Divmod.
2# See LICENSE for details.
3
4from nevow.flat import ten
5from nevow import tags
6
7from nevow.testutil import TestCase
8
9
10class TestSerialization(TestCase):
11    def test_someTypes(self):
12        self.assertEquals(ten.flatten(1), '1')
13        self.assertEquals(ten.flatten([1,2,3]), '123')
14
15    def test_nestedTags(self):
16        self.assertEquals(
17            ten.flatten(
18                tags.html(hi='there')[
19                    tags.body[ 42 ]]),
20            '<html hi="there"><body>42</body></html>')
21
22    def test_dynamic(self):
23        self.assertEquals(
24            ten.flatten(
25                tags.html[
26                    tags.body(render=lambda c, d: 'body!')]),
27            '<html>body!</html>')
28
29    def test_reallyDynamic(self):
30        self.assertEquals(
31            ten.flatten(
32                tags.html[
33                    lambda c, d: tags.body[
34                        lambda c, d: 'stuff']]),
35            '<html><body>stuff</body></html>')
36
37    def test_serializeString(self):
38        self.assertEquals(ten.flatten('one'), 'one')
39        self.assertEquals(type(ten.flatten('<>')), tags.raw)
40        self.assertEquals(ten.flatten('<abc&&>123'), '&lt;abc&amp;&amp;&gt;123')
41        self.assertEquals(ten.flatten(tags.xml('<>&')), '<>&')
42        self.assertEquals(ten.flatten(tags.xml(u'\xc2\xa3')), '\xc3\x82\xc2\xa3')
43
44    def test_flattenTwice(self):
45        """Test that flattening a string twice does not encode it twice.
46        """
47        self.assertEquals(ten.flatten(ten.flatten('&')), '&amp;')
48
49
50class TestPrecompile(TestCase):
51    def test_simple(self):
52        self.assertEquals(ten.precompile(1), ['1'])
53
54    def test_complex(self):
55        self.assertEquals(ten.precompile(
56            tags.html[
57                tags.head[
58                    tags.title["Hi"]],
59                tags.body[
60                    tags.div(style="color:red")["Bye"]]]),
61            ['<html><head><title>Hi</title></head><body><div style="color:red">Bye</div></body></html>'])
62
63    def test_dynamic(self):
64        render = lambda c, d: 'one'
65        result = ten.precompile(
66            tags.html[
67                render])
68        prelude, dynamic, postlude = result
69        self.assertEquals(prelude, '<html>')
70        self.assertEquals(dynamic.tag.render, render)
71        self.assertEquals(postlude, '</html>')
72        self.assertEquals(ten.flatten(result), '<html>one</html>')
73
74    def test_tagWithRender(self):
75        render = lambda c, d: 'body'
76        result = ten.precompile(
77            tags.html[
78                tags.body(render=render)])
79        prelude, dynamic, postlude = result
80        self.assertEquals(prelude, '<html>')
81        self.assertEquals(dynamic.tag.render, render)
82        self.assertEquals(postlude, '</html>')
83        self.assertEquals(ten.flatten(result), '<html>body</html>')
84
85
86import unicodedata
87u = unicodedata.lookup('QUARTER NOTE')
88
89
90class TestUnicode(TestCase):
91
92    def test_it(self):
93        self.assertEquals(ten.flatten(u), u.encode('utf8'))
94
95    def test_unescaped(self):
96        self.assertEquals(ten.flatten(tags.xml(u'<<<%s>>>' % u)), (u'<<<%s>>>' % u).encode('utf8'))
97
98class Registration(TestCase):
99    def testBadRegister(self):
100        try:
101            ten.registerFlattener('adouijwd.dwijd hi mom', '1234567890')
102        except:
103            # Yay
104            pass
105        else:
106            self.fail("Registering invalid flattener names raised no exception")
107