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