1'''Test Tools/scripts/fixcid.py.'''
2
3from io import StringIO
4import os, os.path
5import runpy
6import sys
7from test import support
8from test.support import os_helper
9from test.test_tools import skip_if_missing, scriptsdir
10import unittest
11
12skip_if_missing()
13
14class Test(unittest.TestCase):
15    def test_parse_strings(self):
16        old1 = 'int xx = "xx\\"xx"[xx];\n'
17        old2 = "int xx = 'x\\'xx' + xx;\n"
18        output = self.run_script(old1 + old2)
19        new1 = 'int yy = "xx\\"xx"[yy];\n'
20        new2 = "int yy = 'x\\'xx' + yy;\n"
21        self.assertMultiLineEqual(output,
22            "1\n"
23            "< {old1}"
24            "> {new1}"
25            "{new1}"
26            "2\n"
27            "< {old2}"
28            "> {new2}"
29            "{new2}".format(old1=old1, old2=old2, new1=new1, new2=new2)
30        )
31
32    def test_alter_comments(self):
33        output = self.run_script(
34            substfile=
35                "xx yy\n"
36                "*aa bb\n",
37            args=("-c", "-",),
38            input=
39                "/* xx altered */\n"
40                "int xx;\n"
41                "/* aa unaltered */\n"
42                "int aa;\n",
43        )
44        self.assertMultiLineEqual(output,
45            "1\n"
46            "< /* xx altered */\n"
47            "> /* yy altered */\n"
48            "/* yy altered */\n"
49            "2\n"
50            "< int xx;\n"
51            "> int yy;\n"
52            "int yy;\n"
53            "/* aa unaltered */\n"
54            "4\n"
55            "< int aa;\n"
56            "> int bb;\n"
57            "int bb;\n"
58        )
59
60    def test_directory(self):
61        os.mkdir(os_helper.TESTFN)
62        self.addCleanup(os_helper.rmtree, os_helper.TESTFN)
63        c_filename = os.path.join(os_helper.TESTFN, "file.c")
64        with open(c_filename, "w", encoding="utf-8") as file:
65            file.write("int xx;\n")
66        with open(os.path.join(os_helper.TESTFN, "file.py"), "w",
67                  encoding="utf-8") as file:
68            file.write("xx = 'unaltered'\n")
69        script = os.path.join(scriptsdir, "fixcid.py")
70        output = self.run_script(args=(os_helper.TESTFN,))
71        self.assertMultiLineEqual(output,
72            "{}:\n"
73            "1\n"
74            '< int xx;\n'
75            '> int yy;\n'.format(c_filename)
76        )
77
78    def run_script(self, input="", *, args=("-",), substfile="xx yy\n"):
79        substfilename = os_helper.TESTFN + ".subst"
80        with open(substfilename, "w", encoding="utf-8") as file:
81            file.write(substfile)
82        self.addCleanup(os_helper.unlink, substfilename)
83
84        argv = ["fixcid.py", "-s", substfilename] + list(args)
85        script = os.path.join(scriptsdir, "fixcid.py")
86        with support.swap_attr(sys, "argv", argv), \
87                support.swap_attr(sys, "stdin", StringIO(input)), \
88                support.captured_stdout() as output, \
89                support.captured_stderr():
90            try:
91                runpy.run_path(script, run_name="__main__")
92            except SystemExit as exit:
93                self.assertEqual(exit.code, 0)
94        return output.getvalue()
95