From 6a9e080792f89a0363a9e6269acd9050f50573e4 Mon Sep 17 00:00:00 2001 From: Stephen L Date: Wed, 2 Dec 2015 19:16:08 +0100 Subject: [PATCH] better unit test for nested + fix coverage Signed-off-by: Stephen L. --- tqdm/_utils.py | 2 +- tqdm/tests/tests_tqdm.py | 109 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/tqdm/_utils.py b/tqdm/_utils.py index e7142002..d3ca7f78 100755 --- a/tqdm/_utils.py +++ b/tqdm/_utils.py @@ -111,7 +111,7 @@ def _environ_cols_linux(fp): # pragma: no cover return int(get('COLUMNS', 1)) - 1 -def _term_move_up(): +def _term_move_up(): # pragma: no cover if os.name == 'nt': if colorama: return '\x1b[A' diff --git a/tqdm/tests/tests_tqdm.py b/tqdm/tests/tests_tqdm.py index f88d28f3..c524744e 100644 --- a/tqdm/tests/tests_tqdm.py +++ b/tqdm/tests/tests_tqdm.py @@ -562,6 +562,39 @@ def test_smoothing(): def test_nested(): """ Test nested progress bars """ + # Use regexp because the it rates can change + RE_nested = re.compile(r'((\x1b\[A|\r|\n)+((outer|inner) loop:\s+\d+%|\s{3,6})?)') # NOQA + RE_nested2 = re.compile(r'((\x1b\[A|\r|\n)+((outer0|inner1|inner2) loop:\s+\d+%|\s{3,6})?)') # NOQA + + # Artifically test nested loop printing + # Without leave + our_file = StringIO() + t = tqdm(total=2, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='inner loop', leave=False, nested=True) + t.update() + t.close() + our_file.seek(0) + out = our_file.read() + res = [m[0] for m in RE_nested.findall(out)] + assert res == ['\n\rinner loop: 0%', + '\rinner loop: 50%', + '\r ', + '\r\x1b[A'] + + # With leave + our_file = StringIO() + t = tqdm(total=2, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='inner loop', leave=True, nested=True) + t.update() + t.close() + our_file.seek(0) + out = our_file.read() + res = [m[0] for m in RE_nested.findall(out)] + assert res == ['\n\rinner loop: 0%', + '\rinner loop: 50%', + '\r\x1b[A'] + + # Test simple nested, without leave our_file = StringIO() for i in trange(2, file=our_file, miniters=1, mininterval=0, maxinterval=0, desc='outer loop', leave=True): @@ -570,21 +603,87 @@ def test_nested(): pass our_file.seek(0) out = our_file.read() - RE_nested = re.compile(r'((\r|\n)(outer|inner) loop:\s+\d+%)') res = [m[0] for m in RE_nested.findall(out)] assert res == ['\router loop: 0%', - '\ninner loop: 0%', + '\n\rinner loop: 0%', '\rinner loop: 25%', '\rinner loop: 50%', '\rinner loop: 75%', '\rinner loop: 100%', - '\router loop: 50%', - '\ninner loop: 0%', + '\r ', + '\r\x1b[A\router loop: 50%', + '\n\rinner loop: 0%', '\rinner loop: 25%', '\rinner loop: 50%', '\rinner loop: 75%', '\rinner loop: 100%', - '\router loop: 100%'] + '\r ', + '\r\x1b[A\router loop: 100%', + '\n'] + + # Test nested with leave + our_file = StringIO() + for i in trange(2, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='outer loop', leave=True): + for j in trange(4, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='inner loop', leave=True, + nested=True): + pass + our_file.seek(0) + out = our_file.read() + res = [m[0] for m in RE_nested.findall(out)] + assert res == ['\router loop: 0%', + '\n\rinner loop: 0%', + '\rinner loop: 25%', + '\rinner loop: 50%', + '\rinner loop: 75%', + '\rinner loop: 100%', + '\r\x1b[A\router loop: 50%', + '\n\rinner loop: 0%', + '\rinner loop: 25%', + '\rinner loop: 50%', + '\rinner loop: 75%', + '\rinner loop: 100%', + '\r\x1b[A\router loop: 100%', + '\n'] + + # Test 2 nested loops with leave + our_file = StringIO() + for i in trange(2, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='outer0 loop', leave=True): + for j in trange(2, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='inner1 loop', leave=True, + nested=True): + for k in trange(2, file=our_file, miniters=1, mininterval=0, + maxinterval=0, desc='inner2 loop', leave=True, + nested=True): + pass + our_file.seek(0) + out = our_file.read() + res = [m[0] for m in RE_nested2.findall(out)] + assert res == ['\router0 loop: 0%', + '\n\rinner1 loop: 0%', + '\n\rinner2 loop: 0%', + '\rinner2 loop: 50%', + '\rinner2 loop: 100%', + '\r\x1b[A\rinner1 loop: 50%', + '\n\rinner2 loop: 0%', + '\rinner2 loop: 50%', + '\rinner2 loop: 100%', + '\r\x1b[A\rinner1 loop: 100%', + '\r\x1b[A\router0 loop: 50%', + '\n\rinner1 loop: 0%', + '\n\rinner2 loop: 0%', + '\rinner2 loop: 50%', + '\rinner2 loop: 100%', + '\r\x1b[A\rinner1 loop: 50%', + '\n\rinner2 loop: 0%', + '\rinner2 loop: 50%', + '\rinner2 loop: 100%', + '\r\x1b[A\rinner1 loop: 100%', + '\r\x1b[A\router0 loop: 100%', + '\n'] + # TODO: test degradation on windows without colorama? def test_no_gui():