import unittest
from test import test_support

import string
import StringIO

mimetools = test_support.import_module("mimetools", deprecated=True)

msgtext1 = mimetools.Message(StringIO.StringIO(
"""Content-Type: text/plain; charset=iso-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Foo!
"""))

class MimeToolsTest(unittest.TestCase):

    def test_decodeencode(self):
        start = string.ascii_letters + "=" + string.digits + "\n"
        for enc in ['7bit','8bit','base64','quoted-printable',
                    'uuencode', 'x-uuencode', 'uue', 'x-uue']:
            i = StringIO.StringIO(start)
            o = StringIO.StringIO()
            mimetools.encode(i, o, enc)
            i = StringIO.StringIO(o.getvalue())
            o = StringIO.StringIO()
            mimetools.decode(i, o, enc)
            self.assertEqual(o.getvalue(), start)

    def test_boundary(self):
        s = set([""])
        for i in xrange(100):
            nb = mimetools.choose_boundary()
            self.assertNotIn(nb, s)
            s.add(nb)

    def test_message(self):
        msg = mimetools.Message(StringIO.StringIO(msgtext1))
        self.assertEqual(msg.gettype(), "text/plain")
        self.assertEqual(msg.getmaintype(), "text")
        self.assertEqual(msg.getsubtype(), "plain")
        self.assertEqual(msg.getplist(), ["charset=iso-8859-1", "format=flowed"])
        self.assertEqual(msg.getparamnames(), ["charset", "format"])
        self.assertEqual(msg.getparam("charset"), "iso-8859-1")
        self.assertEqual(msg.getparam("format"), "flowed")
        self.assertEqual(msg.getparam("spam"), None)
        self.assertEqual(msg.getencoding(), "8bit")

def test_main():
    test_support.run_unittest(MimeToolsTest)

if __name__=="__main__":
    test_main()
