Files
2026-10-07 10:38:21 +02:00

41 lines
1.5 KiB
Python

"""Quality decode tests (SPECIFICATION §7)."""
import pytest
from opcda_diagnozer.quality import QualityClass, decode_quality
@pytest.mark.parametrize(
("raw", "name", "quality_class"),
[
(0xC0, "GOOD", QualityClass.GOOD),
(0xD8, "GOOD_LOCAL_OVERRIDE", QualityClass.GOOD),
(0x44, "UNCERTAIN_LAST_USABLE", QualityClass.UNCERTAIN),
(0x40, "UNCERTAIN", QualityClass.UNCERTAIN),
(0x00, "BAD", QualityClass.BAD),
(0x04, "BAD_CONFIG_ERROR", QualityClass.BAD),
(0x08, "BAD_NOT_CONNECTED", QualityClass.BAD),
(0x0C, "BAD_DEVICE_FAILURE", QualityClass.BAD),
(0x10, "BAD_SENSOR_FAILURE", QualityClass.BAD),
(0x14, "BAD_LAST_KNOWN_VALUE", QualityClass.BAD),
(0x18, "BAD_COMM_FAILURE", QualityClass.BAD),
(0x1C, "BAD_OUT_OF_SERVICE", QualityClass.BAD),
],
)
def test_spec_table_decodes(raw: int, name: str, quality_class: QualityClass) -> None:
info = decode_quality(raw)
assert info.name == name
assert info.quality_class is quality_class
assert info.raw_hex == f"0x{raw:02X}"
def test_unknown_code_falls_back_to_class() -> None:
info = decode_quality(0x20)
assert info.quality_class is QualityClass.BAD
assert info.name.startswith("BAD_")
def test_class_bits_come_from_low_byte() -> None:
# 16-bit quality word: the high byte must not affect the class (§7)
assert decode_quality(0x0118).quality_class is QualityClass.BAD
assert decode_quality(0xFFC0).quality_class is QualityClass.GOOD