122 lines
5.2 KiB
Python
122 lines
5.2 KiB
Python
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)
|
|
|
|
lines = out.getvalue().strip("\r\n").split("\r")
|
|
assert lines[0].startswith("[ 0 kg |")
|
|
expected = (
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 10}{colorama.Fore.RESET}| 100 kg ] "
|
|
f"{colorama.Style.BRIGHT}100 kg{colorama.Style.RESET_ALL}"
|
|
)
|
|
assert lines[-1] == 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)
|
|
|
|
# à 50% pile → 5 blocs pleins, 0 partiel, 5 vides
|
|
expected_bar = f"{'█' * 5}{' ' * 5}"
|
|
lines = out.getvalue().strip("\r\n").split("\r")
|
|
assert lines[0].startswith("[ 0 kg |")
|
|
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 lines[-1] == 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)
|
|
|
|
expected_bar = f"{' ' * 10}" # pas de bloc au tout début
|
|
lines = out.getvalue().strip("\r\n").split("\r")
|
|
assert lines[0].startswith("[ 0 kg |")
|
|
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 lines[-1] == 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)
|
|
|
|
lines = out.getvalue().strip("\r\n").split("\r")
|
|
assert lines[0].startswith("[ 0 m |")
|
|
expected = (
|
|
f"[ 0 m |{colorama.Fore.RED}{'>' * 10}{colorama.Fore.RESET}| 10 m ] "
|
|
f"{colorama.Style.BRIGHT}15 m{colorama.Style.RESET_ALL}"
|
|
)
|
|
assert lines[-1] == 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)
|
|
|
|
lines = out.getvalue().strip("\r\n").split("\r")
|
|
assert lines[0].startswith("[ 0 m |")
|
|
expected = (
|
|
f"[ 0 m |{colorama.Fore.RED}{'<' * 10}{colorama.Fore.RESET}| 10 m ] "
|
|
f"{colorama.Style.BRIGHT}-5 m{colorama.Style.RESET_ALL}"
|
|
)
|
|
assert lines[-1] == 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(27)
|
|
bar.show(49)
|
|
bar.show(50)
|
|
bar.show(51)
|
|
bar.show(73)
|
|
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}{' ' * 10}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}0 kg{colorama.Style.RESET_ALL}",
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 1}{' ' * 9}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}10 kg{colorama.Style.RESET_ALL}",
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 2}▌{' ' * 7}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}25 kg{colorama.Style.RESET_ALL}", # 25% → 1.75 → round=2 → ▌
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 2}▋{' ' * 7}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}27 kg{colorama.Style.RESET_ALL}", # 27% → 1.89 → round=2 → ▌
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 5}{' ' * 5}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}49 kg{colorama.Style.RESET_ALL}", # 49% → 3.43 → round=3 → ▋
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 5}{' ' * 5}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}50 kg{colorama.Style.RESET_ALL}",
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 5}▏{' ' * 4}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}51 kg{colorama.Style.RESET_ALL}", # 51% → 3.57 → round=4 → ▍
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 7}▎{' ' * 2}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}73 kg{colorama.Style.RESET_ALL}", # 73% → 5.11 → round=5 → ▋
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 7}▍{' ' * 2}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}75 kg{colorama.Style.RESET_ALL}", # 75% → 5.25 → round=5 → ▊
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 9} {' ' * 0}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}90 kg{colorama.Style.RESET_ALL}",
|
|
f"[ 0 kg |{colorama.Fore.GREEN}{'█' * 10}{colorama.Fore.RESET}| 100 kg ] {colorama.Style.BRIGHT}100 kg{colorama.Style.RESET_ALL}"
|
|
]
|
|
|
|
for expected in expected_lines:
|
|
assert expected in lines
|