# Hye-Shik Chang <1 March 2002>

import StringIO
import sys, codecs
import unittest
from korean import aliases
del aliases

def escape(s):
    buffer = []
    for c in map(ord, s):
        if c < 0x20 or c > 0x7f:
            buffer.append("\\%03o" % c)
        else:
            buffer.append(chr(c))
    return "'" + ''.join(buffer) + "'"


class CodecTestBase(unittest.TestCase):

    encoding        = ''   # codec name
    textfile_chunk  = None # (native, utf-8) file name tuple
    textfile_stream = None # (native, utf-8)
    
    errortests      = None # must set. error test tuple

    def setUp(self):
        if not self.textfile_chunk:
            self.textfile_chunk = ('text.' + self.encoding, 
                                'text.%s.utf-8' % self.encoding) or self.textfile_stream
        if not self.textfile_stream:
            self.textfile_stream = self.textfile_chunk # checked above. :)

    def test_ChunkCoding(self):
        for native, utf8 in zip(*[open(f).readlines() for f in self.textfile_chunk]):
            u = unicode(native, self.encoding)
            self.assertEqual(u, unicode(utf8, 'utf-8'))
            self.assertEqual(native, u.encode(self.encoding))

    def test_ErrorHandling(self):
        encode, decode, Reader, Writer = codecs.lookup(self.encoding)
        for source, scheme, expected in self.errortests:
            if type(source) == type(''):
                func = decode
            else:
                func = encode
            if expected:
                result = func(source, scheme)[0]
                self.assertEqual(result, expected)
            else:
                try:
                    result = func(source, scheme)[0]
                except UnicodeError:
                    continue
                self.fail('UnicodeError expected')


class TestStreamReader:

    # stream test codes has taken from KAJIYAMA's JapaneseCodecs

    def test_StreamReader(self):
        Reader     = codecs.lookup(self.encoding)[2]
        UTF8Writer = codecs.lookup('utf-8')[3]
        textnative = open(self.textfile_stream[0]).read()
        textuni    = open(self.textfile_stream[1]).read()

        for name in ["read", "readline", "readlines"]:
            for sizehint in [None, -1] + range(1, 33) + [64, 128, 256, 512, 1024]:
                istream = Reader(StringIO.StringIO(textnative))
                ostream = UTF8Writer(StringIO.StringIO())
                func = getattr(istream, name)
                while 1:
                    data = func(sizehint)
                    if not data:
                        break
                    if name == "readlines":
                        ostream.writelines(data)
                    else:
                        ostream.write(data)

                self.assertEqual(ostream.getvalue(), textuni)


class TestStreamWriter:

    def test_StreamWriter(self):
        UTF8Reader = codecs.lookup('utf-8')[2]
        Writer     = codecs.lookup(self.encoding)[3]
        textnative = open(self.textfile_stream[0]).read()
        textuni    = open(self.textfile_stream[1]).read()

        for name in ["read", "readline", "readlines"]:
            for sizehint in [None, -1] + range(1, 33) + [64, 128, 256, 512, 1024]:
                istream = UTF8Reader(StringIO.StringIO(textuni))
                ostream = Writer(StringIO.StringIO())
                func = getattr(istream, name)
                while 1:
                    data = func(sizehint)
                    if not data:
                        break
                    if name == "readlines":
                        ostream.writelines(data)
                    else:
                        ostream.write(data)

                self.assertEqual(ostream.getvalue(), textnative)

def main():
    sys.argv.insert(1, '-v')
    unittest.main(argv=sys.argv)


syntax highlighted by Code2HTML, v. 0.9.1