Files
magnus919_agent-skills/binary-analysis/tests/unit/test_enums.py
T

205 lines
6.5 KiB
Python

"""Unit tests for all canonical enumerations."""
from __future__ import annotations
import sys
from pathlib import Path
_scripts_dir = Path(__file__).resolve().parents[2] / "scripts"
if str(_scripts_dir) not in sys.path:
sys.path.insert(0, str(_scripts_dir))
import json
from binary_analysis.domain.enums import (
AuditResult,
Confidence,
DiagnosticSeverity,
Endianness,
FunctionNameSource,
ImportResolution,
ProjectState,
ReferenceKind,
ReportType,
)
class TestProjectState:
"""Tests for ProjectState enum."""
def test_all_six_states_defined(self) -> None:
assert len(ProjectState) == 6
def test_values_are_upper_case(self) -> None:
for state in ProjectState:
assert state.value == state.value.upper()
def test_expected_values(self) -> None:
assert ProjectState.CREATED.value == "CREATED"
assert ProjectState.IMPORTED.value == "IMPORTED"
assert ProjectState.ANALYZING.value == "ANALYZING"
assert ProjectState.READY.value == "READY"
assert ProjectState.STALE.value == "STALE"
assert ProjectState.FAILED.value == "FAILED"
def test_serializes_as_string(self) -> None:
raw = json.dumps(ProjectState.CREATED.value)
assert raw == '"CREATED"'
def test_is_string_enum(self) -> None:
assert isinstance(ProjectState.CREATED, str)
class TestConfidence:
"""Tests for Confidence enum."""
def test_all_four_levels_defined(self) -> None:
assert len(Confidence) == 4
def test_values_are_upper_case(self) -> None:
for level in Confidence:
assert level.value == level.value.upper()
def test_serializes_as_string(self) -> None:
assert json.dumps(Confidence.HIGH.value) == '"HIGH"'
assert json.dumps(Confidence.LOW.value) == '"LOW"'
class TestDiagnosticSeverity:
"""Tests for DiagnosticSeverity enum."""
def test_all_three_levels_defined(self) -> None:
assert len(DiagnosticSeverity) == 3
def test_values_match_expected(self) -> None:
assert DiagnosticSeverity.INFO.value == "INFO"
assert DiagnosticSeverity.WARNING.value == "WARNING"
assert DiagnosticSeverity.ERROR.value == "ERROR"
class TestReferenceKind:
"""Tests for ReferenceKind enum."""
def test_all_nine_kinds_defined(self) -> None:
assert len(ReferenceKind) == 9
def test_expected_values(self) -> None:
assert ReferenceKind.CALL.value == "CALL"
assert ReferenceKind.JUMP.value == "JUMP"
assert ReferenceKind.READ.value == "READ"
assert ReferenceKind.WRITE.value == "WRITE"
assert ReferenceKind.DATA.value == "DATA"
assert ReferenceKind.IMPORT.value == "IMPORT"
assert ReferenceKind.EXPORT.value == "EXPORT"
assert ReferenceKind.INDIRECT.value == "INDIRECT"
assert ReferenceKind.UNKNOWN.value == "UNKNOWN"
class TestEndianness:
"""Tests for Endianness enum."""
def test_all_four_values_defined(self) -> None:
assert len(Endianness) == 4
def test_expected_values(self) -> None:
assert Endianness.LITTLE.value == "LITTLE"
assert Endianness.BIG.value == "BIG"
assert Endianness.MIXED.value == "MIXED"
assert Endianness.UNKNOWN.value == "UNKNOWN"
class TestFunctionNameSource:
"""Tests for FunctionNameSource enum."""
def test_all_seven_sources_defined(self) -> None:
assert len(FunctionNameSource) == 7
def test_expected_values(self) -> None:
assert FunctionNameSource.ORIGINAL.value == "ORIGINAL"
assert FunctionNameSource.IMPORTED.value == "IMPORTED"
assert FunctionNameSource.DEBUG.value == "DEBUG"
assert FunctionNameSource.BACKEND_GENERATED.value == "BACKEND_GENERATED"
assert FunctionNameSource.USER_ANNOTATION.value == "USER_ANNOTATION"
assert FunctionNameSource.AGENT_SUGGESTION.value == "AGENT_SUGGESTION"
assert FunctionNameSource.UNKNOWN.value == "UNKNOWN"
class TestImportResolution:
"""Tests for ImportResolution enum."""
def test_all_three_states_defined(self) -> None:
assert len(ImportResolution) == 3
def test_expected_values(self) -> None:
assert ImportResolution.RESOLVED.value == "RESOLVED"
assert ImportResolution.PARTIAL.value == "PARTIAL"
assert ImportResolution.UNRESOLVED.value == "UNRESOLVED"
class TestReportType:
"""Tests for ReportType enum."""
def test_all_three_types_defined(self) -> None:
assert len(ReportType) == 3
def test_expected_values(self) -> None:
assert ReportType.TRIAGE.value == "TRIAGE"
assert ReportType.FOCUSED.value == "FOCUSED"
assert ReportType.PROJECT.value == "PROJECT"
class TestAuditResult:
"""Tests for AuditResult enum."""
def test_all_five_results_defined(self) -> None:
assert len(AuditResult) == 5
def test_expected_values(self) -> None:
assert AuditResult.SUCCESS.value == "SUCCESS"
assert AuditResult.PARTIAL.value == "PARTIAL"
assert AuditResult.FAILED.value == "FAILED"
assert AuditResult.CANCELLED.value == "CANCELLED"
assert AuditResult.REFUSED.value == "REFUSED"
class TestEnumSerialization:
"""Ensure all enums serialize as UPPER_CASE strings (VAL-JSON-013)."""
def test_no_enum_serializes_as_integer(self) -> None:
"""No enum value should be an integer ordinal."""
all_enums = [
ProjectState,
Confidence,
DiagnosticSeverity,
ReferenceKind,
Endianness,
FunctionNameSource,
ImportResolution,
ReportType,
AuditResult,
]
for enum_class in all_enums:
for member in enum_class:
serialized = json.dumps(member.value)
assert serialized.startswith('"'), (
f"{enum_class.__name__}.{member.name} serialized as integer: {serialized}"
)
def test_no_enum_serializes_as_lowercase(self) -> None:
"""No enum value should be lowercase."""
all_enums = [
ProjectState,
Confidence,
DiagnosticSeverity,
ReferenceKind,
Endianness,
FunctionNameSource,
ImportResolution,
ReportType,
AuditResult,
]
for enum_class in all_enums:
for member in enum_class:
assert member.value == member.value.upper(), (
f"{enum_class.__name__}.{member.name} is not UPPER_CASE: {member.value}"
)