1# Copyright (C) 2006 Canonical Ltd 2# 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 2 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program; if not, write to the Free Software 15# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 16 17"""Tests for utf8 caching.""" 18 19from .. import ( 20 cache_utf8, 21 ) 22from . import TestCase 23 24 25class TestEncodeCache(TestCase): 26 27 def setUp(self): 28 super(TestEncodeCache, self).setUp() 29 cache_utf8.clear_encoding_cache() 30 self.addCleanup(cache_utf8.clear_encoding_cache) 31 32 def check_encode(self, rev_id): 33 rev_id_utf8 = rev_id.encode('utf-8') 34 self.assertFalse(rev_id in cache_utf8._unicode_to_utf8_map) 35 self.assertFalse(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) 36 37 # After a single encode, the mapping should exist for 38 # both directions 39 self.assertEqual(rev_id_utf8, cache_utf8.encode(rev_id)) 40 self.assertTrue(rev_id in cache_utf8._unicode_to_utf8_map) 41 self.assertTrue(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) 42 43 self.assertEqual(rev_id, cache_utf8.decode(rev_id_utf8)) 44 45 cache_utf8.clear_encoding_cache() 46 self.assertFalse(rev_id in cache_utf8._unicode_to_utf8_map) 47 self.assertFalse(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) 48 49 def check_decode(self, rev_id): 50 rev_id_utf8 = rev_id.encode('utf-8') 51 self.assertFalse(rev_id in cache_utf8._unicode_to_utf8_map) 52 self.assertFalse(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) 53 54 # After a single decode, the mapping should exist for 55 # both directions 56 self.assertEqual(rev_id, cache_utf8.decode(rev_id_utf8)) 57 self.assertTrue(rev_id in cache_utf8._unicode_to_utf8_map) 58 self.assertTrue(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) 59 60 self.assertEqual(rev_id_utf8, cache_utf8.encode(rev_id)) 61 cache_utf8.clear_encoding_cache() 62 63 self.assertFalse(rev_id in cache_utf8._unicode_to_utf8_map) 64 self.assertFalse(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) 65 66 def test_ascii(self): 67 self.check_decode(u'all_ascii_characters123123123') 68 self.check_encode(u'all_ascii_characters123123123') 69 70 def test_unicode(self): 71 self.check_encode(u'some_\xb5_unicode_\xe5_chars') 72 self.check_decode(u'some_\xb5_unicode_\xe5_chars') 73 74 def test_cached_unicode(self): 75 # Note that this is intentionally split, to prevent Python from 76 # assigning x and y to the same object 77 z = u'\xe5zz' 78 x = u'\xb5yy' + z 79 y = u'\xb5yy' + z 80 self.assertIsNot(x, y) 81 xp = cache_utf8.get_cached_unicode(x) 82 yp = cache_utf8.get_cached_unicode(y) 83 84 self.assertIs(xp, x) 85 self.assertIs(xp, yp) 86 87 def test_cached_utf8(self): 88 x = u'\xb5yy\xe5zz'.encode('utf8') 89 y = u'\xb5yy\xe5zz'.encode('utf8') 90 self.assertFalse(x is y) 91 xp = cache_utf8.get_cached_utf8(x) 92 yp = cache_utf8.get_cached_utf8(y) 93 94 self.assertIs(xp, x) 95 self.assertIs(xp, yp) 96 97 def test_cached_ascii(self): 98 x = b'%s %s' % (b'simple', b'text') 99 y = b'%s %s' % (b'simple', b'text') 100 self.assertIsNot(x, y) 101 xp = cache_utf8.get_cached_ascii(x) 102 yp = cache_utf8.get_cached_ascii(y) 103 104 self.assertIs(xp, x) 105 self.assertIs(xp, yp) 106 107 # after caching, encode and decode should also return the right 108 # objects. 109 uni_x = cache_utf8.decode(x) 110 self.assertEqual(u'simple text', uni_x) 111 self.assertIsInstance(uni_x, str) 112 113 utf8_x = cache_utf8.encode(uni_x) 114 self.assertIs(utf8_x, x) 115 116 def test_decode_with_None(self): 117 self.assertEqual(None, cache_utf8._utf8_decode_with_None(None)) 118 self.assertEqual(u'foo', cache_utf8._utf8_decode_with_None(b'foo')) 119 self.assertEqual(u'f\xb5', 120 cache_utf8._utf8_decode_with_None(b'f\xc2\xb5')) 121