| # Copyright 2010 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| import sys |
| |
| from portage import _encodings, _unicode_decode |
| from portage.exception import PortageException |
| from portage.tests import TestCase |
| from _emerge.DependencyArg import DependencyArg |
| from _emerge.UseFlagDisplay import UseFlagDisplay |
| |
| if sys.hexversion >= 0x3000000: |
| basestring = str |
| |
| STR_IS_UNICODE = sys.hexversion >= 0x3000000 |
| |
| class StringFormatTestCase(TestCase): |
| """ |
| Test that string formatting works correctly in the current interpretter, |
| which may be either python2 or python3. |
| """ |
| |
| # In order to get some unicode test strings in a way that works in |
| # both python2 and python3, write them here as byte strings and |
| # decode them before use. This assumes _encodings['content'] is |
| # utf_8. |
| |
| unicode_strings = ( |
| b'\xE2\x80\x98', |
| b'\xE2\x80\x99', |
| ) |
| |
| def testDependencyArg(self): |
| |
| self.assertEqual(_encodings['content'], 'utf_8') |
| |
| for arg_bytes in self.unicode_strings: |
| arg_unicode = _unicode_decode(arg_bytes, encoding=_encodings['content']) |
| dependency_arg = DependencyArg(arg=arg_unicode) |
| |
| # Force unicode format string so that __unicode__() is |
| # called in python2. |
| formatted_str = _unicode_decode("%s") % (dependency_arg,) |
| self.assertEqual(formatted_str, arg_unicode) |
| |
| if STR_IS_UNICODE: |
| |
| # Test the __str__ method which returns unicode in python3 |
| formatted_str = "%s" % (dependency_arg,) |
| self.assertEqual(formatted_str, arg_unicode) |
| |
| else: |
| |
| # Test the __str__ method which returns encoded bytes in python2 |
| formatted_bytes = "%s" % (dependency_arg,) |
| self.assertEqual(formatted_bytes, arg_bytes) |
| |
| def testPortageException(self): |
| |
| self.assertEqual(_encodings['content'], 'utf_8') |
| |
| for arg_bytes in self.unicode_strings: |
| arg_unicode = _unicode_decode(arg_bytes, encoding=_encodings['content']) |
| e = PortageException(arg_unicode) |
| |
| # Force unicode format string so that __unicode__() is |
| # called in python2. |
| formatted_str = _unicode_decode("%s") % (e,) |
| self.assertEqual(formatted_str, arg_unicode) |
| |
| if STR_IS_UNICODE: |
| |
| # Test the __str__ method which returns unicode in python3 |
| formatted_str = "%s" % (e,) |
| self.assertEqual(formatted_str, arg_unicode) |
| |
| else: |
| |
| # Test the __str__ method which returns encoded bytes in python2 |
| formatted_bytes = "%s" % (e,) |
| self.assertEqual(formatted_bytes, arg_bytes) |
| |
| def testUseFlagDisplay(self): |
| |
| self.assertEqual(_encodings['content'], 'utf_8') |
| |
| for enabled in (True, False): |
| for forced in (True, False): |
| for arg_bytes in self.unicode_strings: |
| arg_unicode = _unicode_decode(arg_bytes, encoding=_encodings['content']) |
| e = UseFlagDisplay(arg_unicode, enabled, forced) |
| |
| # Force unicode format string so that __unicode__() is |
| # called in python2. |
| formatted_str = _unicode_decode("%s") % (e,) |
| self.assertEqual(isinstance(formatted_str, basestring), True) |
| |
| if STR_IS_UNICODE: |
| |
| # Test the __str__ method which returns unicode in python3 |
| formatted_str = "%s" % (e,) |
| self.assertEqual(isinstance(formatted_str, str), True) |
| |
| else: |
| |
| # Test the __str__ method which returns encoded bytes in python2 |
| formatted_bytes = "%s" % (e,) |
| self.assertEqual(isinstance(formatted_bytes, bytes), True) |