53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
from __future__ import annotations
|
|
from dataclasses import dataclass, field
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
|
|
@dataclass
|
|
class FieldResult:
|
|
field_name: str = ""
|
|
status: str = "PASS"
|
|
cobol_value: str = ""
|
|
java_value: str = ""
|
|
tolerance_applied: float = 0.0
|
|
rounding_detected: str = ""
|
|
suggestion: str = ""
|
|
|
|
|
|
@dataclass
|
|
class VerificationRun:
|
|
program: str = ""
|
|
timestamp: str = ""
|
|
status: str = "PASS"
|
|
exit_code: int = 0
|
|
duration_s: float = 0.0
|
|
fields_matched: int = 0
|
|
fields_mismatched: int = 0
|
|
coverage_target: str = "boundary"
|
|
field_results: list[FieldResult] = field(default_factory=list)
|
|
runner: str = "native"
|
|
branch_rate: float = 0.0
|
|
llm_cost: float = 0.0
|
|
report_path: str = ""
|
|
debug: dict = field(default_factory=dict)
|
|
|
|
def __post_init__(self):
|
|
if not self.timestamp:
|
|
self.timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
|
|
@property
|
|
def total_fields(self) -> int:
|
|
return self.fields_matched + self.fields_mismatched
|
|
|
|
def verdict(self) -> str:
|
|
return self.status
|
|
|
|
|
|
_fr = FieldResult(field_name="BR-AMT", status="MISMATCH")
|
|
assert _fr.status == "MISMATCH"
|
|
|
|
_vr = VerificationRun(program="BILL-CALC", runner="spark")
|
|
assert _vr.program == "BILL-CALC"
|
|
assert _vr.timestamp != ""
|