Implemented the next missing parity slice around display formatters.
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
"""Tests for ``src/format_utils.py``."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from src.format_utils import (
|
||||
format_duration,
|
||||
format_file_size,
|
||||
format_number,
|
||||
format_seconds_short,
|
||||
format_tokens,
|
||||
)
|
||||
|
||||
|
||||
class FormatFileSizeTest(unittest.TestCase):
|
||||
def test_bytes(self) -> None:
|
||||
self.assertEqual(format_file_size(0), '0 bytes')
|
||||
self.assertEqual(format_file_size(512), '512 bytes')
|
||||
|
||||
def test_kb_with_decimal(self) -> None:
|
||||
self.assertEqual(format_file_size(1536), '1.5KB')
|
||||
|
||||
def test_kb_trims_trailing_zero(self) -> None:
|
||||
self.assertEqual(format_file_size(2048), '2KB')
|
||||
|
||||
def test_mb(self) -> None:
|
||||
self.assertEqual(format_file_size(5 * 1024 * 1024), '5MB')
|
||||
|
||||
def test_gb(self) -> None:
|
||||
self.assertEqual(format_file_size(2 * 1024 * 1024 * 1024), '2GB')
|
||||
|
||||
|
||||
class FormatSecondsShortTest(unittest.TestCase):
|
||||
def test_basic(self) -> None:
|
||||
self.assertEqual(format_seconds_short(1234), '1.2s')
|
||||
|
||||
def test_under_one(self) -> None:
|
||||
self.assertEqual(format_seconds_short(450), '0.5s')
|
||||
|
||||
|
||||
class FormatDurationTest(unittest.TestCase):
|
||||
def test_zero(self) -> None:
|
||||
self.assertEqual(format_duration(0), '0s')
|
||||
|
||||
def test_sub_second(self) -> None:
|
||||
self.assertEqual(format_duration(0.5), '0.0s')
|
||||
|
||||
def test_seconds_only(self) -> None:
|
||||
self.assertEqual(format_duration(5_000), '5s')
|
||||
|
||||
def test_minutes_seconds(self) -> None:
|
||||
self.assertEqual(format_duration(125_000), '2m 5s')
|
||||
|
||||
def test_hours(self) -> None:
|
||||
self.assertEqual(format_duration(3_725_000), '1h 2m 5s')
|
||||
|
||||
def test_days(self) -> None:
|
||||
# 1d 2h 3m
|
||||
ms = 86_400_000 + 2 * 3_600_000 + 3 * 60_000 + 0
|
||||
self.assertEqual(format_duration(ms), '1d 2h 3m')
|
||||
|
||||
def test_hide_trailing_zeros_minutes(self) -> None:
|
||||
self.assertEqual(
|
||||
format_duration(120_000, hide_trailing_zeros=True), '2m',
|
||||
)
|
||||
|
||||
def test_hide_trailing_zeros_hours(self) -> None:
|
||||
self.assertEqual(
|
||||
format_duration(3_600_000, hide_trailing_zeros=True), '1h',
|
||||
)
|
||||
|
||||
def test_most_significant_only_picks_largest_unit(self) -> None:
|
||||
self.assertEqual(format_duration(125_000, most_significant_only=True), '2m')
|
||||
self.assertEqual(
|
||||
format_duration(3_725_000, most_significant_only=True), '1h',
|
||||
)
|
||||
|
||||
def test_rounding_carry_over(self) -> None:
|
||||
# 59,500 ms rounds seconds=60 → carries to 1m 0s
|
||||
self.assertEqual(format_duration(59_500 + 60_000), '2m 0s')
|
||||
|
||||
|
||||
class FormatNumberTest(unittest.TestCase):
|
||||
def test_below_thousand(self) -> None:
|
||||
self.assertEqual(format_number(900), '900')
|
||||
self.assertEqual(format_number(0), '0')
|
||||
|
||||
def test_thousands_with_decimal(self) -> None:
|
||||
self.assertEqual(format_number(1321), '1.3k')
|
||||
|
||||
def test_thousand_keeps_decimal(self) -> None:
|
||||
self.assertEqual(format_number(1000), '1.0k')
|
||||
|
||||
def test_millions(self) -> None:
|
||||
self.assertEqual(format_number(2_500_000), '2.5m')
|
||||
|
||||
def test_billions(self) -> None:
|
||||
self.assertEqual(format_number(3_700_000_000), '3.7b')
|
||||
|
||||
|
||||
class FormatTokensTest(unittest.TestCase):
|
||||
def test_trims_decimal_zero(self) -> None:
|
||||
self.assertEqual(format_tokens(1000), '1k')
|
||||
|
||||
def test_keeps_meaningful_decimal(self) -> None:
|
||||
self.assertEqual(format_tokens(1321), '1.3k')
|
||||
|
||||
def test_below_thousand(self) -> None:
|
||||
self.assertEqual(format_tokens(450), '450')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user