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'), '<abc&&>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('&')), '&') 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