| import os |
| import unittest |
| from collections import UserDict |
| from test.support import import_helper |
| from test.support.os_helper import unlink, TESTFN, TESTFN_ASCII, TESTFN_UNDECODABLE |
| |
| 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 |
| |
| |
| class DictSubclass(dict): |
| pass |
| |
| |
| 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(). |
| # XXX: fopen() uses different path encoding than Python on Windows. |
| 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) |
| |
| 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()) |
| |
| self.assertIsNone(run(b'\xc3\xa4\n', {'\xe4': 1})) |
| self.assertRaises(SyntaxError, run, b'\xe4\n', {}) |
| |
| 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)) |
| |
| # CRASHES run(NULL, {}) |
| |
| def test_run_fileexflags(self): |
| # Test PyRun_FileExFlags(). |
| filename = os.fsencode(TESTFN if os.name != 'nt' else TESTFN_ASCII) |
| 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) |
| |
| 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)) |
| |
| @unittest.skipUnless(TESTFN_UNDECODABLE, 'only works if there are undecodable paths') |
| @unittest.skipIf(os.name == 'nt', 'does not work on Windows') |
| 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() |