mcltspice/tests/test_optimizer_helpers.py
Ryan Malloy cf8394fa6f Rename mcp-ltspice -> mcltspice, remove stdout banner
Rename package from mcp-ltspice/mcp_ltspice to mcltspice throughout:
source directory, imports, pyproject.toml, tests, and README.

Remove startup banner prints from main() since FastMCP handles
its own banner and stdout is the MCP JSON-RPC transport.

Point repo URL at git.supported.systems/MCP/mcltspice.
2026-02-12 22:53:16 -07:00

88 lines
2.9 KiB
Python

"""Tests for optimizer module helpers: snap_to_preferred, format_engineering."""
import pytest
from mcltspice.optimizer import format_engineering, snap_to_preferred
class TestSnapToPreferred:
def test_e12_exact_match(self):
"""A value that is already an E12 value should snap to itself."""
assert snap_to_preferred(4700.0, "E12") == pytest.approx(4700.0, rel=0.01)
def test_e12_near_value(self):
"""4800 should snap to 4700 (E12)."""
result = snap_to_preferred(4800.0, "E12")
assert result == pytest.approx(4700.0, rel=0.05)
def test_e24_finer_resolution(self):
"""E24 has 5.1, so 5050 should snap to 5100."""
result = snap_to_preferred(5050.0, "E24")
assert result == pytest.approx(5100.0, rel=0.05)
def test_e96_precision(self):
"""E96 should snap to a value very close to the input."""
result = snap_to_preferred(4750.0, "E96")
assert result == pytest.approx(4750.0, rel=0.03)
def test_zero_value(self):
"""Zero should snap to the smallest E-series value."""
result = snap_to_preferred(0.0, "E12")
assert result > 0
def test_negative_value(self):
"""Negative value should snap to the smallest E-series value."""
result = snap_to_preferred(-100.0, "E12")
assert result > 0
def test_sub_ohm(self):
"""Small values (e.g., 0.47 ohms) should snap correctly."""
result = snap_to_preferred(0.5, "E12")
assert result == pytest.approx(0.47, rel=0.1)
def test_megohm_range(self):
"""Large values should snap correctly across decades."""
result = snap_to_preferred(2_200_000.0, "E12")
assert result == pytest.approx(2_200_000.0, rel=0.05)
def test_unknown_series_defaults_to_e12(self):
"""Unknown series name should fall back to E12."""
result = snap_to_preferred(4800.0, "E6")
assert result == pytest.approx(4700.0, rel=0.05)
class TestFormatEngineering:
def test_10k(self):
assert format_engineering(10_000) == "10k"
def test_1u(self):
assert format_engineering(0.000001) == "1u"
def test_4_7k(self):
assert format_engineering(4700) == "4.7k"
def test_zero(self):
assert format_engineering(0) == "0"
def test_1_5(self):
"""Values in the unity range should have no suffix."""
result = format_engineering(1.5)
assert result == "1.5"
def test_negative(self):
result = format_engineering(-4700)
assert result.startswith("-")
assert "4.7k" in result
def test_picofarad(self):
result = format_engineering(100e-12)
assert "100p" in result
def test_milliamp(self):
result = format_engineering(0.010)
assert "10m" in result
def test_large_value(self):
result = format_engineering(1e9)
assert "G" in result or "1e" in result