1a5f9918aSopenharmony_ci 2a5f9918aSopenharmony_ciimport yaml 3a5f9918aSopenharmony_ciimport codecs, io, tempfile, os, os.path 4a5f9918aSopenharmony_ci 5a5f9918aSopenharmony_cidef test_unicode_input(unicode_filename, verbose=False): 6a5f9918aSopenharmony_ci with open(unicode_filename, 'rb') as file: 7a5f9918aSopenharmony_ci data = file.read().decode('utf-8') 8a5f9918aSopenharmony_ci value = ' '.join(data.split()) 9a5f9918aSopenharmony_ci output = yaml.full_load(data) 10a5f9918aSopenharmony_ci assert output == value, (output, value) 11a5f9918aSopenharmony_ci output = yaml.full_load(io.StringIO(data)) 12a5f9918aSopenharmony_ci assert output == value, (output, value) 13a5f9918aSopenharmony_ci for input in [data.encode('utf-8'), 14a5f9918aSopenharmony_ci codecs.BOM_UTF8+data.encode('utf-8'), 15a5f9918aSopenharmony_ci codecs.BOM_UTF16_BE+data.encode('utf-16-be'), 16a5f9918aSopenharmony_ci codecs.BOM_UTF16_LE+data.encode('utf-16-le')]: 17a5f9918aSopenharmony_ci if verbose: 18a5f9918aSopenharmony_ci print("INPUT:", repr(input[:10]), "...") 19a5f9918aSopenharmony_ci output = yaml.full_load(input) 20a5f9918aSopenharmony_ci assert output == value, (output, value) 21a5f9918aSopenharmony_ci output = yaml.full_load(io.BytesIO(input)) 22a5f9918aSopenharmony_ci assert output == value, (output, value) 23a5f9918aSopenharmony_ci 24a5f9918aSopenharmony_citest_unicode_input.unittest = ['.unicode'] 25a5f9918aSopenharmony_ci 26a5f9918aSopenharmony_cidef test_unicode_input_errors(unicode_filename, verbose=False): 27a5f9918aSopenharmony_ci with open(unicode_filename, 'rb') as file: 28a5f9918aSopenharmony_ci data = file.read().decode('utf-8') 29a5f9918aSopenharmony_ci for input in [data.encode('utf-16-be'), 30a5f9918aSopenharmony_ci data.encode('utf-16-le'), 31a5f9918aSopenharmony_ci codecs.BOM_UTF8+data.encode('utf-16-be'), 32a5f9918aSopenharmony_ci codecs.BOM_UTF8+data.encode('utf-16-le')]: 33a5f9918aSopenharmony_ci 34a5f9918aSopenharmony_ci try: 35a5f9918aSopenharmony_ci yaml.full_load(input) 36a5f9918aSopenharmony_ci except yaml.YAMLError as exc: 37a5f9918aSopenharmony_ci if verbose: 38a5f9918aSopenharmony_ci print(exc) 39a5f9918aSopenharmony_ci else: 40a5f9918aSopenharmony_ci raise AssertionError("expected an exception") 41a5f9918aSopenharmony_ci try: 42a5f9918aSopenharmony_ci yaml.full_load(io.BytesIO(input)) 43a5f9918aSopenharmony_ci except yaml.YAMLError as exc: 44a5f9918aSopenharmony_ci if verbose: 45a5f9918aSopenharmony_ci print(exc) 46a5f9918aSopenharmony_ci else: 47a5f9918aSopenharmony_ci raise AssertionError("expected an exception") 48a5f9918aSopenharmony_ci 49a5f9918aSopenharmony_citest_unicode_input_errors.unittest = ['.unicode'] 50a5f9918aSopenharmony_ci 51a5f9918aSopenharmony_cidef test_unicode_output(unicode_filename, verbose=False): 52a5f9918aSopenharmony_ci with open(unicode_filename, 'rb') as file: 53a5f9918aSopenharmony_ci data = file.read().decode('utf-8') 54a5f9918aSopenharmony_ci value = ' '.join(data.split()) 55a5f9918aSopenharmony_ci for allow_unicode in [False, True]: 56a5f9918aSopenharmony_ci data1 = yaml.dump(value, allow_unicode=allow_unicode) 57a5f9918aSopenharmony_ci for encoding in [None, 'utf-8', 'utf-16-be', 'utf-16-le']: 58a5f9918aSopenharmony_ci stream = io.StringIO() 59a5f9918aSopenharmony_ci yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode) 60a5f9918aSopenharmony_ci data2 = stream.getvalue() 61a5f9918aSopenharmony_ci data3 = yaml.dump(value, encoding=encoding, allow_unicode=allow_unicode) 62a5f9918aSopenharmony_ci if encoding is not None: 63a5f9918aSopenharmony_ci assert isinstance(data3, bytes) 64a5f9918aSopenharmony_ci data3 = data3.decode(encoding) 65a5f9918aSopenharmony_ci stream = io.BytesIO() 66a5f9918aSopenharmony_ci if encoding is None: 67a5f9918aSopenharmony_ci try: 68a5f9918aSopenharmony_ci yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode) 69a5f9918aSopenharmony_ci except TypeError as exc: 70a5f9918aSopenharmony_ci if verbose: 71a5f9918aSopenharmony_ci print(exc) 72a5f9918aSopenharmony_ci data4 = None 73a5f9918aSopenharmony_ci else: 74a5f9918aSopenharmony_ci raise AssertionError("expected an exception") 75a5f9918aSopenharmony_ci else: 76a5f9918aSopenharmony_ci yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode) 77a5f9918aSopenharmony_ci data4 = stream.getvalue() 78a5f9918aSopenharmony_ci if verbose: 79a5f9918aSopenharmony_ci print("BYTES:", data4[:50]) 80a5f9918aSopenharmony_ci data4 = data4.decode(encoding) 81a5f9918aSopenharmony_ci 82a5f9918aSopenharmony_ci assert isinstance(data1, str), (type(data1), encoding) 83a5f9918aSopenharmony_ci assert isinstance(data2, str), (type(data2), encoding) 84a5f9918aSopenharmony_ci 85a5f9918aSopenharmony_citest_unicode_output.unittest = ['.unicode'] 86a5f9918aSopenharmony_ci 87a5f9918aSopenharmony_cidef test_file_output(unicode_filename, verbose=False): 88a5f9918aSopenharmony_ci with open(unicode_filename, 'rb') as file: 89a5f9918aSopenharmony_ci data = file.read().decode('utf-8') 90a5f9918aSopenharmony_ci handle, filename = tempfile.mkstemp() 91a5f9918aSopenharmony_ci os.close(handle) 92a5f9918aSopenharmony_ci try: 93a5f9918aSopenharmony_ci stream = io.StringIO() 94a5f9918aSopenharmony_ci yaml.dump(data, stream, allow_unicode=True) 95a5f9918aSopenharmony_ci data1 = stream.getvalue() 96a5f9918aSopenharmony_ci stream = io.BytesIO() 97a5f9918aSopenharmony_ci yaml.dump(data, stream, encoding='utf-16-le', allow_unicode=True) 98a5f9918aSopenharmony_ci data2 = stream.getvalue().decode('utf-16-le')[1:] 99a5f9918aSopenharmony_ci with open(filename, 'w', encoding='utf-16-le') as stream: 100a5f9918aSopenharmony_ci yaml.dump(data, stream, allow_unicode=True) 101a5f9918aSopenharmony_ci with open(filename, 'r', encoding='utf-16-le') as file: 102a5f9918aSopenharmony_ci data3 = file.read() 103a5f9918aSopenharmony_ci with open(filename, 'wb') as stream: 104a5f9918aSopenharmony_ci yaml.dump(data, stream, encoding='utf-8', allow_unicode=True) 105a5f9918aSopenharmony_ci with open(filename, 'r', encoding='utf-8') as file: 106a5f9918aSopenharmony_ci data4 = file.read() 107a5f9918aSopenharmony_ci assert data1 == data2, (data1, data2) 108a5f9918aSopenharmony_ci assert data1 == data3, (data1, data3) 109a5f9918aSopenharmony_ci assert data1 == data4, (data1, data4) 110a5f9918aSopenharmony_ci finally: 111a5f9918aSopenharmony_ci if os.path.exists(filename): 112a5f9918aSopenharmony_ci os.unlink(filename) 113a5f9918aSopenharmony_ci 114a5f9918aSopenharmony_citest_file_output.unittest = ['.unicode'] 115a5f9918aSopenharmony_ci 116a5f9918aSopenharmony_cidef test_unicode_transfer(unicode_filename, verbose=False): 117a5f9918aSopenharmony_ci with open(unicode_filename, 'rb') as file: 118a5f9918aSopenharmony_ci data = file.read().decode('utf-8') 119a5f9918aSopenharmony_ci for encoding in [None, 'utf-8', 'utf-16-be', 'utf-16-le']: 120a5f9918aSopenharmony_ci input = data 121a5f9918aSopenharmony_ci if encoding is not None: 122a5f9918aSopenharmony_ci input = ('\ufeff'+input).encode(encoding) 123a5f9918aSopenharmony_ci output1 = yaml.emit(yaml.parse(input), allow_unicode=True) 124a5f9918aSopenharmony_ci if encoding is None: 125a5f9918aSopenharmony_ci stream = io.StringIO() 126a5f9918aSopenharmony_ci else: 127a5f9918aSopenharmony_ci stream = io.BytesIO() 128a5f9918aSopenharmony_ci yaml.emit(yaml.parse(input), stream, allow_unicode=True) 129a5f9918aSopenharmony_ci output2 = stream.getvalue() 130a5f9918aSopenharmony_ci assert isinstance(output1, str), (type(output1), encoding) 131a5f9918aSopenharmony_ci if encoding is None: 132a5f9918aSopenharmony_ci assert isinstance(output2, str), (type(output1), encoding) 133a5f9918aSopenharmony_ci else: 134a5f9918aSopenharmony_ci assert isinstance(output2, bytes), (type(output1), encoding) 135a5f9918aSopenharmony_ci output2.decode(encoding) 136a5f9918aSopenharmony_ci 137a5f9918aSopenharmony_citest_unicode_transfer.unittest = ['.unicode'] 138a5f9918aSopenharmony_ci 139a5f9918aSopenharmony_ciif __name__ == '__main__': 140a5f9918aSopenharmony_ci import test_appliance 141a5f9918aSopenharmony_ci test_appliance.run(globals()) 142