|
| 1 | +import os |
| 2 | +import unittest |
| 3 | +from collections import UserDict |
| 4 | +from test.support import import_helper |
| 5 | +from test.support.os_helper import unlink, TESTFN, TESTFN_UNDECODABLE |
| 6 | + |
| 7 | +NULL = None |
| 8 | +_testcapi = import_helper.import_module('_testcapi') |
| 9 | +Py_single_input = _testcapi.Py_single_input |
| 10 | +Py_file_input = _testcapi.Py_file_input |
| 11 | +Py_eval_input = _testcapi.Py_eval_input |
| 12 | + |
| 13 | + |
| 14 | +class CAPITest(unittest.TestCase): |
| 15 | + # TODO: Test the following functions: |
| 16 | + # |
| 17 | + # PyRun_SimpleStringFlags |
| 18 | + # PyRun_AnyFileExFlags |
| 19 | + # PyRun_SimpleFileExFlags |
| 20 | + # PyRun_InteractiveOneFlags |
| 21 | + # PyRun_InteractiveOneObject |
| 22 | + # PyRun_InteractiveLoopFlags |
| 23 | + # PyRun_String (may be a macro) |
| 24 | + # PyRun_AnyFile (may be a macro) |
| 25 | + # PyRun_AnyFileEx (may be a macro) |
| 26 | + # PyRun_AnyFileFlags (may be a macro) |
| 27 | + # PyRun_SimpleString (may be a macro) |
| 28 | + # PyRun_SimpleFile (may be a macro) |
| 29 | + # PyRun_SimpleFileEx (may be a macro) |
| 30 | + # PyRun_InteractiveOne (may be a macro) |
| 31 | + # PyRun_InteractiveLoop (may be a macro) |
| 32 | + # PyRun_File (may be a macro) |
| 33 | + # PyRun_FileEx (may be a macro) |
| 34 | + # PyRun_FileFlags (may be a macro) |
| 35 | + |
| 36 | + def test_run_stringflags(self): |
| 37 | + # Test PyRun_StringFlags(). |
| 38 | + def run(s, *args): |
| 39 | + return _testcapi.run_stringflags(s, Py_file_input, *args) |
| 40 | + source = b'a\n' |
| 41 | + |
| 42 | + self.assertIsNone(run(b'a\n', dict(a=1))) |
| 43 | + self.assertIsNone(run(b'a\n', dict(a=1), {})) |
| 44 | + self.assertIsNone(run(b'a\n', {}, dict(a=1))) |
| 45 | + self.assertIsNone(run(b'a\n', {}, UserDict(a=1))) |
| 46 | + |
| 47 | + self.assertRaises(NameError, run, b'a\n', {}) |
| 48 | + self.assertRaises(NameError, run, b'a\n', {}, {}) |
| 49 | + self.assertRaises(TypeError, run, b'a\n', dict(a=1), []) |
| 50 | + self.assertRaises(TypeError, run, b'a\n', dict(a=1), 1) |
| 51 | + |
| 52 | + self.assertIsNone(run(b'\xc3\xa4\n', {'\xe4': 1})) |
| 53 | + self.assertRaises(SyntaxError, run, b'\xe4\n', {}) |
| 54 | + |
| 55 | + # CRASHES run(b'a\n', NULL) |
| 56 | + # CRASHES run(b'a\n', NULL, {}) |
| 57 | + # CRASHES run(b'a\n', NULL, dict(a=1)) |
| 58 | + # CRASHES run(b'a\n', UserDict()) |
| 59 | + # CRASHES run(b'a\n', UserDict(), {}) |
| 60 | + # CRASHES run(b'a\n', UserDict(), dict(a=1)) |
| 61 | + |
| 62 | + # CRASHES run(NULL, {}) |
| 63 | + |
| 64 | + def test_run_fileexflags(self): |
| 65 | + # Test PyRun_FileExFlags(). |
| 66 | + filename = os.fsencode(TESTFN) |
| 67 | + with open(filename, 'wb') as fp: |
| 68 | + fp.write(b'a\n') |
| 69 | + self.addCleanup(unlink, filename) |
| 70 | + def run(*args): |
| 71 | + return _testcapi.run_fileexflags(filename, Py_file_input, *args) |
| 72 | + |
| 73 | + self.assertIsNone(run(dict(a=1))) |
| 74 | + self.assertIsNone(run(dict(a=1), {})) |
| 75 | + self.assertIsNone(run({}, dict(a=1))) |
| 76 | + self.assertIsNone(run({}, UserDict(a=1))) |
| 77 | + self.assertIsNone(run(dict(a=1), {}, 1)) # closeit = True |
| 78 | + |
| 79 | + self.assertRaises(NameError, run, {}) |
| 80 | + self.assertRaises(NameError, run, {}, {}) |
| 81 | + self.assertRaises(TypeError, run, dict(a=1), []) |
| 82 | + self.assertRaises(TypeError, run, dict(a=1), 1) |
| 83 | + |
| 84 | + # CRASHES run(NULL) |
| 85 | + # CRASHES run(NULL, {}) |
| 86 | + # CRASHES run(NULL, dict(a=1)) |
| 87 | + # CRASHES run(UserDict()) |
| 88 | + # CRASHES run(UserDict(), {}) |
| 89 | + # CRASHES run(UserDict(), dict(a=1)) |
| 90 | + |
| 91 | + @unittest.skipUnless(TESTFN_UNDECODABLE, 'only works if there are undecodable paths') |
| 92 | + def test_run_fileexflags_with_undecodable_filename(self): |
| 93 | + run = _testcapi.run_fileexflags |
| 94 | + try: |
| 95 | + with open(TESTFN_UNDECODABLE, 'wb') as fp: |
| 96 | + fp.write(b'a\n') |
| 97 | + self.addCleanup(unlink, TESTFN_UNDECODABLE) |
| 98 | + except OSError: |
| 99 | + self.skipTest('undecodable paths are not supported') |
| 100 | + self.assertIsNone(run(TESTFN_UNDECODABLE, Py_file_input, dict(a=1))) |
| 101 | + |
| 102 | + |
| 103 | +if __name__ == '__main__': |
| 104 | + unittest.main() |
0 commit comments