| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  | import os | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | from collections import UserDict | 
					
						
							|  |  |  | from test.support import import_helper | 
					
						
							| 
									
										
										
										
											2024-04-29 18:50:11 +03:00
										 |  |  | from test.support.os_helper import unlink, TESTFN, TESTFN_ASCII, TESTFN_UNDECODABLE | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | NULL = None | 
					
						
							|  |  |  | _testcapi = import_helper.import_module('_testcapi') | 
					
						
							|  |  |  | Py_single_input = _testcapi.Py_single_input | 
					
						
							|  |  |  | Py_file_input = _testcapi.Py_file_input | 
					
						
							|  |  |  | Py_eval_input = _testcapi.Py_eval_input | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 16:43:03 +03:00
										 |  |  | class DictSubclass(dict): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  | class CAPITest(unittest.TestCase): | 
					
						
							|  |  |  |     # TODO: Test the following functions: | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     #   PyRun_SimpleStringFlags | 
					
						
							|  |  |  |     #   PyRun_AnyFileExFlags | 
					
						
							|  |  |  |     #   PyRun_SimpleFileExFlags | 
					
						
							|  |  |  |     #   PyRun_InteractiveOneFlags | 
					
						
							|  |  |  |     #   PyRun_InteractiveOneObject | 
					
						
							|  |  |  |     #   PyRun_InteractiveLoopFlags | 
					
						
							|  |  |  |     #   PyRun_String (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_AnyFile (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_AnyFileEx (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_AnyFileFlags (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_SimpleString (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_SimpleFile (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_SimpleFileEx (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_InteractiveOne (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_InteractiveLoop (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_File (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_FileEx (may be a macro) | 
					
						
							|  |  |  |     #   PyRun_FileFlags (may be a macro) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_run_stringflags(self): | 
					
						
							|  |  |  |         # Test PyRun_StringFlags(). | 
					
						
							| 
									
										
										
										
											2024-04-29 18:50:11 +03:00
										 |  |  |         # XXX: fopen() uses different path encoding than Python on Windows. | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  |         def run(s, *args): | 
					
						
							|  |  |  |             return _testcapi.run_stringflags(s, Py_file_input, *args) | 
					
						
							|  |  |  |         source = b'a\n' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIsNone(run(b'a\n', dict(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run(b'a\n', dict(a=1), {})) | 
					
						
							|  |  |  |         self.assertIsNone(run(b'a\n', {}, dict(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run(b'a\n', {}, UserDict(a=1))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(NameError, run, b'a\n', {}) | 
					
						
							|  |  |  |         self.assertRaises(NameError, run, b'a\n', {}, {}) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, run, b'a\n', dict(a=1), []) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, run, b'a\n', dict(a=1), 1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 16:43:03 +03:00
										 |  |  |         self.assertIsNone(run(b'a\n', DictSubclass(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run(b'a\n', DictSubclass(), dict(a=1))) | 
					
						
							|  |  |  |         self.assertRaises(NameError, run, b'a\n', DictSubclass()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  |         self.assertIsNone(run(b'\xc3\xa4\n', {'\xe4': 1})) | 
					
						
							|  |  |  |         self.assertRaises(SyntaxError, run, b'\xe4\n', {}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 16:43:03 +03:00
										 |  |  |         self.assertRaises(SystemError, run, b'a\n', NULL) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, b'a\n', NULL, {}) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, b'a\n', NULL, dict(a=1)) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, b'a\n', UserDict()) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, b'a\n', UserDict(), {}) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, b'a\n', UserDict(), dict(a=1)) | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # CRASHES run(NULL, {}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_run_fileexflags(self): | 
					
						
							|  |  |  |         # Test PyRun_FileExFlags(). | 
					
						
							| 
									
										
										
										
											2024-04-29 18:50:11 +03:00
										 |  |  |         filename = os.fsencode(TESTFN if os.name != 'nt' else TESTFN_ASCII) | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  |         with open(filename, 'wb') as fp: | 
					
						
							|  |  |  |             fp.write(b'a\n') | 
					
						
							|  |  |  |         self.addCleanup(unlink, filename) | 
					
						
							|  |  |  |         def run(*args): | 
					
						
							|  |  |  |             return _testcapi.run_fileexflags(filename, Py_file_input, *args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIsNone(run(dict(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run(dict(a=1), {})) | 
					
						
							|  |  |  |         self.assertIsNone(run({}, dict(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run({}, UserDict(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run(dict(a=1), {}, 1))  # closeit = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(NameError, run, {}) | 
					
						
							|  |  |  |         self.assertRaises(NameError, run, {}, {}) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, run, dict(a=1), []) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, run, dict(a=1), 1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 16:43:03 +03:00
										 |  |  |         self.assertIsNone(run(DictSubclass(a=1))) | 
					
						
							|  |  |  |         self.assertIsNone(run(DictSubclass(), dict(a=1))) | 
					
						
							|  |  |  |         self.assertRaises(NameError, run, DictSubclass()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, NULL) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, NULL, {}) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, NULL, dict(a=1)) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, UserDict()) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, UserDict(), {}) | 
					
						
							|  |  |  |         self.assertRaises(SystemError, run, UserDict(), dict(a=1)) | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @unittest.skipUnless(TESTFN_UNDECODABLE, 'only works if there are undecodable paths') | 
					
						
							| 
									
										
										
										
											2024-04-29 18:50:11 +03:00
										 |  |  |     @unittest.skipIf(os.name == 'nt', 'does not work on Windows') | 
					
						
							| 
									
										
										
										
											2024-04-17 23:45:35 +03:00
										 |  |  |     def test_run_fileexflags_with_undecodable_filename(self): | 
					
						
							|  |  |  |         run = _testcapi.run_fileexflags | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with open(TESTFN_UNDECODABLE, 'wb') as fp: | 
					
						
							|  |  |  |                 fp.write(b'a\n') | 
					
						
							|  |  |  |             self.addCleanup(unlink, TESTFN_UNDECODABLE) | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             self.skipTest('undecodable paths are not supported') | 
					
						
							|  |  |  |         self.assertIsNone(run(TESTFN_UNDECODABLE, Py_file_input, dict(a=1))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |