mirror of https://github.com/python/cpython
119 lines
4.5 KiB
Python
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()
|