17db96d56Sopenharmony_ci'''Test Tools/scripts/fixcid.py.'''
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_cifrom io import StringIO
47db96d56Sopenharmony_ciimport os, os.path
57db96d56Sopenharmony_ciimport runpy
67db96d56Sopenharmony_ciimport sys
77db96d56Sopenharmony_cifrom test import support
87db96d56Sopenharmony_cifrom test.support import os_helper
97db96d56Sopenharmony_cifrom test.test_tools import skip_if_missing, scriptsdir
107db96d56Sopenharmony_ciimport unittest
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciskip_if_missing()
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciclass Test(unittest.TestCase):
157db96d56Sopenharmony_ci    def test_parse_strings(self):
167db96d56Sopenharmony_ci        old1 = 'int xx = "xx\\"xx"[xx];\n'
177db96d56Sopenharmony_ci        old2 = "int xx = 'x\\'xx' + xx;\n"
187db96d56Sopenharmony_ci        output = self.run_script(old1 + old2)
197db96d56Sopenharmony_ci        new1 = 'int yy = "xx\\"xx"[yy];\n'
207db96d56Sopenharmony_ci        new2 = "int yy = 'x\\'xx' + yy;\n"
217db96d56Sopenharmony_ci        self.assertMultiLineEqual(output,
227db96d56Sopenharmony_ci            "1\n"
237db96d56Sopenharmony_ci            "< {old1}"
247db96d56Sopenharmony_ci            "> {new1}"
257db96d56Sopenharmony_ci            "{new1}"
267db96d56Sopenharmony_ci            "2\n"
277db96d56Sopenharmony_ci            "< {old2}"
287db96d56Sopenharmony_ci            "> {new2}"
297db96d56Sopenharmony_ci            "{new2}".format(old1=old1, old2=old2, new1=new1, new2=new2)
307db96d56Sopenharmony_ci        )
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci    def test_alter_comments(self):
337db96d56Sopenharmony_ci        output = self.run_script(
347db96d56Sopenharmony_ci            substfile=
357db96d56Sopenharmony_ci                "xx yy\n"
367db96d56Sopenharmony_ci                "*aa bb\n",
377db96d56Sopenharmony_ci            args=("-c", "-",),
387db96d56Sopenharmony_ci            input=
397db96d56Sopenharmony_ci                "/* xx altered */\n"
407db96d56Sopenharmony_ci                "int xx;\n"
417db96d56Sopenharmony_ci                "/* aa unaltered */\n"
427db96d56Sopenharmony_ci                "int aa;\n",
437db96d56Sopenharmony_ci        )
447db96d56Sopenharmony_ci        self.assertMultiLineEqual(output,
457db96d56Sopenharmony_ci            "1\n"
467db96d56Sopenharmony_ci            "< /* xx altered */\n"
477db96d56Sopenharmony_ci            "> /* yy altered */\n"
487db96d56Sopenharmony_ci            "/* yy altered */\n"
497db96d56Sopenharmony_ci            "2\n"
507db96d56Sopenharmony_ci            "< int xx;\n"
517db96d56Sopenharmony_ci            "> int yy;\n"
527db96d56Sopenharmony_ci            "int yy;\n"
537db96d56Sopenharmony_ci            "/* aa unaltered */\n"
547db96d56Sopenharmony_ci            "4\n"
557db96d56Sopenharmony_ci            "< int aa;\n"
567db96d56Sopenharmony_ci            "> int bb;\n"
577db96d56Sopenharmony_ci            "int bb;\n"
587db96d56Sopenharmony_ci        )
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    def test_directory(self):
617db96d56Sopenharmony_ci        os.mkdir(os_helper.TESTFN)
627db96d56Sopenharmony_ci        self.addCleanup(os_helper.rmtree, os_helper.TESTFN)
637db96d56Sopenharmony_ci        c_filename = os.path.join(os_helper.TESTFN, "file.c")
647db96d56Sopenharmony_ci        with open(c_filename, "w", encoding="utf-8") as file:
657db96d56Sopenharmony_ci            file.write("int xx;\n")
667db96d56Sopenharmony_ci        with open(os.path.join(os_helper.TESTFN, "file.py"), "w",
677db96d56Sopenharmony_ci                  encoding="utf-8") as file:
687db96d56Sopenharmony_ci            file.write("xx = 'unaltered'\n")
697db96d56Sopenharmony_ci        script = os.path.join(scriptsdir, "fixcid.py")
707db96d56Sopenharmony_ci        output = self.run_script(args=(os_helper.TESTFN,))
717db96d56Sopenharmony_ci        self.assertMultiLineEqual(output,
727db96d56Sopenharmony_ci            "{}:\n"
737db96d56Sopenharmony_ci            "1\n"
747db96d56Sopenharmony_ci            '< int xx;\n'
757db96d56Sopenharmony_ci            '> int yy;\n'.format(c_filename)
767db96d56Sopenharmony_ci        )
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    def run_script(self, input="", *, args=("-",), substfile="xx yy\n"):
797db96d56Sopenharmony_ci        substfilename = os_helper.TESTFN + ".subst"
807db96d56Sopenharmony_ci        with open(substfilename, "w", encoding="utf-8") as file:
817db96d56Sopenharmony_ci            file.write(substfile)
827db96d56Sopenharmony_ci        self.addCleanup(os_helper.unlink, substfilename)
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci        argv = ["fixcid.py", "-s", substfilename] + list(args)
857db96d56Sopenharmony_ci        script = os.path.join(scriptsdir, "fixcid.py")
867db96d56Sopenharmony_ci        with support.swap_attr(sys, "argv", argv), \
877db96d56Sopenharmony_ci                support.swap_attr(sys, "stdin", StringIO(input)), \
887db96d56Sopenharmony_ci                support.captured_stdout() as output, \
897db96d56Sopenharmony_ci                support.captured_stderr():
907db96d56Sopenharmony_ci            try:
917db96d56Sopenharmony_ci                runpy.run_path(script, run_name="__main__")
927db96d56Sopenharmony_ci            except SystemExit as exit:
937db96d56Sopenharmony_ci                self.assertEqual(exit.code, 0)
947db96d56Sopenharmony_ci        return output.getvalue()
95