Import python-markdown

This is from git://gitorious.org/python-markdown/mainline.git
at tag 2.0.3 (commit 067d88bc41c7924c9087b724ff5247235243ce6b)

Change-Id: I5091438ce3243b87a099b8a75dd6307921966e76
diff --git a/regression-tests.py b/regression-tests.py
new file mode 100755
index 0000000..7601061
--- /dev/null
+++ b/regression-tests.py
@@ -0,0 +1,234 @@
+#!/usr/bin/python
+"""
+Python-Markdown Regression Tests
+================================
+
+Tests of the various APIs with the python markdown lib.
+
+"""
+
+import unittest
+from doctest import DocTestSuite
+import os
+import markdown
+
+class TestMarkdown(unittest.TestCase):
+    """ Tests basics of the Markdown class. """
+
+    def setUp(self):
+        """ Create instance of Markdown. """
+        self.md = markdown.Markdown()
+
+    def testBlankInput(self):
+        """ Test blank input. """
+        self.assertEqual(self.md.convert(''), '')
+
+    def testWhitespaceOnly(self):
+        """ Test input of only whitespace. """
+        self.assertEqual(self.md.convert(' '), '')
+
+    def testSimpleInput(self):
+        """ Test simple input. """
+        self.assertEqual(self.md.convert('foo'), '<p>foo</p>')
+
+class TestBlockParser(unittest.TestCase):
+    """ Tests of the BlockParser class. """
+
+    def setUp(self):
+        """ Create instance of BlockParser. """
+        self.parser = markdown.Markdown().parser
+
+    def testParseChunk(self):
+        """ Test BlockParser.parseChunk. """
+        root = markdown.etree.Element("div")
+        text = 'foo'
+        self.parser.parseChunk(root, text)
+        self.assertEqual(markdown.etree.tostring(root), "<div><p>foo</p></div>")
+
+    def testParseDocument(self):
+        """ Test BlockParser.parseDocument. """
+        lines = ['#foo', '', 'bar', '', '    baz']
+        tree = self.parser.parseDocument(lines)
+        self.assert_(isinstance(tree, markdown.etree.ElementTree))
+        self.assert_(markdown.etree.iselement(tree.getroot()))
+        self.assertEqual(markdown.etree.tostring(tree.getroot()),
+            "<div><h1>foo</h1><p>bar</p><pre><code>baz\n</code></pre></div>")
+
+
+class TestBlockParserState(unittest.TestCase):
+    """ Tests of the State class for BlockParser. """
+
+    def setUp(self):
+        self.state = markdown.blockparser.State()
+
+    def testBlankState(self):
+        """ Test State when empty. """
+        self.assertEqual(self.state, [])
+
+    def testSetSate(self):
+        """ Test State.set(). """
+        self.state.set('a_state')
+        self.assertEqual(self.state, ['a_state'])
+        self.state.set('state2')
+        self.assertEqual(self.state, ['a_state', 'state2'])
+
+    def testIsSate(self):
+        """ Test State.isstate(). """
+        self.assertEqual(self.state.isstate('anything'), False)
+        self.state.set('a_state')
+        self.assertEqual(self.state.isstate('a_state'), True)
+        self.state.set('state2')
+        self.assertEqual(self.state.isstate('state2'), True)
+        self.assertEqual(self.state.isstate('a_state'), False)
+        self.assertEqual(self.state.isstate('missing'), False)
+
+    def testReset(self):
+        """ Test State.reset(). """
+        self.state.set('a_state')
+        self.state.reset()
+        self.assertEqual(self.state, [])
+        self.state.set('state1')
+        self.state.set('state2')
+        self.state.reset()
+        self.assertEqual(self.state, ['state1'])
+
+class TestHtmlStash(unittest.TestCase):
+    """ Test Markdown's HtmlStash. """
+    
+    def setUp(self):
+        self.stash = markdown.preprocessors.HtmlStash()
+        self.placeholder = self.stash.store('foo')
+
+    def testSimpleStore(self):
+        """ Test HtmlStash.store. """
+        self.assertEqual(self.placeholder, 
+                         markdown.preprocessors.HTML_PLACEHOLDER % 0)
+        self.assertEqual(self.stash.html_counter, 1)
+        self.assertEqual(self.stash.rawHtmlBlocks, [('foo', False)])
+
+    def testStoreMore(self):
+        """ Test HtmlStash.store with additional blocks. """
+        placeholder = self.stash.store('bar')
+        self.assertEqual(placeholder, 
+                         markdown.preprocessors.HTML_PLACEHOLDER % 1)
+        self.assertEqual(self.stash.html_counter, 2)
+        self.assertEqual(self.stash.rawHtmlBlocks, 
+                        [('foo', False), ('bar', False)])
+
+    def testSafeStore(self):
+        """ Test HtmlStash.store with 'safe' html. """
+        self.stash.store('bar', True)
+        self.assertEqual(self.stash.rawHtmlBlocks, 
+                        [('foo', False), ('bar', True)])
+
+    def testReset(self):
+        """ Test HtmlStash.reset. """
+        self.stash.reset()
+        self.assertEqual(self.stash.html_counter, 0)
+        self.assertEqual(self.stash.rawHtmlBlocks, [])
+
+class TestOrderedDict(unittest.TestCase):
+    """ Test OrderedDict storage class. """
+
+    def setUp(self):
+        self.odict = markdown.odict.OrderedDict()
+        self.odict['first'] = 'This'
+        self.odict['third'] = 'a'
+        self.odict['fourth'] = 'self'
+        self.odict['fifth'] = 'test'
+
+    def testValues(self):
+        """ Test output of OrderedDict.values(). """
+        self.assertEqual(self.odict.values(), ['This', 'a', 'self', 'test'])
+
+    def testKeys(self):
+        """ Test output of OrderedDict.keys(). """
+        self.assertEqual(self.odict.keys(),
+                    ['first', 'third', 'fourth', 'fifth'])
+
+    def testItems(self):
+        """ Test output of OrderedDict.items(). """
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('third', 'a'), 
+                    ('fourth', 'self'), ('fifth', 'test')])
+
+    def testAddBefore(self):
+        """ Test adding an OrderedDict item before a given key. """
+        self.odict.add('second', 'is', '<third')
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('second', 'is'), ('third', 'a'), 
+                    ('fourth', 'self'), ('fifth', 'test')])
+
+    def testAddAfter(self):
+        """ Test adding an OrderDict item after a given key. """
+        self.odict.add('second', 'is', '>first')
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('second', 'is'), ('third', 'a'), 
+                    ('fourth', 'self'), ('fifth', 'test')])
+
+    def testAddAfterEnd(self):
+        """ Test adding an OrderedDict item after the last key. """
+        self.odict.add('sixth', '.', '>fifth')
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('third', 'a'), 
+                    ('fourth', 'self'), ('fifth', 'test'), ('sixth', '.')])
+
+    def testAdd_begin(self):
+        """ Test adding an OrderedDict item using "_begin". """
+        self.odict.add('zero', 'CRAZY', '_begin')
+        self.assertEqual(self.odict.items(),
+                    [('zero', 'CRAZY'), ('first', 'This'), ('third', 'a'), 
+                    ('fourth', 'self'), ('fifth', 'test')])
+
+    def testAdd_end(self):
+        """ Test adding an OrderedDict item using "_end". """
+        self.odict.add('sixth', '.', '_end')
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('third', 'a'), 
+                    ('fourth', 'self'), ('fifth', 'test'), ('sixth', '.')])
+
+    def testAddBadLocation(self):
+        """ Test Error on bad location in OrderedDict.add(). """
+        self.assertRaises(ValueError, self.odict.add, 'sixth', '.', '<seventh')
+        self.assertRaises(ValueError, self.odict.add, 'second', 'is', 'third')
+
+    def testDeleteItem(self):
+        """ Test deletion of an OrderedDict item. """
+        del self.odict['fourth']
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('third', 'a'), ('fifth', 'test')])
+
+    def testChangeValue(self):
+        """ Test OrderedDict change value. """
+        self.odict['fourth'] = 'CRAZY'
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('third', 'a'), 
+                    ('fourth', 'CRAZY'), ('fifth', 'test')])
+
+    def testChangeOrder(self):
+        """ Test OrderedDict change order. """
+        self.odict.link('fourth', '<third')
+        self.assertEqual(self.odict.items(),
+                    [('first', 'This'), ('fourth', 'self'),
+                    ('third', 'a'), ('fifth', 'test')])
+
+def suite():
+    """ Build a test suite of the above tests and extension doctests. """
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestMarkdown))
+    suite.addTest(unittest.makeSuite(TestBlockParser))
+    suite.addTest(unittest.makeSuite(TestBlockParserState))
+    suite.addTest(unittest.makeSuite(TestHtmlStash))
+    suite.addTest(unittest.makeSuite(TestOrderedDict))
+
+    for filename in os.listdir('markdown/extensions'):
+        if filename.endswith('.py'):
+            module = 'markdown.extensions.%s' % filename[:-3]
+            try:
+                suite.addTest(DocTestSuite(module))
+            except: ValueError
+                # No tests
+    return suite
+
+if __name__ == '__main__':
+    unittest.TextTestRunner(verbosity=2).run(suite())