1068f06568be288b8628a4e24118503e4d9b7af1bEric Smith# PyOS_ascii_formatd is deprecated and not called from anywhere in
2068f06568be288b8628a4e24118503e4d9b7af1bEric Smith#  Python itself. So this module is the only place it gets tested.
3068f06568be288b8628a4e24118503e4d9b7af1bEric Smith# Test that it works, and test that it's deprecated.
4068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
5068f06568be288b8628a4e24118503e4d9b7af1bEric Smithimport unittest
627e024023cca704e44b0d5f577415d061f89f7d7Florent Xiclunafrom test.test_support import check_warnings, run_unittest, import_module
727e024023cca704e44b0d5f577415d061f89f7d7Florent Xicluna
827e024023cca704e44b0d5f577415d061f89f7d7Florent Xicluna# Skip tests if _ctypes module does not exist
927e024023cca704e44b0d5f577415d061f89f7d7Florent Xiclunaimport_module('_ctypes')
1027e024023cca704e44b0d5f577415d061f89f7d7Florent Xicluna
1127e024023cca704e44b0d5f577415d061f89f7d7Florent Xiclunafrom ctypes import pythonapi, create_string_buffer, sizeof, byref, c_double
1227e024023cca704e44b0d5f577415d061f89f7d7Florent XiclunaPyOS_ascii_formatd = pythonapi.PyOS_ascii_formatd
13068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
14068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
15068f06568be288b8628a4e24118503e4d9b7af1bEric Smithclass FormatDeprecationTests(unittest.TestCase):
16068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
17875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna    def test_format_deprecation(self):
18068f06568be288b8628a4e24118503e4d9b7af1bEric Smith        buf = create_string_buffer(' ' * 100)
19068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
20875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna        with check_warnings(('PyOS_ascii_formatd is deprecated',
21875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna                             DeprecationWarning)):
22068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            PyOS_ascii_formatd(byref(buf), sizeof(buf), '%+.10f',
23068f06568be288b8628a4e24118503e4d9b7af1bEric Smith                               c_double(10.0))
24068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            self.assertEqual(buf.value, '+10.0000000000')
25068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
26875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna
27068f06568be288b8628a4e24118503e4d9b7af1bEric Smithclass FormatTests(unittest.TestCase):
28068f06568be288b8628a4e24118503e4d9b7af1bEric Smith    # ensure that, for the restricted set of format codes,
29068f06568be288b8628a4e24118503e4d9b7af1bEric Smith    # %-formatting returns the same values os PyOS_ascii_formatd
30875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna    def test_format(self):
31068f06568be288b8628a4e24118503e4d9b7af1bEric Smith        buf = create_string_buffer(' ' * 100)
32068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
33068f06568be288b8628a4e24118503e4d9b7af1bEric Smith        tests = [
34068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%f', 100.0),
35068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%g', 100.0),
36068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%#g', 100.0),
37068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%#.2g', 100.0),
38068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%#.2g', 123.4567),
39068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%#.2g', 1.234567e200),
40068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%e', 1.234567e200),
41068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%e', 1.234),
42068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%+e', 1.234),
43068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ('%-e', 1.234),
44068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            ]
45068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
46875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna        with check_warnings(('PyOS_ascii_formatd is deprecated',
47875bdf731c27c1bc0dd46ee4da0b4407d1c45ae7Florent Xicluna                             DeprecationWarning)):
48068f06568be288b8628a4e24118503e4d9b7af1bEric Smith            for format, val in tests:
49068f06568be288b8628a4e24118503e4d9b7af1bEric Smith                PyOS_ascii_formatd(byref(buf), sizeof(buf), format,
50068f06568be288b8628a4e24118503e4d9b7af1bEric Smith                                   c_double(val))
51068f06568be288b8628a4e24118503e4d9b7af1bEric Smith                self.assertEqual(buf.value, format % val)
52068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
53068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
54068f06568be288b8628a4e24118503e4d9b7af1bEric Smithdef test_main():
55068f06568be288b8628a4e24118503e4d9b7af1bEric Smith    run_unittest(FormatDeprecationTests, FormatTests)
56068f06568be288b8628a4e24118503e4d9b7af1bEric Smith
57068f06568be288b8628a4e24118503e4d9b7af1bEric Smithif __name__ == '__main__':
58068f06568be288b8628a4e24118503e4d9b7af1bEric Smith    test_main()
59