| #!/usr/bin/env python |
| |
| import codecs |
| import io |
| import unittest |
| |
| import idna.codec |
| |
| CODEC_NAME = "idna2008" |
| |
| |
| class IDNACodecTests(unittest.TestCase): |
| def setUp(self): |
| from . import test_idna |
| |
| self.idnatests = test_idna.IDNATests() |
| self.idnatests.setUp() |
| |
| def testCodec(self): |
| self.assertIs(codecs.lookup(CODEC_NAME).incrementalencoder, idna.codec.IncrementalEncoder) |
| |
| def testDirectDecode(self): |
| self.idnatests.test_decode(decode=lambda obj: codecs.decode(obj, CODEC_NAME)) |
| |
| def testIndirectDecode(self): |
| self.idnatests.test_decode(decode=lambda obj: obj.decode(CODEC_NAME), skip_str=True) |
| |
| def testDirectEncode(self): |
| self.idnatests.test_encode(encode=lambda obj: codecs.encode(obj, CODEC_NAME)) |
| |
| def testIndirectEncode(self): |
| self.idnatests.test_encode(encode=lambda obj: obj.encode(CODEC_NAME), skip_bytes=True) |
| |
| def testStreamReader(self): |
| def decode(obj): |
| if isinstance(obj, str): |
| obj = bytes(obj, "ascii") |
| buffer = io.BytesIO(obj) |
| stream = codecs.getreader(CODEC_NAME)(buffer) |
| return stream.read() |
| |
| return self.idnatests.test_decode(decode=decode, skip_str=True) |
| |
| def testStreamWriter(self): |
| def encode(obj): |
| buffer = io.BytesIO() |
| stream = codecs.getwriter(CODEC_NAME)(buffer) |
| stream.write(obj) |
| stream.flush() |
| return buffer.getvalue() |
| |
| return self.idnatests.test_encode(encode=encode) |
| |
| def testIncrementalDecoder(self): |
| # Tests derived from Python standard library test/test_codecs.py |
| |
| incremental_tests = ( |
| ("python.org", b"python.org"), |
| ("python.org.", b"python.org."), |
| ("pyth\xf6n.org", b"xn--pythn-mua.org"), |
| ("pyth\xf6n.org.", b"xn--pythn-mua.org."), |
| ) |
| |
| for decoded, encoded in incremental_tests: |
| self.assertEqual( |
| "".join(codecs.iterdecode((bytes([c]) for c in encoded), CODEC_NAME)), |
| decoded, |
| ) |
| |
| decoder = codecs.getincrementaldecoder(CODEC_NAME)() |
| self.assertEqual( |
| decoder.decode( |
| b"xn--xam", |
| ), |
| "", |
| ) |
| self.assertEqual( |
| decoder.decode( |
| b"ple-9ta.o", |
| ), |
| "\xe4xample.", |
| ) |
| self.assertEqual(decoder.decode(b"rg"), "") |
| self.assertEqual(decoder.decode(b"", True), "org") |
| |
| decoder.reset() |
| self.assertEqual( |
| decoder.decode( |
| b"xn--xam", |
| ), |
| "", |
| ) |
| self.assertEqual( |
| decoder.decode( |
| b"ple-9ta.o", |
| ), |
| "\xe4xample.", |
| ) |
| self.assertEqual(decoder.decode(b"rg."), "org.") |
| self.assertEqual(decoder.decode(b"", True), "") |
| |
| def testIncrementalEncoder(self): |
| # Tests derived from Python standard library test/test_codecs.py |
| |
| incremental_tests = ( |
| ("python.org", b"python.org"), |
| ("python.org.", b"python.org."), |
| ("pyth\xf6n.org", b"xn--pythn-mua.org"), |
| ("pyth\xf6n.org.", b"xn--pythn-mua.org."), |
| ) |
| for decoded, encoded in incremental_tests: |
| self.assertEqual(b"".join(codecs.iterencode(decoded, CODEC_NAME)), encoded) |
| |
| encoder = codecs.getincrementalencoder(CODEC_NAME)() |
| self.assertEqual(encoder.encode("\xe4x"), b"") |
| self.assertEqual(encoder.encode("ample.org"), b"xn--xample-9ta.") |
| self.assertEqual(encoder.encode("", True), b"org") |
| |
| encoder.reset() |
| self.assertEqual(encoder.encode("\xe4x"), b"") |
| self.assertEqual(encoder.encode("ample.org."), b"xn--xample-9ta.org.") |
| self.assertEqual(encoder.encode("", True), b"") |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |