41 lines
1.5 KiB
Python
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 |