PATH: //proc/thread-self/root/proc/self/root/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_fileinput.py
''' Tests for fileinput module. Nick Mathewson ''' import io import os import sys import re import fileinput import collections import builtins import tempfile import unittest try: import bz2 except ImportError: bz2 = None try: import gzip except ImportError: gzip = None from io import BytesIO, StringIO from fileinput import FileInput, hook_encoded from pathlib import Path from test.support import verbose from test.support.os_helper import TESTFN from test.support.os_helper import unlink as safe_unlink from test.support import os_helper from test import support from unittest import mock # The fileinput module has 2 interfaces: the FileInput class which does # all the work, and a few functions (input, etc.) that use a global _state # variable. class BaseTests: # Write a content (str or bytes) to temp file, and return the # temp file's name. def writeTmp(self, content, *, mode='w'): # opening in text mode is the default fd, name = tempfile.mkstemp() self.addCleanup(os_helper.unlink, name) encoding = None if "b" in mode else "utf-8" with open(fd, mode, encoding=encoding) as f: f.write(content) return name class LineReader: def __init__(self): self._linesread = [] @property def linesread(self): try: return self._linesread[:] finally: self._linesread = [] def openhook(self, filename, mode): self.it = iter(filename.splitlines(True)) return self def readline(self, size=None): line = next(self.it, '') self._linesread.append(line) return line def readlines(self, hint=-1): lines = [] size = 0 while True: line = self.readline() if not line: return lines lines.append(line) size += len(line) if size >= hint: return lines def close(self): pass class BufferSizesTests(BaseTests, unittest.TestCase): def test_buffer_sizes(self): t1 = self.writeTmp(''.join("Line %s of file 1\n" % (i+1) for i in range(15))) t2 = self.writeTmp(''.join("Line %s of file 2\n" % (i+1) for i in range(10))) t3 = self.writeTmp(''.join("Line %s of file 3\n" % (i+1) for i in range(5))) t4 = self.writeTmp(''.join("Line %s of file 4\n" % (i+1) for i in range(1))) pat = re.compile(r'LINE (\d+) OF FILE (\d+)') if verbose: print('1. Simple iteration') fi = FileInput(files=(t1, t2, t3, t4), encoding="utf-8") lines = list(fi) fi.close() self.assertEqual(len(lines), 31) self.assertEqual(lines[4], 'Line 5 of file 1\n') self.assertEqual(lines[30], 'Line 1 of file 4\n') self.assertEqual(fi.lineno(), 31) self.assertEqual(fi.filename(), t4) if verbose: print('2. Status variables') fi = FileInput(files=(t1, t2, t3, t4), encoding="utf-8") s = "x" while s and s != 'Line 6 of file 2\n': s = fi.readline() self.assertEqual(fi.filename(), t2) self.assertEqual(fi.lineno(), 21) self.assertEqual(fi.filelineno(), 6) self.assertFalse(fi.isfirstline()) self.assertFalse(fi.isstdin()) if verbose: print('3. Nextfile') fi.nextfile() self.assertEqual(fi.readline(), 'Line 1 of file 3\n') self.assertEqual(fi.lineno(), 22) fi.close() if verbose: print('4. Stdin') fi = FileInput(files=(t1, t2, t3, t4, '-'), encoding="utf-8") savestdin = sys.stdin try: sys.stdin = StringIO("Line 1 of stdin\nLine 2 of stdin\n") lines = list(fi) self.assertEqual(len(lines), 33) self.assertEqual(lines[32], 'Line 2 of stdin\n') self.assertEqual(fi.filename(), '<stdin>') fi.nextfile() finally: sys.stdin = savestdin if verbose: print('5. Boundary conditions') fi = FileInput(files=(t1, t2, t3, t4), encoding="utf-8") self.assertEqual(fi.lineno(), 0) self.assertEqual(fi.filename(), None) fi.nextfile() self.assertEqual(fi.lineno(), 0) self.assertEqual(fi.filename(), None) if verbose: print('6. Inplace') savestdout = sys.stdout try: fi = FileInput(files=(t1, t2, t3, t4), inplace=1, encoding="utf-8") for line in fi: line = line[:-1].upper() print(line) fi.close() finally: sys.stdout = savestdout fi = FileInput(files=(t1, t2, t3, t4), encoding="utf-8") for line in fi: self.assertEqual(line[-1], '\n') m = pat.match(line[:-1]) self.assertNotEqual(m, None) self.assertEqual(int(m.group(1)), fi.filelineno()) fi.close() class UnconditionallyRaise: def __init__(self, exception_type): self.exception_type = exception_type self.invoked = False def __call__(self, *args, **kwargs): self.invoked = True raise self.exception_type() class FileInputTests(BaseTests, unittest.TestCase): def test_zero_byte_files(self): t1 = self.writeTmp("") t2 = self.writeTmp("") t3 = self.writeTmp("The only line there is.\n") t4 = self.writeTmp("") fi = FileInput(files=(t1, t2, t3, t4), encoding="utf-8") line = fi.readline() self.assertEqual(line, 'The only line there is.\n') self.assertEqual(fi.lineno(), 1) self.assertEqual(fi.filelineno(), 1) self.assertEqual(fi.filename(), t3) line = fi.readline() self.assertFalse(line) self.assertEqual(fi.lineno(), 1) self.assertEqual(fi.filelineno(), 0) self.assertEqual(fi.filename(), t4) fi.close() def test_files_that_dont_end_with_newline(self): t1 = self.writeTmp("A\nB\nC") t2 = self.writeTmp("D\nE\nF") fi = FileInput(files=(t1, t2), encoding="utf-8") lines = list(fi) self.assertEqual(lines, ["A\n", "B\n", "C", "D\n", "E\n", "F"]) self.assertEqual(fi.filelineno(), 3) self.assertEqual(fi.lineno(), 6) ## def test_unicode_filenames(self): ## # XXX A unicode string is always returned by writeTmp. ## # So is this needed? ## t1 = self.writeTmp("A\nB") ## encoding = sys.getfilesystemencoding() ## if encoding is None: ## encoding = 'ascii' ## fi = FileInput(files=str(t1, encoding), encoding="utf-8") ## lines = list(fi) ## self.assertEqual(lines, ["A\n", "B"]) def test_fileno(self): t1 = self.writeTmp("A\nB") t2 = self.writeTmp("C\nD") fi = FileInput(files=(t1, t2), encoding="utf-8") self.assertEqual(fi.fileno(), -1) line = next(fi) self.assertNotEqual(fi.fileno(), -1) fi.nextfile() self.assertEqual(fi.fileno(), -1) line = list(fi) self.assertEqual(fi.fileno(), -1) def test_invalid_opening_mode(self): for mode in ('w', 'rU', 'U'): with self.subTest(mode=mode): with self.assertRaises(ValueError): FileInput(mode=mode) def test_stdin_binary_mode(self): with mock.patch('sys.stdin') as m_stdin: m_stdin.buffer = BytesIO(b'spam, bacon, sausage, and spam') fi = FileInput(files=['-'], mode='rb') lines = list(fi) self.assertEqual(lines, [b'spam, bacon, sausage, and spam']) def test_detached_stdin_binary_mode(self): orig_stdin = sys.stdin try: sys.stdin = BytesIO(b'spam, bacon, sausage, and spam') self.assertFalse(hasattr(sys.stdin, 'buffer')) fi = FileInput(files=['-'], mode='rb') lines = list(fi) self.assertEqual(lines, [b'spam, bacon, sausage, and spam']) finally: sys.stdin = orig_stdin def test_file_opening_hook(self): try: # cannot use openhook and inplace mode fi = FileInput(inplace=1, openhook=lambda f, m: None) self.fail("FileInput should raise if both inplace " "and openhook arguments are given") except ValueError: pass try: fi = FileInput(openhook=1) self.fail("FileInput should check openhook for being callable") except ValueError: pass class CustomOpenHook: def __init__(self): self.invoked = False def __call__(self, *args, **kargs): self.invoked = True return open(*args, encoding="utf-8") t = self.writeTmp("\n") custom_open_hook = CustomOpenHook() with FileInput([t], openhook=custom_open_hook) as fi: fi.readline() self.assertTrue(custom_open_hook.invoked, "openhook not invoked") def test_readline(self): with open(TESTFN, 'wb') as f: f.write(b'A\nB\r\nC\r') # Fill TextIOWrapper buffer. f.write(b'123456789\n' * 1000) # Issue #20501: readline() shouldn't read whole file. f.write(b'\x80') self.addCleanup(safe_unlink, TESTFN) with FileInput(files=TESTFN, openhook=hook_encoded('ascii')) as fi: try: self.assertEqual(fi.readline(), 'A\n') self.assertEqual(fi.readline(), 'B\n') self.assertEqual(fi.readline(), 'C\n') except UnicodeDecodeError: self.fail('Read to end of file') with self.assertRaises(UnicodeDecodeError): # Read to the end of file. list(fi) self.assertEqual(fi.readline(), '') self.assertEqual(fi.readline(), '') def test_readline_binary_mode(self): with open(TESTFN, 'wb') as f: f.write(b'A\nB\r\nC\rD') self.addCleanup(safe_unlink, TESTFN) with FileInput(files=TESTFN, mode='rb') as fi: self.assertEqual(fi.readline(), b'A\n') self.assertEqual(fi.readline(), b'B\r\n') self.assertEqual(fi.readline(), b'C\rD') # Read to the end of file. self.assertEqual(fi.readline(), b'') self.assertEqual(fi.readline(), b'') def test_inplace_binary_write_mode(self): temp_file = self.writeTmp(b'Initial text.', mode='wb') with FileInput(temp_file, mode='rb', inplace=True) as fobj: line = fobj.readline() self.assertEqual(line, b'Initial text.') # print() cannot be used with files opened in binary mode. sys.stdout.write(b'New line.') with open(temp_file, 'rb') as f: self.assertEqual(f.read(), b'New line.') def test_inplace_encoding_errors(self): temp_file = self.writeTmp(b'Initial text \x88', mode='wb') with FileInput(temp_file, inplace=True, encoding="ascii", errors="replace") as fobj: line = fobj.readline() self.assertEqual(line, 'Initial text \ufffd') print("New line \x88") with open(temp_file, 'rb') as f: self.assertEqual(f.read().rstrip(b'\r\n'), b'New line ?') def test_file_hook_backward_compatibility(self): def old_hook(filename, mode): return io.StringIO("I used to receive only filename and mode") t = self.writeTmp("\n") with FileInput([t], openhook=old_hook) as fi: result = fi.readline() self.assertEqual(result, "I used to receive only filename and mode") def test_context_manager(self): t1 = self.writeTmp("A\nB\nC") t2 = self.writeTmp("D\nE\nF") with FileInput(files=(t1, t2), encoding="utf-8") as fi: lines = list(fi) self.assertEqual(lines, ["A\n", "B\n", "C", "D\n", "E\n", "F"]) self.assertEqual(fi.filelineno(), 3) self.assertEqual(fi.lineno(), 6) self.assertEqual(fi._files, ()) def test_close_on_exception(self): t1 = self.writeTmp("") try: with FileInput(files=t1, encoding="utf-8") as fi: raise OSError except OSError: self.assertEqual(fi._files, ()) def test_empty_files_list_specified_to_constructor(self): with FileInput(files=[], encoding="utf-8") as fi: self.assertEqual(fi._files, ('-',)) def test_nextfile_oserror_deleting_backup(self): """Tests invoking FileInput.nextfile() when the attempt to delete the backup file would raise OSError. This error is expected to be silently ignored""" os_unlink_orig = os.unlink os_unlink_replacement = UnconditionallyRaise(OSError) try: t = self.writeTmp("\n") self.addCleanup(safe_unlink, t + '.bak') with FileInput(files=[t], inplace=True, encoding="utf-8") as fi: next(fi) # make sure the file is opened os.unlink = os_unlink_replacement fi.nextfile() finally: os.unlink = os_unlink_orig # sanity check to make sure that our test scenario was actually hit self.assertTrue(os_unlink_replacement.invoked, "os.unlink() was not invoked") def test_readline_os_fstat_raises_OSError(self): """Tests invoking FileInput.readline() when os.fstat() raises OSError. This exception should be silently discarded.""" os_fstat_orig = os.fstat os_fstat_replacement = UnconditionallyRaise(OSError) try: t = self.writeTmp("\n") with FileInput(files=[t], inplace=True, encoding="utf-8") as fi: os.fstat = os_fstat_replacement fi.readline() finally: os.fstat = os_fstat_orig # sanity check to make sure that our test scenario was actually hit self.assertTrue(os_fstat_replacement.invoked, "os.fstat() was not invoked") def test_readline_os_chmod_raises_OSError(self): """Tests invoking FileInput.readline() when os.chmod() raises OSError. This exception should be silently discarded.""" os_chmod_orig = os.chmod os_chmod_replacement = UnconditionallyRaise(OSError) try: t = self.writeTmp("\n") with FileInput(files=[t], inplace=True, encoding="utf-8") as fi: os.chmod = os_chmod_replacement fi.readline() finally: os.chmod = os_chmod_orig # sanity check to make sure that our test scenario was actually hit self.assertTrue(os_chmod_replacement.invoked, "os.fstat() was not invoked") def test_fileno_when_ValueError_raised(self): class FilenoRaisesValueError(UnconditionallyRaise): def __init__(self): UnconditionallyRaise.__init__(self, ValueError) def fileno(self): self.__call__() unconditionally_raise_ValueError = FilenoRaisesValueError() t = self.writeTmp("\n") with FileInput(files=[t], encoding="utf-8") as fi: file_backup = fi._file try: fi._file = unconditionally_raise_ValueError result = fi.fileno() finally: fi._file = file_backup # make sure the file gets cleaned up # sanity check to make sure that our test scenario was actually hit self.assertTrue(unconditionally_raise_ValueError.invoked, "_file.fileno() was not invoked") self.assertEqual(result, -1, "fileno() should return -1") def test_readline_buffering(self): src = LineReader() with FileInput(files=['line1\nline2', 'line3\n'], openhook=src.openhook) as fi: self.assertEqual(src.linesread, []) self.assertEqual(fi.readline(), 'line1\n') self.assertEqual(src.linesread, ['line1\n']) self.assertEqual(fi.readline(), 'line2') self.assertEqual(src.linesread, ['line2']) self.assertEqual(fi.readline(), 'line3\n') self.assertEqual(src.linesread, ['', 'line3\n']) self.assertEqual(fi.readline(), '') self.assertEqual(src.linesread, ['']) self.assertEqual(fi.readline(), '') self.assertEqual(src.linesread, []) def test_iteration_buffering(self): src = LineReader() with FileInput(files=['line1\nline2', 'line3\n'], openhook=src.openhook) as fi: self.assertEqual(src.linesread, []) self.assertEqual(next(fi), 'line1\n') self.assertEqual(src.linesread, ['line1\n']) self.assertEqual(next(fi), 'line2') self.assertEqual(src.linesread, ['line2']) self.assertEqual(next(fi), 'line3\n') self.assertEqual(src.linesread, ['', 'line3\n']) self.assertRaises(StopIteration, next, fi) self.assertEqual(src.linesread, ['']) self.assertRaises(StopIteration, next, fi) self.assertEqual(src.linesread, []) def test_pathlib_file(self): t1 = Path(self.writeTmp("Pathlib file.")) with FileInput(t1, encoding="utf-8") as fi: line = fi.readline() self.assertEqual(line, 'Pathlib file.') self.assertEqual(fi.lineno(), 1) self.assertEqual(fi.filelineno(), 1) self.assertEqual(fi.filename(), os.fspath(t1)) def test_pathlib_file_inplace(self): t1 = Path(self.writeTmp('Pathlib file.')) with FileInput(t1, inplace=True, encoding="utf-8") as fi: line = fi.readline() self.assertEqual(line, 'Pathlib file.') print('Modified %s' % line) with open(t1, encoding="utf-8") as f: self.assertEqual(f.read(), 'Modified Pathlib file.\n') class MockFileInput: """A class that mocks out fileinput.FileInput for use during unit tests""" def __init__(self, files=None, inplace=False, backup="", *, mode="r", openhook=None, encoding=None, errors=None): self.files = files self.inplace = inplace self.backup = backup self.mode = mode self.openhook = openhook self.encoding = encoding self.errors = errors self._file = None self.invocation_counts = collections.defaultdict(lambda: 0) self.return_values = {} def close(self): self.invocation_counts["close"] += 1 def nextfile(self): self.invocation_counts["nextfile"] += 1 return self.return_values["nextfile"] def filename(self): self.invocation_counts["filename"] += 1 return self.return_values["filename"] def lineno(self): self.invocation_counts["lineno"] += 1 return self.return_values["lineno"] def filelineno(self): self.invocation_counts["filelineno"] += 1 return self.return_values["filelineno"] def fileno(self): self.invocation_counts["fileno"] += 1 return self.return_values["fileno"] def isfirstline(self): self.invocation_counts["isfirstline"] += 1 return self.return_values["isfirstline"] def isstdin(self): self.invocation_counts["isstdin"] += 1 return self.return_values["isstdin"] class BaseFileInputGlobalMethodsTest(unittest.TestCase): """Base class for unit tests for the global function of the fileinput module.""" def setUp(self): self._orig_state = fileinput._state self._orig_FileInput = fileinput.FileInput fileinput.FileInput = MockFileInput def tearDown(self): fileinput.FileInput = self._orig_FileInput fileinput._state = self._orig_state def assertExactlyOneInvocation(self, mock_file_input, method_name): # assert that the method with the given name was invoked once actual_count = mock_file_input.invocation_counts[method_name] self.assertEqual(actual_count, 1, method_name) # assert that no other unexpected methods were invoked actual_total_count = len(mock_file_input.invocation_counts) self.assertEqual(actual_total_count, 1) class Test_fileinput_input(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.input()""" def test_state_is_not_None_and_state_file_is_not_None(self): """Tests invoking fileinput.input() when fileinput._state is not None and its _file attribute is also not None. Expect RuntimeError to be raised with a meaningful error message and for fileinput._state to *not* be modified.""" instance = MockFileInput() instance._file = object() fileinput._state = instance with self.assertRaises(RuntimeError) as cm: fileinput.input() self.assertEqual(("input() already active",), cm.exception.args) self.assertIs(instance, fileinput._state, "fileinput._state") def test_state_is_not_None_and_state_file_is_None(self): """Tests invoking fileinput.input() when fileinput._state is not None but its _file attribute *is* None. Expect it to create and return a new fileinput.FileInput object with all method parameters passed explicitly to the __init__() method; also ensure that fileinput._state is set to the returned instance.""" instance = MockFileInput() instance._file = None fileinput._state = instance self.do_test_call_input() def test_state_is_None(self): """Tests invoking fileinput.input() when fileinput._state is None Expect it to create and return a new fileinput.FileInput object with all method parameters passed explicitly to the __init__() method; also ensure that fileinput._state is set to the returned instance.""" fileinput._state = None self.do_test_call_input() def do_test_call_input(self): """Tests that fileinput.input() creates a new fileinput.FileInput object, passing the given parameters unmodified to fileinput.FileInput.__init__(). Note that this test depends on the monkey patching of fileinput.FileInput done by setUp().""" files = object() inplace = object() backup = object() mode = object() openhook = object() encoding = object() # call fileinput.input() with different values for each argument result = fileinput.input(files=files, inplace=inplace, backup=backup, mode=mode, openhook=openhook, encoding=encoding) # ensure fileinput._state was set to the returned object self.assertIs(result, fileinput._state, "fileinput._state") # ensure the parameters to fileinput.input() were passed directly # to FileInput.__init__() self.assertIs(files, result.files, "files") self.assertIs(inplace, result.inplace, "inplace") self.assertIs(backup, result.backup, "backup") self.assertIs(mode, result.mode, "mode") self.assertIs(openhook, result.openhook, "openhook") class Test_fileinput_close(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.close()""" def test_state_is_None(self): """Tests that fileinput.close() does nothing if fileinput._state is None""" fileinput._state = None fileinput.close() self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests that fileinput.close() invokes close() on fileinput._state and sets _state=None""" instance = MockFileInput() fileinput._state = instance fileinput.close() self.assertExactlyOneInvocation(instance, "close") self.assertIsNone(fileinput._state) class Test_fileinput_nextfile(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.nextfile()""" def test_state_is_None(self): """Tests fileinput.nextfile() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.nextfile() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.nextfile() when fileinput._state is not None. Ensure that it invokes fileinput._state.nextfile() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" nextfile_retval = object() instance = MockFileInput() instance.return_values["nextfile"] = nextfile_retval fileinput._state = instance retval = fileinput.nextfile() self.assertExactlyOneInvocation(instance, "nextfile") self.assertIs(retval, nextfile_retval) self.assertIs(fileinput._state, instance) class Test_fileinput_filename(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.filename()""" def test_state_is_None(self): """Tests fileinput.filename() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.filename() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.filename() when fileinput._state is not None. Ensure that it invokes fileinput._state.filename() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" filename_retval = object() instance = MockFileInput() instance.return_values["filename"] = filename_retval fileinput._state = instance retval = fileinput.filename() self.assertExactlyOneInvocation(instance, "filename") self.assertIs(retval, filename_retval) self.assertIs(fileinput._state, instance) class Test_fileinput_lineno(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.lineno()""" def test_state_is_None(self): """Tests fileinput.lineno() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.lineno() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.lineno() when fileinput._state is not None. Ensure that it invokes fileinput._state.lineno() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" lineno_retval = object() instance = MockFileInput() instance.return_values["lineno"] = lineno_retval fileinput._state = instance retval = fileinput.lineno() self.assertExactlyOneInvocation(instance, "lineno") self.assertIs(retval, lineno_retval) self.assertIs(fileinput._state, instance) class Test_fileinput_filelineno(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.filelineno()""" def test_state_is_None(self): """Tests fileinput.filelineno() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.filelineno() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.filelineno() when fileinput._state is not None. Ensure that it invokes fileinput._state.filelineno() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" filelineno_retval = object() instance = MockFileInput() instance.return_values["filelineno"] = filelineno_retval fileinput._state = instance retval = fileinput.filelineno() self.assertExactlyOneInvocation(instance, "filelineno") self.assertIs(retval, filelineno_retval) self.assertIs(fileinput._state, instance) class Test_fileinput_fileno(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.fileno()""" def test_state_is_None(self): """Tests fileinput.fileno() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.fileno() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.fileno() when fileinput._state is not None. Ensure that it invokes fileinput._state.fileno() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" fileno_retval = object() instance = MockFileInput() instance.return_values["fileno"] = fileno_retval instance.fileno_retval = fileno_retval fileinput._state = instance retval = fileinput.fileno() self.assertExactlyOneInvocation(instance, "fileno") self.assertIs(retval, fileno_retval) self.assertIs(fileinput._state, instance) class Test_fileinput_isfirstline(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.isfirstline()""" def test_state_is_None(self): """Tests fileinput.isfirstline() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.isfirstline() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.isfirstline() when fileinput._state is not None. Ensure that it invokes fileinput._state.isfirstline() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" isfirstline_retval = object() instance = MockFileInput() instance.return_values["isfirstline"] = isfirstline_retval fileinput._state = instance retval = fileinput.isfirstline() self.assertExactlyOneInvocation(instance, "isfirstline") self.assertIs(retval, isfirstline_retval) self.assertIs(fileinput._state, instance) class Test_fileinput_isstdin(BaseFileInputGlobalMethodsTest): """Unit tests for fileinput.isstdin()""" def test_state_is_None(self): """Tests fileinput.isstdin() when fileinput._state is None. Ensure that it raises RuntimeError with a meaningful error message and does not modify fileinput._state""" fileinput._state = None with self.assertRaises(RuntimeError) as cm: fileinput.isstdin() self.assertEqual(("no active input()",), cm.exception.args) self.assertIsNone(fileinput._state) def test_state_is_not_None(self): """Tests fileinput.isstdin() when fileinput._state is not None. Ensure that it invokes fileinput._state.isstdin() exactly once, returns whatever it returns, and does not modify fileinput._state to point to a different object.""" isstdin_retval = object() instance = MockFileInput() instance.return_values["isstdin"] = isstdin_retval fileinput._state = instance retval = fileinput.isstdin() self.assertExactlyOneInvocation(instance, "isstdin") self.assertIs(retval, isstdin_retval) self.assertIs(fileinput._state, instance) class InvocationRecorder: def __init__(self): self.invocation_count = 0 def __call__(self, *args, **kwargs): self.invocation_count += 1 self.last_invocation = (args, kwargs) return io.BytesIO(b'some bytes') class Test_hook_compressed(unittest.TestCase): """Unit tests for fileinput.hook_compressed()""" def setUp(self): self.fake_open = InvocationRecorder() def test_empty_string(self): self.do_test_use_builtin_open_text("", "r") def test_no_ext(self): self.do_test_use_builtin_open_text("abcd", "r") @unittest.skipUnless(gzip, "Requires gzip and zlib") def test_gz_ext_fake(self): original_open = gzip.open gzip.open = self.fake_open try: result = fileinput.hook_compressed("test.gz", "r") finally: gzip.open = original_open self.assertEqual(self.fake_open.invocation_count, 1) self.assertEqual(self.fake_open.last_invocation, (("test.gz", "r"), {})) @unittest.skipUnless(gzip, "Requires gzip and zlib") def test_gz_with_encoding_fake(self): original_open = gzip.open gzip.open = lambda filename, mode: io.BytesIO(b'Ex-binary string') try: result = fileinput.hook_compressed("test.gz", "r", encoding="utf-8") finally: gzip.open = original_open self.assertEqual(list(result), ['Ex-binary string']) @unittest.skipUnless(bz2, "Requires bz2") def test_bz2_ext_fake(self): original_open = bz2.BZ2File bz2.BZ2File = self.fake_open try: result = fileinput.hook_compressed("test.bz2", "r") finally: bz2.BZ2File = original_open self.assertEqual(self.fake_open.invocation_count, 1) self.assertEqual(self.fake_open.last_invocation, (("test.bz2", "r"), {})) def test_blah_ext(self): self.do_test_use_builtin_open_binary("abcd.blah", "rb") def test_gz_ext_builtin(self): self.do_test_use_builtin_open_binary("abcd.Gz", "rb") def test_bz2_ext_builtin(self): self.do_test_use_builtin_open_binary("abcd.Bz2", "rb") def test_binary_mode_encoding(self): self.do_test_use_builtin_open_binary("abcd", "rb") def test_text_mode_encoding(self): self.do_test_use_builtin_open_text("abcd", "r") def do_test_use_builtin_open_binary(self, filename, mode): original_open = self.replace_builtin_open(self.fake_open) try: result = fileinput.hook_compressed(filename, mode) finally: self.replace_builtin_open(original_open) self.assertEqual(self.fake_open.invocation_count, 1) self.assertEqual(self.fake_open.last_invocation, ((filename, mode), {'encoding': None, 'errors': None})) def do_test_use_builtin_open_text(self, filename, mode): original_open = self.replace_builtin_open(self.fake_open) try: result = fileinput.hook_compressed(filename, mode) finally: self.replace_builtin_open(original_open) self.assertEqual(self.fake_open.invocation_count, 1) self.assertEqual(self.fake_open.last_invocation, ((filename, mode), {'encoding': 'locale', 'errors': None})) @staticmethod def replace_builtin_open(new_open_func): original_open = builtins.open builtins.open = new_open_func return original_open class Test_hook_encoded(unittest.TestCase): """Unit tests for fileinput.hook_encoded()""" def test(self): encoding = object() errors = object() result = fileinput.hook_encoded(encoding, errors=errors) fake_open = InvocationRecorder() original_open = builtins.open builtins.open = fake_open try: filename = object() mode = object() open_result = result(filename, mode) finally: builtins.open = original_open self.assertEqual(fake_open.invocation_count, 1) args, kwargs = fake_open.last_invocation self.assertIs(args[0], filename) self.assertIs(args[1], mode) self.assertIs(kwargs.pop('encoding'), encoding) self.assertIs(kwargs.pop('errors'), errors) self.assertFalse(kwargs) def test_errors(self): with open(TESTFN, 'wb') as f: f.write(b'\x80abc') self.addCleanup(safe_unlink, TESTFN) def check(errors, expected_lines): with FileInput(files=TESTFN, mode='r', openhook=hook_encoded('utf-8', errors=errors)) as fi: lines = list(fi) self.assertEqual(lines, expected_lines) check('ignore', ['abc']) with self.assertRaises(UnicodeDecodeError): check('strict', ['abc']) check('replace', ['\ufffdabc']) check('backslashreplace', ['\\x80abc']) def test_modes(self): with open(TESTFN, 'wb') as f: # UTF-7 is a convenient, seldom used encoding f.write(b'A\nB\r\nC\rD+IKw-') self.addCleanup(safe_unlink, TESTFN) def check(mode, expected_lines): with FileInput(files=TESTFN, mode=mode, openhook=hook_encoded('utf-7')) as fi: lines = list(fi) self.assertEqual(lines, expected_lines) check('r', ['A\n', 'B\n', 'C\n', 'D\u20ac']) with self.assertRaises(ValueError): check('rb', ['A\n', 'B\r\n', 'C\r', 'D\u20ac']) class MiscTest(unittest.TestCase): def test_all(self): support.check__all__(self, fileinput) if __name__ == "__main__": unittest.main()
SIMPAN PERUBAHAN