"""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