Add tests/test_utils_rangebar.py
Run CI Tests / test (push) Successful in 31s

This commit is contained in:
2025-07-29 21:33:06 +02:00
parent 51575412fa
commit 903bf32ed9
+109
View File
@@ -0,0 +1,109 @@
import colorama
import pytest
from io import StringIO
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from slic.utils.rangebar import *
@pytest.fixture
def capture_stdout(monkeypatch):
buf = StringIO()
monkeypatch.setattr("sys.stdout", buf)
return buf
def test_full_progress_bar(capture_stdout):
out = capture_stdout
with RangeBar(0, 100, width=10, units="kg", fmt=".0f") as bar:
bar.show(100)
line = out.getvalue().strip("\r\n")
expected = (
f"[ 0 kg |{colorama.Fore.GREEN}{'' * 10}{colorama.Fore.RESET}| 100 kg ] "
f"{colorama.Style.BRIGHT}100 kg{colorama.Style.RESET_ALL}"
)
assert line == expected
def test_half_progress_bar(capture_stdout):
out = capture_stdout
with RangeBar(0, 100, width=10, units="kg", fmt=".0f") as bar:
bar.show(50)
# 5 full + 1 partial + 4 empty
expected_bar = f"{'' * 5}{' ' * 4}"
line = out.getvalue().strip("\r\n")
expected = (
f"[ 0 kg |{colorama.Fore.GREEN}{expected_bar}{colorama.Fore.RESET}| 100 kg ] "
f"{colorama.Style.BRIGHT}50 kg{colorama.Style.RESET_ALL}"
)
assert line == expected
def test_zero_progress_bar(capture_stdout):
out = capture_stdout
with RangeBar(0, 100, width=10, units="kg", fmt=".0f") as bar:
bar.show(0)
# no full block, one empty partial, 9 spaces
expected_bar = f"{''}{' ' * 9}"
line = out.getvalue().strip("\r\n")
expected = (
f"[ 0 kg |{colorama.Fore.GREEN}{expected_bar}{colorama.Fore.RESET}| 100 kg ] "
f"{colorama.Style.BRIGHT}0 kg{colorama.Style.RESET_ALL}"
)
assert line == expected
def test_overflow_bar(capture_stdout):
out = capture_stdout
with RangeBar(0, 10, width=10, fmt=".0f", units="m") as bar:
bar.show(15)
line = out.getvalue().strip("\r\n")
expected = (
f"[ 0 m |{colorama.Fore.RED}{'>' * 10}{colorama.Fore.RESET}| 10 m ] "
f"{colorama.Style.BRIGHT}15 m{colorama.Style.RESET_ALL}"
)
assert line == expected
def test_underflow_bar(capture_stdout):
out = capture_stdout
with RangeBar(0, 10, width=10, fmt=".0f", units="m") as bar:
bar.show(-5)
line = out.getvalue().strip("\r\n")
expected = (
f"[ 0 m |{colorama.Fore.RED}{'<' * 10}{colorama.Fore.RESET}| 10 m ] "
f"{colorama.Style.BRIGHT}-5 m{colorama.Style.RESET_ALL}"
)
assert line == expected
def test_repr():
bar = RangeBar(0, 100, width=10, units="kg", fmt=".0f")
expected = "[ 0 kg |10 blocks| 100 kg ]"
assert repr(bar) == expected
def test_multiple_show_evolution(capture_stdout):
out = capture_stdout
with RangeBar(0, 100, width=10, units="kg", fmt=".0f") as bar:
bar.show(0)
bar.show(10)
bar.show(25)
bar.show(50)
bar.show(75)
bar.show(90)
bar.show(100)
result = out.getvalue()
lines = result.strip().split("\r")
expected_lines = [
f"[ 0 kg |{colorama.Fore.GREEN}{''}{' ' * 9}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}0 kg{colorama.Style.RESET_ALL}",
f"[ 0 kg |{colorama.Fore.GREEN}{''}{' ' * 8}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}10 kg{colorama.Style.RESET_ALL}",
f"[ 0 kg |{colorama.Fore.GREEN}██▌{' ' * 7}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}25 kg{colorama.Style.RESET_ALL}",
f"[ 0 kg |{colorama.Fore.GREEN}█████▌{' ' * 4}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}50 kg{colorama.Style.RESET_ALL}",
f"[ 0 kg |{colorama.Fore.GREEN}███████▌▏{' '}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}75 kg{colorama.Style.RESET_ALL}",
f"[ 0 kg |{colorama.Fore.GREEN}█████████▍{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}90 kg{colorama.Style.RESET_ALL}",
f"[ 0 kg |{colorama.Fore.GREEN}██████████{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}100 kg{colorama.Style.RESET_ALL}",
]
for expected in expected_lines:
assert expected in lines