from __future__ import annotations

import os
from pathlib import Path
import unittest

import numpy as np

from ap1_r2c_mode_inheritance import (
    build_inheritance_report,
    endpoint_reinitialization_rejected,
    inherited_trajectory,
)


STATE = Path(os.environ["APEIRON_AP1_STATE_NPZ"])


class ModeInheritanceTests(unittest.TestCase):
    def test_inherited_trajectory_is_finite_and_expanding(self):
        tr = inherited_trajectory(STATE, 257)
        self.assertEqual(len(tr.N), 257)
        self.assertTrue(np.all(np.diff(tr.N) > 0.0))
        self.assertTrue(np.all(tr.H > 0.0))

    def test_endpoint_vacuum_reinitialization_is_rejected(self):
        self.assertTrue(endpoint_reinitialization_rejected(STATE))

    def test_report_preserves_claim_boundary(self):
        report = build_inheritance_report(STATE, levels=(129, 257))
        self.assertFalse(report["old_solver_or_physical_map_called"])
        self.assertFalse(report["frozen_terminal_classification_recomputed"])
        self.assertTrue(report["gates"]["positive_initial_frequency"])
        self.assertTrue(report["gates"]["endpoint_reinitialization_forbidden"])
        self.assertEqual(report["classification"], "MODE_INHERITANCE_REQUIRED_NUMERICAL_CONTROL_OPEN")


if __name__ == "__main__":
    unittest.main()
