import io import os import sys import pytest import progressbar from progressbar import terminal def test_nowrap() -> None: # Make sure we definitely unwrap for _i in range(5): progressbar.streams.unwrap(stderr=True, stdout=True) stdout = sys.stdout stderr = sys.stderr progressbar.streams.wrap() assert stdout == sys.stdout assert stderr == sys.stderr progressbar.streams.unwrap() assert stdout == sys.stdout assert stderr == sys.stderr # Make sure we definitely unwrap for _i in range(5): progressbar.streams.unwrap(stderr=True, stdout=True) def test_wrap() -> None: # Make sure we definitely unwrap for _i in range(5): progressbar.streams.unwrap(stderr=True, stdout=True) stdout = sys.stdout stderr = sys.stderr progressbar.streams.wrap(stderr=True, stdout=True) assert stdout != sys.stdout assert stderr != sys.stderr # Wrap again stdout = sys.stdout stderr = sys.stderr progressbar.streams.wrap(stderr=True, stdout=True) assert stdout == sys.stdout assert stderr == sys.stderr # Make sure we definitely unwrap for _i in range(5): progressbar.streams.unwrap(stderr=True, stdout=True) def test_excepthook() -> None: progressbar.streams.wrap(stderr=True, stdout=True) try: raise RuntimeError() # noqa: TRY301 except RuntimeError: progressbar.streams.excepthook(*sys.exc_info()) progressbar.streams.unwrap_excepthook() progressbar.streams.unwrap_excepthook() def test_fd_as_io_stream() -> None: stream = io.StringIO() with progressbar.ProgressBar(fd=stream) as pb: for i in range(101): pb.update(i) stream.close() def test_no_newlines() -> None: kwargs = dict( redirect_stderr=True, redirect_stdout=True, line_breaks=False, is_terminal=True, ) with progressbar.ProgressBar(**kwargs) as bar: for i in range(5): bar.update(i) for i in range(5, 10): try: print('\n\n', file=progressbar.streams.stdout) print('\n\n', file=progressbar.streams.stderr) except ValueError: pass bar.update(i) @pytest.mark.parametrize('stream', [sys.__stdout__, sys.__stderr__]) @pytest.mark.skipif(os.name == 'nt', reason='Windows does not support this') def test_fd_as_standard_streams(stream) -> None: with progressbar.ProgressBar(fd=stream) as pb: for i in range(101): pb.update(i) def test_line_offset_stream_wrapper() -> None: stream = terminal.LineOffsetStreamWrapper(5, io.StringIO()) stream.write('Hello World!') def test_last_line_stream_methods() -> None: stream = terminal.LastLineStream(io.StringIO()) # Test write method stream.write('Hello World!') assert stream.read() == 'Hello World!' assert stream.read(5) == 'Hello' # Test flush method stream.flush() assert stream.line == 'Hello World!' assert stream.readline() == 'Hello World!' assert stream.readline(5) == 'Hello' # Test truncate method stream.truncate(5) assert stream.line == 'Hello' stream.truncate() assert stream.line == '' # Test seekable/readable assert not stream.seekable() assert stream.readable() stream.writelines(['a', 'b', 'c']) assert stream.read() == 'c' assert list(stream) == ['c'] with stream: stream.write('Hello World!') assert stream.read() == 'Hello World!' assert stream.read(5) == 'Hello' # Test close method stream.close()