| 
									
										
										
										
											2016-09-11 09:32:26 +00:00
										 |  |  | '''Test Tools/scripts/fixcid.py.''' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from io import StringIO | 
					
						
							|  |  |  | import os, os.path | 
					
						
							|  |  |  | import runpy | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | from test import support | 
					
						
							|  |  |  | from test.test_tools import skip_if_missing, scriptsdir | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | skip_if_missing() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Test(unittest.TestCase): | 
					
						
							|  |  |  |     def test_parse_strings(self): | 
					
						
							|  |  |  |         old1 = 'int xx = "xx\\"xx"[xx];\n' | 
					
						
							|  |  |  |         old2 = "int xx = 'x\\'xx' + xx;\n" | 
					
						
							|  |  |  |         output = self.run_script(old1 + old2) | 
					
						
							|  |  |  |         new1 = 'int yy = "xx\\"xx"[yy];\n' | 
					
						
							|  |  |  |         new2 = "int yy = 'x\\'xx' + yy;\n" | 
					
						
							|  |  |  |         self.assertMultiLineEqual(output, | 
					
						
							|  |  |  |             "1\n" | 
					
						
							|  |  |  |             "< {old1}" | 
					
						
							|  |  |  |             "> {new1}" | 
					
						
							|  |  |  |             "{new1}" | 
					
						
							|  |  |  |             "2\n" | 
					
						
							|  |  |  |             "< {old2}" | 
					
						
							|  |  |  |             "> {new2}" | 
					
						
							|  |  |  |             "{new2}".format(old1=old1, old2=old2, new1=new1, new2=new2) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_alter_comments(self): | 
					
						
							|  |  |  |         output = self.run_script( | 
					
						
							|  |  |  |             substfile= | 
					
						
							|  |  |  |                 "xx yy\n" | 
					
						
							|  |  |  |                 "*aa bb\n", | 
					
						
							|  |  |  |             args=("-c", "-",), | 
					
						
							|  |  |  |             input= | 
					
						
							|  |  |  |                 "/* xx altered */\n" | 
					
						
							|  |  |  |                 "int xx;\n" | 
					
						
							|  |  |  |                 "/* aa unaltered */\n" | 
					
						
							|  |  |  |                 "int aa;\n", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertMultiLineEqual(output, | 
					
						
							|  |  |  |             "1\n" | 
					
						
							|  |  |  |             "< /* xx altered */\n" | 
					
						
							|  |  |  |             "> /* yy altered */\n" | 
					
						
							|  |  |  |             "/* yy altered */\n" | 
					
						
							|  |  |  |             "2\n" | 
					
						
							|  |  |  |             "< int xx;\n" | 
					
						
							|  |  |  |             "> int yy;\n" | 
					
						
							|  |  |  |             "int yy;\n" | 
					
						
							|  |  |  |             "/* aa unaltered */\n" | 
					
						
							|  |  |  |             "4\n" | 
					
						
							|  |  |  |             "< int aa;\n" | 
					
						
							|  |  |  |             "> int bb;\n" | 
					
						
							|  |  |  |             "int bb;\n" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_directory(self): | 
					
						
							|  |  |  |         os.mkdir(support.TESTFN) | 
					
						
							|  |  |  |         self.addCleanup(support.rmtree, support.TESTFN) | 
					
						
							|  |  |  |         c_filename = os.path.join(support.TESTFN, "file.c") | 
					
						
							|  |  |  |         with open(c_filename, "w") as file: | 
					
						
							|  |  |  |             file.write("int xx;\n") | 
					
						
							|  |  |  |         with open(os.path.join(support.TESTFN, "file.py"), "w") as file: | 
					
						
							|  |  |  |             file.write("xx = 'unaltered'\n") | 
					
						
							|  |  |  |         script = os.path.join(scriptsdir, "fixcid.py") | 
					
						
							|  |  |  |         output = self.run_script(args=(support.TESTFN,)) | 
					
						
							|  |  |  |         self.assertMultiLineEqual(output, | 
					
						
							|  |  |  |             "{}:\n" | 
					
						
							|  |  |  |             "1\n" | 
					
						
							|  |  |  |             '< int xx;\n' | 
					
						
							|  |  |  |             '> int yy;\n'.format(c_filename) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def run_script(self, input="", *, args=("-",), substfile="xx yy\n"): | 
					
						
							|  |  |  |         substfilename = support.TESTFN + ".subst" | 
					
						
							|  |  |  |         with open(substfilename, "w") as file: | 
					
						
							|  |  |  |             file.write(substfile) | 
					
						
							|  |  |  |         self.addCleanup(support.unlink, substfilename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         argv = ["fixcid.py", "-s", substfilename] + list(args) | 
					
						
							|  |  |  |         script = os.path.join(scriptsdir, "fixcid.py") | 
					
						
							|  |  |  |         with support.swap_attr(sys, "argv", argv), \ | 
					
						
							|  |  |  |                 support.swap_attr(sys, "stdin", StringIO(input)), \ | 
					
						
							| 
									
										
										
										
											2016-09-13 07:55:54 +03:00
										 |  |  |                 support.captured_stdout() as output, \ | 
					
						
							|  |  |  |                 support.captured_stderr(): | 
					
						
							| 
									
										
										
										
											2016-09-11 09:32:26 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 runpy.run_path(script, run_name="__main__") | 
					
						
							|  |  |  |             except SystemExit as exit: | 
					
						
							|  |  |  |                 self.assertEqual(exit.code, 0) | 
					
						
							|  |  |  |         return output.getvalue() |