1 #!/usr/bin/python 2 """ 3 Python-Markdown Regression Tests 4 ================================ 5 6 Tests of the various APIs with the python markdown lib. 7 8 """ 9 10 import unittest 11 from doctest import DocTestSuite 12 import os 13 import markdown 14 15 class TestMarkdown(unittest.TestCase): 16 """ Tests basics of the Markdown class. """ 17 18 def setUp(self): 19 """ Create instance of Markdown. """ 20 self.md = markdown.Markdown() 21 22 def testBlankInput(self): 23 """ Test blank input. """ 24 self.assertEqual(self.md.convert(''), '') 25 26 def testWhitespaceOnly(self): 27 """ Test input of only whitespace. """ 28 self.assertEqual(self.md.convert(' '), '') 29 30 def testSimpleInput(self): 31 """ Test simple input. """ 32 self.assertEqual(self.md.convert('foo'), '<p>foo</p>') 33 34 class TestBlockParser(unittest.TestCase): 35 """ Tests of the BlockParser class. """ 36 37 def setUp(self): 38 """ Create instance of BlockParser. """ 39 self.parser = markdown.Markdown().parser 40 41 def testParseChunk(self): 42 """ Test BlockParser.parseChunk. """ 43 root = markdown.etree.Element("div") 44 text = 'foo' 45 self.parser.parseChunk(root, text) 46 self.assertEqual(markdown.etree.tostring(root), "<div><p>foo</p></div>") 47 48 def testParseDocument(self): 49 """ Test BlockParser.parseDocument. """ 50 lines = ['#foo', '', 'bar', '', ' baz'] 51 tree = self.parser.parseDocument(lines) 52 self.assert_(isinstance(tree, markdown.etree.ElementTree)) 53 self.assert_(markdown.etree.iselement(tree.getroot())) 54 self.assertEqual(markdown.etree.tostring(tree.getroot()), 55 "<div><h1>foo</h1><p>bar</p><pre><code>baz\n</code></pre></div>") 56 57 58 class TestBlockParserState(unittest.TestCase): 59 """ Tests of the State class for BlockParser. """ 60 61 def setUp(self): 62 self.state = markdown.blockparser.State() 63 64 def testBlankState(self): 65 """ Test State when empty. """ 66 self.assertEqual(self.state, []) 67 68 def testSetSate(self): 69 """ Test State.set(). """ 70 self.state.set('a_state') 71 self.assertEqual(self.state, ['a_state']) 72 self.state.set('state2') 73 self.assertEqual(self.state, ['a_state', 'state2']) 74 75 def testIsSate(self): 76 """ Test State.isstate(). """ 77 self.assertEqual(self.state.isstate('anything'), False) 78 self.state.set('a_state') 79 self.assertEqual(self.state.isstate('a_state'), True) 80 self.state.set('state2') 81 self.assertEqual(self.state.isstate('state2'), True) 82 self.assertEqual(self.state.isstate('a_state'), False) 83 self.assertEqual(self.state.isstate('missing'), False) 84 85 def testReset(self): 86 """ Test State.reset(). """ 87 self.state.set('a_state') 88 self.state.reset() 89 self.assertEqual(self.state, []) 90 self.state.set('state1') 91 self.state.set('state2') 92 self.state.reset() 93 self.assertEqual(self.state, ['state1']) 94 95 class TestHtmlStash(unittest.TestCase): 96 """ Test Markdown's HtmlStash. """ 97 98 def setUp(self): 99 self.stash = markdown.preprocessors.HtmlStash() 100 self.placeholder = self.stash.store('foo') 101 102 def testSimpleStore(self): 103 """ Test HtmlStash.store. """ 104 self.assertEqual(self.placeholder, 105 markdown.preprocessors.HTML_PLACEHOLDER % 0) 106 self.assertEqual(self.stash.html_counter, 1) 107 self.assertEqual(self.stash.rawHtmlBlocks, [('foo', False)]) 108 109 def testStoreMore(self): 110 """ Test HtmlStash.store with additional blocks. """ 111 placeholder = self.stash.store('bar') 112 self.assertEqual(placeholder, 113 markdown.preprocessors.HTML_PLACEHOLDER % 1) 114 self.assertEqual(self.stash.html_counter, 2) 115 self.assertEqual(self.stash.rawHtmlBlocks, 116 [('foo', False), ('bar', False)]) 117 118 def testSafeStore(self): 119 """ Test HtmlStash.store with 'safe' html. """ 120 self.stash.store('bar', True) 121 self.assertEqual(self.stash.rawHtmlBlocks, 122 [('foo', False), ('bar', True)]) 123 124 def testReset(self): 125 """ Test HtmlStash.reset. """ 126 self.stash.reset() 127 self.assertEqual(self.stash.html_counter, 0) 128 self.assertEqual(self.stash.rawHtmlBlocks, []) 129 130 class TestOrderedDict(unittest.TestCase): 131 """ Test OrderedDict storage class. """ 132 133 def setUp(self): 134 self.odict = markdown.odict.OrderedDict() 135 self.odict['first'] = 'This' 136 self.odict['third'] = 'a' 137 self.odict['fourth'] = 'self' 138 self.odict['fifth'] = 'test' 139 140 def testValues(self): 141 """ Test output of OrderedDict.values(). """ 142 self.assertEqual(self.odict.values(), ['This', 'a', 'self', 'test']) 143 144 def testKeys(self): 145 """ Test output of OrderedDict.keys(). """ 146 self.assertEqual(self.odict.keys(), 147 ['first', 'third', 'fourth', 'fifth']) 148 149 def testItems(self): 150 """ Test output of OrderedDict.items(). """ 151 self.assertEqual(self.odict.items(), 152 [('first', 'This'), ('third', 'a'), 153 ('fourth', 'self'), ('fifth', 'test')]) 154 155 def testAddBefore(self): 156 """ Test adding an OrderedDict item before a given key. """ 157 self.odict.add('second', 'is', '<third') 158 self.assertEqual(self.odict.items(), 159 [('first', 'This'), ('second', 'is'), ('third', 'a'), 160 ('fourth', 'self'), ('fifth', 'test')]) 161 162 def testAddAfter(self): 163 """ Test adding an OrderDict item after a given key. """ 164 self.odict.add('second', 'is', '>first') 165 self.assertEqual(self.odict.items(), 166 [('first', 'This'), ('second', 'is'), ('third', 'a'), 167 ('fourth', 'self'), ('fifth', 'test')]) 168 169 def testAddAfterEnd(self): 170 """ Test adding an OrderedDict item after the last key. """ 171 self.odict.add('sixth', '.', '>fifth') 172 self.assertEqual(self.odict.items(), 173 [('first', 'This'), ('third', 'a'), 174 ('fourth', 'self'), ('fifth', 'test'), ('sixth', '.')]) 175 176 def testAdd_begin(self): 177 """ Test adding an OrderedDict item using "_begin". """ 178 self.odict.add('zero', 'CRAZY', '_begin') 179 self.assertEqual(self.odict.items(), 180 [('zero', 'CRAZY'), ('first', 'This'), ('third', 'a'), 181 ('fourth', 'self'), ('fifth', 'test')]) 182 183 def testAdd_end(self): 184 """ Test adding an OrderedDict item using "_end". """ 185 self.odict.add('sixth', '.', '_end') 186 self.assertEqual(self.odict.items(), 187 [('first', 'This'), ('third', 'a'), 188 ('fourth', 'self'), ('fifth', 'test'), ('sixth', '.')]) 189 190 def testAddBadLocation(self): 191 """ Test Error on bad location in OrderedDict.add(). """ 192 self.assertRaises(ValueError, self.odict.add, 'sixth', '.', '<seventh') 193 self.assertRaises(ValueError, self.odict.add, 'second', 'is', 'third') 194 195 def testDeleteItem(self): 196 """ Test deletion of an OrderedDict item. """ 197 del self.odict['fourth'] 198 self.assertEqual(self.odict.items(), 199 [('first', 'This'), ('third', 'a'), ('fifth', 'test')]) 200 201 def testChangeValue(self): 202 """ Test OrderedDict change value. """ 203 self.odict['fourth'] = 'CRAZY' 204 self.assertEqual(self.odict.items(), 205 [('first', 'This'), ('third', 'a'), 206 ('fourth', 'CRAZY'), ('fifth', 'test')]) 207 208 def testChangeOrder(self): 209 """ Test OrderedDict change order. """ 210 self.odict.link('fourth', '<third') 211 self.assertEqual(self.odict.items(), 212 [('first', 'This'), ('fourth', 'self'), 213 ('third', 'a'), ('fifth', 'test')]) 214 215 def suite(): 216 """ Build a test suite of the above tests and extension doctests. """ 217 suite = unittest.TestSuite() 218 suite.addTest(unittest.makeSuite(TestMarkdown)) 219 suite.addTest(unittest.makeSuite(TestBlockParser)) 220 suite.addTest(unittest.makeSuite(TestBlockParserState)) 221 suite.addTest(unittest.makeSuite(TestHtmlStash)) 222 suite.addTest(unittest.makeSuite(TestOrderedDict)) 223 224 for filename in os.listdir('markdown/extensions'): 225 if filename.endswith('.py'): 226 module = 'markdown.extensions.%s' % filename[:-3] 227 try: 228 suite.addTest(DocTestSuite(module)) 229 except: ValueError 230 # No tests 231 return suite 232 233 if __name__ == '__main__': 234 unittest.TextTestRunner(verbosity=2).run(suite()) 235