import unittest
from test import support

import string, mimetools
import io

msgtext1 = mimetools.Message(io.StringIO(
"""Content-Type: text/plain; charset=iso-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Foo!
"""))

sample = bytes(string.ascii_letters + "=" + string.digits + "\n", "ASCII")

class MimeToolsTest(unittest.TestCase):

    def decode_encode_test(self, enc):
        i = io.BytesIO(sample)
        o = io.BytesIO()
        mimetools.encode(i, o, enc)
        i = io.BytesIO(o.getvalue())
        o = io.BytesIO()
        mimetools.decode(i, o, enc)
        self.assertEqual(o.getvalue(), sample)

    # Separate tests for better diagnostics

    def test_7bit(self):
        self.decode_encode_test('7bit')

    def test_8bit(self):
        self.decode_encode_test('8bit')

    def test_base64(self):
        self.decode_encode_test('base64')

    def test_quoted_printable(self):
        self.decode_encode_test('quoted-printable')

    def test_uuencode(self):
        self.decode_encode_test('uuencode')

    def test_x_uuencode(self):
        self.decode_encode_test('x-uuencode')

    def test_uue(self):
        self.decode_encode_test('uue')

    def test_x_uue(self):
        self.decode_encode_test('x-uue')

    def test_boundary(self):
        s = set([""])
        for i in range(100):
            nb = mimetools.choose_boundary()
            self.assert_(nb not in s)
            s.add(nb)

    def test_message(self):
        msg = mimetools.Message(io.StringIO(str(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():
    support.run_unittest(MimeToolsTest)

if __name__=="__main__":
    test_main()
