root / trunk / breve / tests / macros.py

Revision 405, 7.1 kB (checked in by cliff, 9 months ago)

more tests, new AutoTag? test

Line 
1# -*- coding: utf-8 -*-
2
3import sys, os
4import doctest, unittest
5
6if __name__ == '__main__':
7    # force import from source directory rather than site-packages
8    sys.path.insert ( 0, os.path.abspath ( '../..' ) )
9    import breve
10
11from breve.tags.html import tags as T
12from breve.tags.entities import entities as E
13from breve.tags import macro, assign, xml, test, let
14from breve.flatten import flatten 
15from breve.util import Namespace
16from breve.tests.lib import my_name
17
18
19class MacrosTestCase ( unittest.TestCase ):
20
21    def test_autotable_macro ( self ):
22        '''test autotable macro'''
23
24        data = [
25            [ 'One', 'Two', 'Three', 'Four' ],
26            range ( 0, 4 ),
27            range ( 4, 8 ),
28            range ( 8, 12 )
29        ]
30
31        template = (
32            macro ( 'AutoTable', lambda data, header=False: (
33                assign ( 'alts', [ 'even', 'odd' ] ),
34                data and ( 
35                    T.table ( class_='autotable' ) [
36                        header and ( 
37                            T.thead [ [ T.th [ _col ] for _col in data [ 0 ] ] ]
38                        ),
39                        T.tbody [
40                            [ T.tr ( class_='row-%s' % alts [ _rx % 2 ] ) [ 
41                                [ T.td ( class_='col-%s' % alts [ _cx % 2 ] ) [ _col ] 
42                                  for _cx, _col in enumerate ( _row ) ]
43                            ] for _rx, _row in enumerate ( data [ int ( header ): ] ) ]
44                        ]
45                    ]
46                ) or ''
47            ) ),
48
49            T.html [
50                T.head [ T.title [ my_name ( ) ] ],
51                T.body [
52                    AutoTable ( data, header=True )
53                ]
54            ]
55        )
56        output = flatten ( template )
57        self.assertEqual (
58            output,
59            ( u'<html><head><title>test_autotable_macro</title></head>'
60              u'<body><table class="autotable"><thead><th>One</th><th>Two</th><th>Three</th><th>Four</th></thead>'
61              u'<tbody><tr class="row-even"><td class="col-even">0</td><td class="col-odd">1</td>'
62              u'<td class="col-even">2</td><td class="col-odd">3</td></tr>'
63              u'<tr class="row-odd"><td class="col-even">4</td><td class="col-odd">5</td><td class="col-even">6</td>'
64              u'<td class="col-odd">7</td></tr>'
65              u'<tr class="row-even"><td class="col-even">8</td><td class="col-odd">9</td>'
66              u'<td class="col-even">10</td><td class="col-odd">11</td></tr></tbody>'
67              u'</table></body></html>' )
68        )
69
70    def test_autolist_macro ( self ):
71        '''test autolist macro'''
72       
73        data = [ "Item %s" % _i for _i in range ( 1,9 ) ]
74
75        template = (
76            macro ( 'AutoList', lambda data:
77                data and ( 
78                    T.ul ( class_='autolist' ) [
79                        [ T.li [ _i ] for _i in data ]
80                    ]
81                ) or ''
82            ),
83            T.html [
84                T.head [ T.title [ my_name ( ) ] ],
85                T.body [ AutoList ( data ) ]
86            ]
87        )
88        output = flatten ( template )
89        self.assertEqual ( 
90            output,
91            ( u'<html><head><title>test_autolist_macro</title></head>'
92              u'<body><ul class="autolist"><li>Item 1</li><li>Item 2</li>'
93              u'<li>Item 3</li><li>Item 4</li><li>Item 5</li><li>Item 6</li>'
94              u'<li>Item 7</li><li>Item 8</li></ul></body></html>' )
95        )
96       
97    def test_autolist_macro ( self ):
98        '''test autolist macro'''
99       
100        sublist1 = [ "List 1:%s" % _i for _i in range ( 3 ) ]
101        sublist2 = [ "List 2:%s" % _i for _i in range ( 3, 6 ) ]
102        sublist3 = [ "List 3:%s" % _i for _i in range ( 6, 9 ) ]
103        sublist3.append ( sublist2 )
104
105        data = [ 
106            'Item A', 'Item B', 'Item C',
107            sublist1, 
108            'Item D', 'Item E', 'Item F',
109            sublist3,
110        ]
111        template = (
112            macro ( 'AutoList', lambda data, level=0:
113                data and (
114                    T.ul ( class_='autolist level-%s' % level ) [
115                        [ T.li [
116                              [ lambda _i, _j: _i, AutoList ]
117                              [ isinstance ( _i, list ) ]( _i, level + 1 )
118                          ]
119                        for _i in data ]
120                    ]
121                ) or ''
122            ),
123
124            T.html [
125                T.head [ T.title [ my_name ( ) ] ],
126                T.body [ AutoList ( data ) ]
127            ]
128        )
129        output = flatten ( template )
130        self.assertEqual (
131            output,
132            ( u'<html><head><title>test_autolist_macro</title></head>'
133              u'<body><ul class="autolist level-0"><li>Item A</li>'
134              u'<li>Item B</li><li>Item C</li><li><ul class="autolist level-1">'
135              u'<li>List 1:0</li><li>List 1:1</li><li>List 1:2</li></ul></li>'
136              u'<li>Item D</li><li>Item E</li><li>Item F</li><li>'
137              u'<ul class="autolist level-1"><li>List 3:6</li>'
138              u'<li>List 3:7</li><li>List 3:8</li><li><ul class="autolist level-2">'
139              u'<li>List 2:3</li><li>List 2:4</li><li>List 2:5</li></ul>'
140              u'</li></ul></li></ul></body></html>' )
141        )
142
143    def test_toc_macro ( self ):
144        '''test table-of-contents macro'''
145
146        template = (
147            assign ( 'TOC', [ ] ),
148            macro ( 'TableOfContents', lambda matchtags, tag: (
149                macro ( 'toc_search', lambda tag, is_tag:
150                    tag.name in matchtags and (
151                        TOC.append ( T.a ( href='#toc-%s' % tag.children [ 0 ] ) [ tag.children [ 0 ] ] ),
152                        tag.attrs.update ( { 'class': 'chapter-%s' % tag.name } ),
153                        tag.children.insert ( 0, T.a ( name='toc-%s' % tag.children [ 0 ] ) [ tag.name ] )
154                    ) or True
155                ),
156                tag.walk ( toc_search, True )
157            ) ),
158
159            T.html [
160                T.head [ T.title [ my_name ( ) ] ],
161                T.body [ 
162                    T.div ( id='TableOfContents' ) [ 
163                        'Table of Contents', 
164                        lambda: T.ul [ [ T.li [ _t ] for _t in TOC ] ]
165                    ],
166                    TableOfContents ( ( 'h1', 'h2', 'h3' ), T.div [
167                        T.h1 [ 'Chapter 1' ],
168                        T.div [ 'chapter 1 content' ],
169                        T.h1 [ 'Chapter 2' ],
170                        T.div [ 
171                            'chapter 2 content',
172                            T.h2 [ 'Chapter 2 subsection' ],
173                            T.div [
174                                'chapter 2 subsection content' 
175                            ]
176                        ]
177                    ] )
178                ]
179            ]
180        )
181
182        actual = flatten ( template )
183        # print actual
184
185
186def suite ( ):
187    suite = unittest.TestSuite ( )
188
189    suite.addTest ( unittest.makeSuite ( MacrosTestCase, 'test' ) )
190
191    return suite
192
193if __name__ == '__main__':
194    unittest.main ( defaultTest = 'suite' )
Note: See TracBrowser for help on using the browser.