cpython/Lib/test/test_capi/test_run.py

119 lines
4.5 KiB
Python

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()