PATH: //opt/alt/python311/lib64/python3.11/test
FILE_BARU
CREATE
FOLDER_BARU
MKDIR
UPLOAD_FILE
GO
[ .. KEMBALI ]
📄 Sine-1000Hz-300ms.aif
↓
X
📄 __init__.py
↓
X
📄 __main__.py
↓
X
📁 __pycache__/
X
📄 _test_atexit.py
↓
X
📄 _test_eintr.py
↓
X
📄 _test_embed_set_config.py
↓
X
📄 _test_embed_structseq.py
↓
X
📄 _test_multiprocessing.py
↓
X
📄 _test_venv_multiprocessing.py
↓
X
📄 archiver_tests.py
↓
X
📁 audiodata/
X
📄 audiotest.au
↓
X
📄 audiotests.py
↓
X
📄 audit-tests.py
↓
X
📄 autotest.py
↓
X
📄 bisect_cmd.py
↓
X
📁 certdata/
X
📁 cjkencodings/
X
📄 clinic.test.c
↓
X
📄 cmath_testcases.txt
↓
X
📁 configdata/
X
📁 crashers/
X
📄 curses_tests.py
↓
X
📁 data/
X
📄 datetimetester.py
↓
X
📁 decimaltestdata/
X
📄 dis_module.py
↓
X
📁 dtracedata/
X
📄 empty.vbs
↓
X
📁 encoded_modules/
X
📄 exception_hierarchy.txt
↓
X
📄 floating_points.txt
↓
X
📄 fork_wait.py
↓
X
📄 formatfloat_testcases.txt
↓
X
📄 ieee754.txt
↓
X
📁 imghdrdata/
X
📄 imp_dummy.py
↓
X
📁 leakers/
X
📁 libregrtest/
X
📄 list_tests.py
↓
X
📄 lock_tests.py
↓
X
📄 mailcap.txt
↓
X
📄 mapping_tests.py
↓
X
📄 math_testcases.txt
↓
X
📄 memory_watchdog.py
↓
X
📄 mime.types
↓
X
📄 mock_socket.py
↓
X
📄 mp_fork_bomb.py
↓
X
📄 mp_preload.py
↓
X
📄 multibytecodec_support.py
↓
X
📄 pickletester.py
↓
X
📄 profilee.py
↓
X
📄 pstats.pck
↓
X
📄 pyclbr_input.py
↓
X
📄 pythoninfo.py
↓
X
📄 randv2_32.pck
↓
X
📄 randv2_64.pck
↓
X
📄 randv3.pck
↓
X
📄 re_tests.py
↓
X
📄 recursion.tar
↓
X
📄 regrtest.py
↓
X
📁 regrtestdata/
X
📄 relimport.py
↓
X
📄 reperf.py
↓
X
📄 seq_tests.py
↓
X
📄 signalinterproctester.py
↓
X
📁 sndhdrdata/
X
📄 ssl_servers.py
↓
X
📄 ssltests.py
↓
X
📄 string_tests.py
↓
X
📁 subprocessdata/
X
📁 support/
X
📄 test___all__.py
↓
X
📄 test__locale.py
↓
X
📄 test__opcode.py
↓
X
📄 test__osx_support.py
↓
X
📄 test__xxsubinterpreters.py
↓
X
📄 test_abc.py
↓
X
📄 test_abstract_numbers.py
↓
X
📄 test_aifc.py
↓
X
📄 test_argparse.py
↓
X
📄 test_array.py
↓
X
📄 test_asdl_parser.py
↓
X
📄 test_ast.py
↓
X
📄 test_asyncgen.py
↓
X
📄 test_asynchat.py
↓
X
📁 test_asyncio/
X
📄 test_asyncore.py
↓
X
📄 test_atexit.py
↓
X
📄 test_audioop.py
↓
X
📄 test_audit.py
↓
X
📄 test_augassign.py
↓
X
📄 test_base64.py
↓
X
📄 test_baseexception.py
↓
X
📄 test_bdb.py
↓
X
📄 test_bigaddrspace.py
↓
X
📄 test_bigmem.py
↓
X
📄 test_binascii.py
↓
X
📄 test_binop.py
↓
X
📄 test_bisect.py
↓
X
📄 test_bool.py
↓
X
📄 test_buffer.py
↓
X
📄 test_bufio.py
↓
X
📄 test_builtin.py
↓
X
📄 test_bytes.py
↓
X
📄 test_bz2.py
↓
X
📄 test_c_locale_coercion.py
↓
X
📄 test_calendar.py
↓
X
📄 test_call.py
↓
X
📁 test_capi/
X
📄 test_cgi.py
↓
X
📄 test_cgitb.py
↓
X
📄 test_charmapcodec.py
↓
X
📄 test_check_c_globals.py
↓
X
📄 test_class.py
↓
X
📄 test_clinic.py
↓
X
📄 test_cmath.py
↓
X
📄 test_cmd.py
↓
X
📄 test_cmd_line.py
↓
X
📄 test_cmd_line_script.py
↓
X
📄 test_code.py
↓
X
📄 test_code_module.py
↓
X
📄 test_codeccallbacks.py
↓
X
📄 test_codecencodings_cn.py
↓
X
📄 test_codecencodings_hk.py
↓
X
📄 test_codecencodings_iso2022.py
↓
X
📄 test_codecencodings_jp.py
↓
X
📄 test_codecencodings_kr.py
↓
X
📄 test_codecencodings_tw.py
↓
X
📄 test_codecmaps_cn.py
↓
X
📄 test_codecmaps_hk.py
↓
X
📄 test_codecmaps_jp.py
↓
X
📄 test_codecmaps_kr.py
↓
X
📄 test_codecmaps_tw.py
↓
X
📄 test_codecs.py
↓
X
📄 test_codeop.py
↓
X
📄 test_collections.py
↓
X
📄 test_colorsys.py
↓
X
📄 test_compare.py
↓
X
📄 test_compile.py
↓
X
📄 test_compileall.py
↓
X
📄 test_complex.py
↓
X
📁 test_concurrent_futures/
X
📄 test_configparser.py
↓
X
📄 test_contains.py
↓
X
📄 test_context.py
↓
X
📄 test_contextlib.py
↓
X
📄 test_contextlib_async.py
↓
X
📄 test_copy.py
↓
X
📄 test_copyreg.py
↓
X
📄 test_coroutines.py
↓
X
📁 test_cppext/
X
📄 test_cprofile.py
↓
X
📄 test_crashers.py
↓
X
📄 test_crypt.py
↓
X
📄 test_csv.py
↓
X
📄 test_ctypes.py
↓
X
📄 test_curses.py
↓
X
📁 test_dataclasses/
X
📄 test_datetime.py
↓
X
📄 test_dbm.py
↓
X
📄 test_dbm_dumb.py
↓
X
📄 test_dbm_gnu.py
↓
X
📄 test_dbm_ndbm.py
↓
X
📄 test_decimal.py
↓
X
📄 test_decorators.py
↓
X
📄 test_defaultdict.py
↓
X
📄 test_deque.py
↓
X
📄 test_descr.py
↓
X
📄 test_descrtut.py
↓
X
📄 test_devpoll.py
↓
X
📄 test_dict.py
↓
X
📄 test_dict_version.py
↓
X
📄 test_dictcomps.py
↓
X
📄 test_dictviews.py
↓
X
📄 test_difflib.py
↓
X
📄 test_difflib_expect.html
↓
X
📄 test_dis.py
↓
X
📄 test_distutils.py
↓
X
📁 test_doctest/
X
📄 test_docxmlrpc.py
↓
X
📄 test_dtrace.py
↓
X
📄 test_dynamic.py
↓
X
📄 test_dynamicclassattribute.py
↓
X
📄 test_eintr.py
↓
X
📁 test_email/
X
📄 test_embed.py
↓
X
📄 test_ensurepip.py
↓
X
📄 test_enum.py
↓
X
📄 test_enumerate.py
↓
X
📄 test_eof.py
↓
X
📄 test_epoll.py
↓
X
📄 test_errno.py
↓
X
📄 test_except_star.py
↓
X
📄 test_exception_group.py
↓
X
📄 test_exception_hierarchy.py
↓
X
📄 test_exception_variations.py
↓
X
📄 test_exceptions.py
↓
X
📄 test_extcall.py
↓
X
📄 test_faulthandler.py
↓
X
📄 test_fcntl.py
↓
X
📄 test_file.py
↓
X
📄 test_file_eintr.py
↓
X
📄 test_filecmp.py
↓
X
📄 test_fileinput.py
↓
X
📄 test_fileio.py
↓
X
📄 test_fileutils.py
↓
X
📄 test_finalization.py
↓
X
📄 test_float.py
↓
X
📄 test_flufl.py
↓
X
📄 test_fnmatch.py
↓
X
📄 test_fork1.py
↓
X
📄 test_format.py
↓
X
📄 test_fractions.py
↓
X
📄 test_frame.py
↓
X
📄 test_frozen.py
↓
X
📄 test_fstring.py
↓
X
📄 test_ftplib.py
↓
X
📄 test_funcattrs.py
↓
X
📄 test_functools.py
↓
X
📁 test_future_stmt/
X
📄 test_gc.py
↓
X
📁 test_gdb/
X
📄 test_generator_stop.py
↓
X
📄 test_generators.py
↓
X
📄 test_genericalias.py
↓
X
📄 test_genericclass.py
↓
X
📄 test_genericpath.py
↓
X
📄 test_genexps.py
↓
X
📄 test_getopt.py
↓
X
📄 test_getpass.py
↓
X
📄 test_getpath.py
↓
X
📄 test_gettext.py
↓
X
📄 test_glob.py
↓
X
📄 test_global.py
↓
X
📄 test_grammar.py
↓
X
📄 test_graphlib.py
↓
X
📄 test_grp.py
↓
X
📄 test_gzip.py
↓
X
📄 test_hash.py
↓
X
📄 test_hashlib.py
↓
X
📄 test_heapq.py
↓
X
📄 test_hmac.py
↓
X
📄 test_html.py
↓
X
📄 test_htmlparser.py
↓
X
📄 test_http_cookiejar.py
↓
X
📄 test_http_cookies.py
↓
X
📄 test_httplib.py
↓
X
📄 test_httpservers.py
↓
X
📄 test_idle.py
↓
X
📄 test_imaplib.py
↓
X
📄 test_imghdr.py
↓
X
📄 test_imp.py
↓
X
📁 test_import/
X
📁 test_importlib/
X
📄 test_index.py
↓
X
📁 test_inspect/
X
📄 test_int.py
↓
X
📄 test_int_literal.py
↓
X
📄 test_interpreters.py
↓
X
📄 test_io.py
↓
X
📄 test_ioctl.py
↓
X
📄 test_ipaddress.py
↓
X
📄 test_isinstance.py
↓
X
📄 test_iter.py
↓
X
📄 test_iterlen.py
↓
X
📄 test_itertools.py
↓
X
📁 test_json/
X
📄 test_keyword.py
↓
X
📄 test_keywordonlyarg.py
↓
X
📄 test_kqueue.py
↓
X
📄 test_largefile.py
↓
X
📄 test_launcher.py
↓
X
📄 test_lib2to3.py
↓
X
📄 test_linecache.py
↓
X
📄 test_list.py
↓
X
📄 test_listcomps.py
↓
X
📄 test_lltrace.py
↓
X
📄 test_locale.py
↓
X
📄 test_logging.py
↓
X
📄 test_long.py
↓
X
📄 test_longexp.py
↓
X
📄 test_lzma.py
↓
X
📄 test_mailbox.py
↓
X
📄 test_mailcap.py
↓
X
📄 test_marshal.py
↓
X
📄 test_math.py
↓
X
📄 test_memoryio.py
↓
X
📄 test_memoryview.py
↓
X
📄 test_metaclass.py
↓
X
📄 test_mimetypes.py
↓
X
📄 test_minidom.py
↓
X
📄 test_mmap.py
↓
X
📁 test_module/
X
📄 test_modulefinder.py
↓
X
📄 test_msilib.py
↓
X
📄 test_multibytecodec.py
↓
X
📁 test_multiprocessing_fork/
X
📁 test_multiprocessing_forkserver/
X
📄 test_multiprocessing_main_handling.py
↓
X
📁 test_multiprocessing_spawn/
X
📄 test_named_expressions.py
↓
X
📄 test_netrc.py
↓
X
📄 test_nis.py
↓
X
📄 test_nntplib.py
↓
X
📄 test_ntpath.py
↓
X
📄 test_numeric_tower.py
↓
X
📄 test_opcache.py
↓
X
📄 test_opcodes.py
↓
X
📄 test_openpty.py
↓
X
📄 test_operator.py
↓
X
📄 test_optparse.py
↓
X
📄 test_ordered_dict.py
↓
X
📄 test_os.py
↓
X
📄 test_ossaudiodev.py
↓
X
📄 test_osx_env.py
↓
X
📄 test_pathlib.py
↓
X
📄 test_patma.py
↓
X
📄 test_pdb.py
↓
X
📄 test_peepholer.py
↓
X
📁 test_peg_generator/
X
📄 test_pep646_syntax.py
↓
X
📄 test_pickle.py
↓
X
📄 test_picklebuffer.py
↓
X
📄 test_pickletools.py
↓
X
📄 test_pipes.py
↓
X
📄 test_pkg.py
↓
X
📄 test_pkgutil.py
↓
X
📄 test_platform.py
↓
X
📄 test_plistlib.py
↓
X
📄 test_poll.py
↓
X
📄 test_popen.py
↓
X
📄 test_poplib.py
↓
X
📄 test_positional_only_arg.py
↓
X
📄 test_posix.py
↓
X
📄 test_posixpath.py
↓
X
📄 test_pow.py
↓
X
📄 test_pprint.py
↓
X
📄 test_print.py
↓
X
📄 test_profile.py
↓
X
📄 test_property.py
↓
X
📄 test_pstats.py
↓
X
📄 test_pty.py
↓
X
📄 test_pulldom.py
↓
X
📄 test_pwd.py
↓
X
📄 test_py_compile.py
↓
X
📄 test_pyclbr.py
↓
X
📁 test_pydoc/
X
📄 test_pyexpat.py
↓
X
📄 test_queue.py
↓
X
📄 test_quopri.py
↓
X
📄 test_raise.py
↓
X
📄 test_random.py
↓
X
📄 test_range.py
↓
X
📄 test_re.py
↓
X
📄 test_readline.py
↓
X
📄 test_regrtest.py
↓
X
📄 test_repl.py
↓
X
📄 test_reprlib.py
↓
X
📄 test_resource.py
↓
X
📄 test_richcmp.py
↓
X
📄 test_rlcompleter.py
↓
X
📄 test_robotparser.py
↓
X
📄 test_runpy.py
↓
X
📄 test_sax.py
↓
X
📄 test_sched.py
↓
X
📄 test_scope.py
↓
X
📄 test_script_helper.py
↓
X
📄 test_secrets.py
↓
X
📄 test_select.py
↓
X
📄 test_selectors.py
↓
X
📄 test_set.py
↓
X
📄 test_setcomps.py
↓
X
📄 test_shelve.py
↓
X
📄 test_shlex.py
↓
X
📄 test_shutil.py
↓
X
📄 test_signal.py
↓
X
📄 test_site.py
↓
X
📄 test_slice.py
↓
X
📄 test_smtpd.py
↓
X
📄 test_smtplib.py
↓
X
📄 test_smtpnet.py
↓
X
📄 test_sndhdr.py
↓
X
📄 test_socket.py
↓
X
📄 test_socketserver.py
↓
X
📄 test_sort.py
↓
X
📄 test_source_encoding.py
↓
X
📄 test_spwd.py
↓
X
📁 test_sqlite3/
X
📄 test_ssl.py
↓
X
📄 test_stable_abi_ctypes.py
↓
X
📄 test_startfile.py
↓
X
📄 test_stat.py
↓
X
📄 test_statistics.py
↓
X
📄 test_strftime.py
↓
X
📄 test_string.py
↓
X
📄 test_string_literals.py
↓
X
📄 test_stringprep.py
↓
X
📄 test_strptime.py
↓
X
📄 test_strtod.py
↓
X
📄 test_struct.py
↓
X
📄 test_structseq.py
↓
X
📄 test_subclassinit.py
↓
X
📄 test_subprocess.py
↓
X
📄 test_sunau.py
↓
X
📄 test_sundry.py
↓
X
📄 test_super.py
↓
X
📄 test_support.py
↓
X
📄 test_symtable.py
↓
X
📄 test_syntax.py
↓
X
📄 test_sys.py
↓
X
📄 test_sys_setprofile.py
↓
X
📄 test_sys_settrace.py
↓
X
📄 test_sysconfig.py
↓
X
📄 test_syslog.py
↓
X
📄 test_tabnanny.py
↓
X
📄 test_tarfile.py
↓
X
📄 test_tcl.py
↓
X
📄 test_telnetlib.py
↓
X
📄 test_tempfile.py
↓
X
📄 test_termios.py
↓
X
📄 test_textwrap.py
↓
X
📄 test_thread.py
↓
X
📄 test_threadedtempfile.py
↓
X
📄 test_threading.py
↓
X
📄 test_threading_local.py
↓
X
📄 test_threadsignals.py
↓
X
📄 test_time.py
↓
X
📄 test_timeit.py
↓
X
📄 test_timeout.py
↓
X
📄 test_tix.py
↓
X
📄 test_tk.py
↓
X
📄 test_tokenize.py
↓
X
📁 test_tomllib/
X
📁 test_tools/
X
📄 test_trace.py
↓
X
📄 test_traceback.py
↓
X
📄 test_tracemalloc.py
↓
X
📄 test_ttk_guionly.py
↓
X
📄 test_ttk_textonly.py
↓
X
📄 test_tty.py
↓
X
📄 test_tuple.py
↓
X
📄 test_turtle.py
↓
X
📄 test_type_annotations.py
↓
X
📄 test_type_cache.py
↓
X
📄 test_type_comments.py
↓
X
📄 test_typechecks.py
↓
X
📄 test_types.py
↓
X
📄 test_typing.py
↓
X
📄 test_ucn.py
↓
X
📄 test_unary.py
↓
X
📄 test_unicode.py
↓
X
📄 test_unicode_file.py
↓
X
📄 test_unicode_file_functions.py
↓
X
📄 test_unicode_identifiers.py
↓
X
📄 test_unicodedata.py
↓
X
📄 test_unittest.py
↓
X
📄 test_univnewlines.py
↓
X
📄 test_unpack.py
↓
X
📄 test_unpack_ex.py
↓
X
📄 test_unparse.py
↓
X
📄 test_urllib.py
↓
X
📄 test_urllib2.py
↓
X
📄 test_urllib2_localnet.py
↓
X
📄 test_urllib2net.py
↓
X
📄 test_urllib_response.py
↓
X
📄 test_urllibnet.py
↓
X
📄 test_urlparse.py
↓
X
📄 test_userdict.py
↓
X
📄 test_userlist.py
↓
X
📄 test_userstring.py
↓
X
📄 test_utf8_mode.py
↓
X
📄 test_utf8source.py
↓
X
📄 test_uu.py
↓
X
📄 test_uuid.py
↓
X
📄 test_venv.py
↓
X
📄 test_wait3.py
↓
X
📄 test_wait4.py
↓
X
📁 test_warnings/
X
📄 test_wave.py
↓
X
📄 test_weakref.py
↓
X
📄 test_weakset.py
↓
X
📄 test_webbrowser.py
↓
X
📄 test_winconsoleio.py
↓
X
📄 test_winreg.py
↓
X
📄 test_winsound.py
↓
X
📄 test_with.py
↓
X
📄 test_wsgiref.py
↓
X
📄 test_xdrlib.py
↓
X
📄 test_xml_dom_minicompat.py
↓
X
📄 test_xml_etree.py
↓
X
📄 test_xml_etree_c.py
↓
X
📄 test_xmlrpc.py
↓
X
📄 test_xmlrpc_net.py
↓
X
📄 test_xxlimited.py
↓
X
📄 test_xxtestfuzz.py
↓
X
📄 test_yield_from.py
↓
X
📄 test_zipapp.py
↓
X
📄 test_zipfile.py
↓
X
📄 test_zipfile64.py
↓
X
📄 test_zipimport.py
↓
X
📄 test_zipimport_support.py
↓
X
📄 test_zlib.py
↓
X
📁 test_zoneinfo/
X
📄 testcodec.py
↓
X
📄 testtar.tar
↓
X
📄 testtar.tar.xz
↓
X
📄 tf_inherit_check.py
↓
X
📄 time_hashlib.py
↓
X
📁 tokenizedata/
X
📁 tracedmodules/
X
📁 typinganndata/
X
📄 win_console_handler.py
↓
X
📁 xmltestdata/
X
📄 xmltests.py
↓
X
📄 zip_cp437_header.zip
↓
X
📄 zipdir.zip
↓
X
📄 zipdir_backslash.zip
↓
X
📁 ziptestdata/
X
SAVING...
BERHASIL DIUBAH!
EDITING: test_with.py
"""Unit tests for the with statement specified in PEP 343.""" __author__ = "Mike Bland" __email__ = "mbland at acm dot org" import sys import unittest from collections import deque from contextlib import _GeneratorContextManager, contextmanager, nullcontext class MockContextManager(_GeneratorContextManager): def __init__(self, *args): super().__init__(*args) self.enter_called = False self.exit_called = False self.exit_args = None def __enter__(self): self.enter_called = True return _GeneratorContextManager.__enter__(self) def __exit__(self, type, value, traceback): self.exit_called = True self.exit_args = (type, value, traceback) return _GeneratorContextManager.__exit__(self, type, value, traceback) def mock_contextmanager(func): def helper(*args, **kwds): return MockContextManager(func, args, kwds) return helper class MockResource(object): def __init__(self): self.yielded = False self.stopped = False @mock_contextmanager def mock_contextmanager_generator(): mock = MockResource() try: mock.yielded = True yield mock finally: mock.stopped = True class Nested(object): def __init__(self, *managers): self.managers = managers self.entered = None def __enter__(self): if self.entered is not None: raise RuntimeError("Context is not reentrant") self.entered = deque() vars = [] try: for mgr in self.managers: vars.append(mgr.__enter__()) self.entered.appendleft(mgr) except: if not self.__exit__(*sys.exc_info()): raise return vars def __exit__(self, *exc_info): # Behave like nested with statements # first in, last out # New exceptions override old ones ex = exc_info for mgr in self.entered: try: if mgr.__exit__(*ex): ex = (None, None, None) except: ex = sys.exc_info() self.entered = None if ex is not exc_info: raise ex[0](ex[1]).with_traceback(ex[2]) class MockNested(Nested): def __init__(self, *managers): Nested.__init__(self, *managers) self.enter_called = False self.exit_called = False self.exit_args = None def __enter__(self): self.enter_called = True return Nested.__enter__(self) def __exit__(self, *exc_info): self.exit_called = True self.exit_args = exc_info return Nested.__exit__(self, *exc_info) class FailureTestCase(unittest.TestCase): def testNameError(self): def fooNotDeclared(): with foo: pass self.assertRaises(NameError, fooNotDeclared) def testEnterAttributeError1(self): class LacksEnter(object): def __exit__(self, type, value, traceback): pass def fooLacksEnter(): foo = LacksEnter() with foo: pass self.assertRaisesRegex(TypeError, 'the context manager', fooLacksEnter) def testEnterAttributeError2(self): class LacksEnterAndExit(object): pass def fooLacksEnterAndExit(): foo = LacksEnterAndExit() with foo: pass self.assertRaisesRegex(TypeError, 'the context manager', fooLacksEnterAndExit) def testExitAttributeError(self): class LacksExit(object): def __enter__(self): pass def fooLacksExit(): foo = LacksExit() with foo: pass self.assertRaisesRegex(TypeError, 'the context manager.*__exit__', fooLacksExit) def assertRaisesSyntaxError(self, codestr): def shouldRaiseSyntaxError(s): compile(s, '', 'single') self.assertRaises(SyntaxError, shouldRaiseSyntaxError, codestr) def testAssignmentToNoneError(self): self.assertRaisesSyntaxError('with mock as None:\n pass') self.assertRaisesSyntaxError( 'with mock as (None):\n' ' pass') def testAssignmentToTupleOnlyContainingNoneError(self): self.assertRaisesSyntaxError('with mock as None,:\n pass') self.assertRaisesSyntaxError( 'with mock as (None,):\n' ' pass') def testAssignmentToTupleContainingNoneError(self): self.assertRaisesSyntaxError( 'with mock as (foo, None, bar):\n' ' pass') def testEnterThrows(self): class EnterThrows(object): def __enter__(self): raise RuntimeError("Enter threw") def __exit__(self, *args): pass def shouldThrow(): ct = EnterThrows() self.foo = None with ct as self.foo: pass self.assertRaises(RuntimeError, shouldThrow) self.assertEqual(self.foo, None) def testExitThrows(self): class ExitThrows(object): def __enter__(self): return def __exit__(self, *args): raise RuntimeError(42) def shouldThrow(): with ExitThrows(): pass self.assertRaises(RuntimeError, shouldThrow) class ContextmanagerAssertionMixin(object): def setUp(self): self.TEST_EXCEPTION = RuntimeError("test exception") def assertInWithManagerInvariants(self, mock_manager): self.assertTrue(mock_manager.enter_called) self.assertFalse(mock_manager.exit_called) self.assertEqual(mock_manager.exit_args, None) def assertAfterWithManagerInvariants(self, mock_manager, exit_args): self.assertTrue(mock_manager.enter_called) self.assertTrue(mock_manager.exit_called) self.assertEqual(mock_manager.exit_args, exit_args) def assertAfterWithManagerInvariantsNoError(self, mock_manager): self.assertAfterWithManagerInvariants(mock_manager, (None, None, None)) def assertInWithGeneratorInvariants(self, mock_generator): self.assertTrue(mock_generator.yielded) self.assertFalse(mock_generator.stopped) def assertAfterWithGeneratorInvariantsNoError(self, mock_generator): self.assertTrue(mock_generator.yielded) self.assertTrue(mock_generator.stopped) def raiseTestException(self): raise self.TEST_EXCEPTION def assertAfterWithManagerInvariantsWithError(self, mock_manager, exc_type=None): self.assertTrue(mock_manager.enter_called) self.assertTrue(mock_manager.exit_called) if exc_type is None: self.assertEqual(mock_manager.exit_args[1], self.TEST_EXCEPTION) exc_type = type(self.TEST_EXCEPTION) self.assertEqual(mock_manager.exit_args[0], exc_type) # Test the __exit__ arguments. Issue #7853 self.assertIsInstance(mock_manager.exit_args[1], exc_type) self.assertIsNot(mock_manager.exit_args[2], None) def assertAfterWithGeneratorInvariantsWithError(self, mock_generator): self.assertTrue(mock_generator.yielded) self.assertTrue(mock_generator.stopped) class NonexceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin): def testInlineGeneratorSyntax(self): with mock_contextmanager_generator(): pass def testUnboundGenerator(self): mock = mock_contextmanager_generator() with mock: pass self.assertAfterWithManagerInvariantsNoError(mock) def testInlineGeneratorBoundSyntax(self): with mock_contextmanager_generator() as foo: self.assertInWithGeneratorInvariants(foo) # FIXME: In the future, we'll try to keep the bound names from leaking self.assertAfterWithGeneratorInvariantsNoError(foo) def testInlineGeneratorBoundToExistingVariable(self): foo = None with mock_contextmanager_generator() as foo: self.assertInWithGeneratorInvariants(foo) self.assertAfterWithGeneratorInvariantsNoError(foo) def testInlineGeneratorBoundToDottedVariable(self): with mock_contextmanager_generator() as self.foo: self.assertInWithGeneratorInvariants(self.foo) self.assertAfterWithGeneratorInvariantsNoError(self.foo) def testBoundGenerator(self): mock = mock_contextmanager_generator() with mock as foo: self.assertInWithGeneratorInvariants(foo) self.assertInWithManagerInvariants(mock) self.assertAfterWithGeneratorInvariantsNoError(foo) self.assertAfterWithManagerInvariantsNoError(mock) def testNestedSingleStatements(self): mock_a = mock_contextmanager_generator() with mock_a as foo: mock_b = mock_contextmanager_generator() with mock_b as bar: self.assertInWithManagerInvariants(mock_a) self.assertInWithManagerInvariants(mock_b) self.assertInWithGeneratorInvariants(foo) self.assertInWithGeneratorInvariants(bar) self.assertAfterWithManagerInvariantsNoError(mock_b) self.assertAfterWithGeneratorInvariantsNoError(bar) self.assertInWithManagerInvariants(mock_a) self.assertInWithGeneratorInvariants(foo) self.assertAfterWithManagerInvariantsNoError(mock_a) self.assertAfterWithGeneratorInvariantsNoError(foo) class NestedNonexceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin): def testSingleArgInlineGeneratorSyntax(self): with Nested(mock_contextmanager_generator()): pass def testSingleArgBoundToNonTuple(self): m = mock_contextmanager_generator() # This will bind all the arguments to nested() into a single list # assigned to foo. with Nested(m) as foo: self.assertInWithManagerInvariants(m) self.assertAfterWithManagerInvariantsNoError(m) def testSingleArgBoundToSingleElementParenthesizedList(self): m = mock_contextmanager_generator() # This will bind all the arguments to nested() into a single list # assigned to foo. with Nested(m) as (foo): self.assertInWithManagerInvariants(m) self.assertAfterWithManagerInvariantsNoError(m) def testSingleArgBoundToMultipleElementTupleError(self): def shouldThrowValueError(): with Nested(mock_contextmanager_generator()) as (foo, bar): pass self.assertRaises(ValueError, shouldThrowValueError) def testSingleArgUnbound(self): mock_contextmanager = mock_contextmanager_generator() mock_nested = MockNested(mock_contextmanager) with mock_nested: self.assertInWithManagerInvariants(mock_contextmanager) self.assertInWithManagerInvariants(mock_nested) self.assertAfterWithManagerInvariantsNoError(mock_contextmanager) self.assertAfterWithManagerInvariantsNoError(mock_nested) def testMultipleArgUnbound(self): m = mock_contextmanager_generator() n = mock_contextmanager_generator() o = mock_contextmanager_generator() mock_nested = MockNested(m, n, o) with mock_nested: self.assertInWithManagerInvariants(m) self.assertInWithManagerInvariants(n) self.assertInWithManagerInvariants(o) self.assertInWithManagerInvariants(mock_nested) self.assertAfterWithManagerInvariantsNoError(m) self.assertAfterWithManagerInvariantsNoError(n) self.assertAfterWithManagerInvariantsNoError(o) self.assertAfterWithManagerInvariantsNoError(mock_nested) def testMultipleArgBound(self): mock_nested = MockNested(mock_contextmanager_generator(), mock_contextmanager_generator(), mock_contextmanager_generator()) with mock_nested as (m, n, o): self.assertInWithGeneratorInvariants(m) self.assertInWithGeneratorInvariants(n) self.assertInWithGeneratorInvariants(o) self.assertInWithManagerInvariants(mock_nested) self.assertAfterWithGeneratorInvariantsNoError(m) self.assertAfterWithGeneratorInvariantsNoError(n) self.assertAfterWithGeneratorInvariantsNoError(o) self.assertAfterWithManagerInvariantsNoError(mock_nested) class ExceptionalTestCase(ContextmanagerAssertionMixin, unittest.TestCase): def testSingleResource(self): cm = mock_contextmanager_generator() def shouldThrow(): with cm as self.resource: self.assertInWithManagerInvariants(cm) self.assertInWithGeneratorInvariants(self.resource) self.raiseTestException() self.assertRaises(RuntimeError, shouldThrow) self.assertAfterWithManagerInvariantsWithError(cm) self.assertAfterWithGeneratorInvariantsWithError(self.resource) def testExceptionNormalized(self): cm = mock_contextmanager_generator() def shouldThrow(): with cm as self.resource: # Note this relies on the fact that 1 // 0 produces an exception # that is not normalized immediately. 1 // 0 self.assertRaises(ZeroDivisionError, shouldThrow) self.assertAfterWithManagerInvariantsWithError(cm, ZeroDivisionError) def testNestedSingleStatements(self): mock_a = mock_contextmanager_generator() mock_b = mock_contextmanager_generator() def shouldThrow(): with mock_a as self.foo: with mock_b as self.bar: self.assertInWithManagerInvariants(mock_a) self.assertInWithManagerInvariants(mock_b) self.assertInWithGeneratorInvariants(self.foo) self.assertInWithGeneratorInvariants(self.bar) self.raiseTestException() self.assertRaises(RuntimeError, shouldThrow) self.assertAfterWithManagerInvariantsWithError(mock_a) self.assertAfterWithManagerInvariantsWithError(mock_b) self.assertAfterWithGeneratorInvariantsWithError(self.foo) self.assertAfterWithGeneratorInvariantsWithError(self.bar) def testMultipleResourcesInSingleStatement(self): cm_a = mock_contextmanager_generator() cm_b = mock_contextmanager_generator() mock_nested = MockNested(cm_a, cm_b) def shouldThrow(): with mock_nested as (self.resource_a, self.resource_b): self.assertInWithManagerInvariants(cm_a) self.assertInWithManagerInvariants(cm_b) self.assertInWithManagerInvariants(mock_nested) self.assertInWithGeneratorInvariants(self.resource_a) self.assertInWithGeneratorInvariants(self.resource_b) self.raiseTestException() self.assertRaises(RuntimeError, shouldThrow) self.assertAfterWithManagerInvariantsWithError(cm_a) self.assertAfterWithManagerInvariantsWithError(cm_b) self.assertAfterWithManagerInvariantsWithError(mock_nested) self.assertAfterWithGeneratorInvariantsWithError(self.resource_a) self.assertAfterWithGeneratorInvariantsWithError(self.resource_b) def testNestedExceptionBeforeInnerStatement(self): mock_a = mock_contextmanager_generator() mock_b = mock_contextmanager_generator() self.bar = None def shouldThrow(): with mock_a as self.foo: self.assertInWithManagerInvariants(mock_a) self.assertInWithGeneratorInvariants(self.foo) self.raiseTestException() with mock_b as self.bar: pass self.assertRaises(RuntimeError, shouldThrow) self.assertAfterWithManagerInvariantsWithError(mock_a) self.assertAfterWithGeneratorInvariantsWithError(self.foo) # The inner statement stuff should never have been touched self.assertEqual(self.bar, None) self.assertFalse(mock_b.enter_called) self.assertFalse(mock_b.exit_called) self.assertEqual(mock_b.exit_args, None) def testNestedExceptionAfterInnerStatement(self): mock_a = mock_contextmanager_generator() mock_b = mock_contextmanager_generator() def shouldThrow(): with mock_a as self.foo: with mock_b as self.bar: self.assertInWithManagerInvariants(mock_a) self.assertInWithManagerInvariants(mock_b) self.assertInWithGeneratorInvariants(self.foo) self.assertInWithGeneratorInvariants(self.bar) self.raiseTestException() self.assertRaises(RuntimeError, shouldThrow) self.assertAfterWithManagerInvariantsWithError(mock_a) self.assertAfterWithManagerInvariantsNoError(mock_b) self.assertAfterWithGeneratorInvariantsWithError(self.foo) self.assertAfterWithGeneratorInvariantsNoError(self.bar) def testRaisedStopIteration1(self): # From bug 1462485 @contextmanager def cm(): yield def shouldThrow(): with cm(): raise StopIteration("from with") with self.assertRaisesRegex(StopIteration, 'from with'): shouldThrow() def testRaisedStopIteration2(self): # From bug 1462485 class cm(object): def __enter__(self): pass def __exit__(self, type, value, traceback): pass def shouldThrow(): with cm(): raise StopIteration("from with") with self.assertRaisesRegex(StopIteration, 'from with'): shouldThrow() def testRaisedStopIteration3(self): # Another variant where the exception hasn't been instantiated # From bug 1705170 @contextmanager def cm(): yield def shouldThrow(): with cm(): raise next(iter([])) with self.assertRaises(StopIteration): shouldThrow() def testRaisedGeneratorExit1(self): # From bug 1462485 @contextmanager def cm(): yield def shouldThrow(): with cm(): raise GeneratorExit("from with") self.assertRaises(GeneratorExit, shouldThrow) def testRaisedGeneratorExit2(self): # From bug 1462485 class cm (object): def __enter__(self): pass def __exit__(self, type, value, traceback): pass def shouldThrow(): with cm(): raise GeneratorExit("from with") self.assertRaises(GeneratorExit, shouldThrow) def testErrorsInBool(self): # issue4589: __exit__ return code may raise an exception # when looking at its truth value. class cm(object): def __init__(self, bool_conversion): class Bool: def __bool__(self): return bool_conversion() self.exit_result = Bool() def __enter__(self): return 3 def __exit__(self, a, b, c): return self.exit_result def trueAsBool(): with cm(lambda: True): self.fail("Should NOT see this") trueAsBool() def falseAsBool(): with cm(lambda: False): self.fail("Should raise") self.assertRaises(AssertionError, falseAsBool) def failAsBool(): with cm(lambda: 1//0): self.fail("Should NOT see this") self.assertRaises(ZeroDivisionError, failAsBool) class NonLocalFlowControlTestCase(unittest.TestCase): def testWithBreak(self): counter = 0 while True: counter += 1 with mock_contextmanager_generator(): counter += 10 break counter += 100 # Not reached self.assertEqual(counter, 11) def testWithContinue(self): counter = 0 while True: counter += 1 if counter > 2: break with mock_contextmanager_generator(): counter += 10 continue counter += 100 # Not reached self.assertEqual(counter, 12) def testWithReturn(self): def foo(): counter = 0 while True: counter += 1 with mock_contextmanager_generator(): counter += 10 return counter counter += 100 # Not reached self.assertEqual(foo(), 11) def testWithYield(self): def gen(): with mock_contextmanager_generator(): yield 12 yield 13 x = list(gen()) self.assertEqual(x, [12, 13]) def testWithRaise(self): counter = 0 try: counter += 1 with mock_contextmanager_generator(): counter += 10 raise RuntimeError counter += 100 # Not reached except RuntimeError: self.assertEqual(counter, 11) else: self.fail("Didn't raise RuntimeError") class AssignmentTargetTestCase(unittest.TestCase): def testSingleComplexTarget(self): targets = {1: [0, 1, 2]} with mock_contextmanager_generator() as targets[1][0]: self.assertEqual(list(targets.keys()), [1]) self.assertEqual(targets[1][0].__class__, MockResource) with mock_contextmanager_generator() as list(targets.values())[0][1]: self.assertEqual(list(targets.keys()), [1]) self.assertEqual(targets[1][1].__class__, MockResource) with mock_contextmanager_generator() as targets[2]: keys = list(targets.keys()) keys.sort() self.assertEqual(keys, [1, 2]) class C: pass blah = C() with mock_contextmanager_generator() as blah.foo: self.assertEqual(hasattr(blah, "foo"), True) def testMultipleComplexTargets(self): class C: def __enter__(self): return 1, 2, 3 def __exit__(self, t, v, tb): pass targets = {1: [0, 1, 2]} with C() as (targets[1][0], targets[1][1], targets[1][2]): self.assertEqual(targets, {1: [1, 2, 3]}) with C() as (list(targets.values())[0][2], list(targets.values())[0][1], list(targets.values())[0][0]): self.assertEqual(targets, {1: [3, 2, 1]}) with C() as (targets[1], targets[2], targets[3]): self.assertEqual(targets, {1: 1, 2: 2, 3: 3}) class B: pass blah = B() with C() as (blah.one, blah.two, blah.three): self.assertEqual(blah.one, 1) self.assertEqual(blah.two, 2) self.assertEqual(blah.three, 3) def testWithExtendedTargets(self): with nullcontext(range(1, 5)) as (a, *b, c): self.assertEqual(a, 1) self.assertEqual(b, [2, 3]) self.assertEqual(c, 4) class ExitSwallowsExceptionTestCase(unittest.TestCase): def testExitTrueSwallowsException(self): class AfricanSwallow: def __enter__(self): pass def __exit__(self, t, v, tb): return True try: with AfricanSwallow(): 1/0 except ZeroDivisionError: self.fail("ZeroDivisionError should have been swallowed") def testExitFalseDoesntSwallowException(self): class EuropeanSwallow: def __enter__(self): pass def __exit__(self, t, v, tb): return False try: with EuropeanSwallow(): 1/0 except ZeroDivisionError: pass else: self.fail("ZeroDivisionError should have been raised") class NestedWith(unittest.TestCase): class Dummy(object): def __init__(self, value=None, gobble=False): if value is None: value = self self.value = value self.gobble = gobble self.enter_called = False self.exit_called = False def __enter__(self): self.enter_called = True return self.value def __exit__(self, *exc_info): self.exit_called = True self.exc_info = exc_info if self.gobble: return True class InitRaises(object): def __init__(self): raise RuntimeError() class EnterRaises(object): def __enter__(self): raise RuntimeError() def __exit__(self, *exc_info): pass class ExitRaises(object): def __enter__(self): pass def __exit__(self, *exc_info): raise RuntimeError() def testNoExceptions(self): with self.Dummy() as a, self.Dummy() as b: self.assertTrue(a.enter_called) self.assertTrue(b.enter_called) self.assertTrue(a.exit_called) self.assertTrue(b.exit_called) def testExceptionInExprList(self): try: with self.Dummy() as a, self.InitRaises(): pass except: pass self.assertTrue(a.enter_called) self.assertTrue(a.exit_called) def testExceptionInEnter(self): try: with self.Dummy() as a, self.EnterRaises(): self.fail('body of bad with executed') except RuntimeError: pass else: self.fail('RuntimeError not reraised') self.assertTrue(a.enter_called) self.assertTrue(a.exit_called) def testExceptionInExit(self): body_executed = False with self.Dummy(gobble=True) as a, self.ExitRaises(): body_executed = True self.assertTrue(a.enter_called) self.assertTrue(a.exit_called) self.assertTrue(body_executed) self.assertNotEqual(a.exc_info[0], None) def testEnterReturnsTuple(self): with self.Dummy(value=(1,2)) as (a1, a2), \ self.Dummy(value=(10, 20)) as (b1, b2): self.assertEqual(1, a1) self.assertEqual(2, a2) self.assertEqual(10, b1) self.assertEqual(20, b2) if __name__ == '__main__': unittest.main()
SIMPAN PERUBAHAN