from __future__ import annotations

import unittest

from ap1_r2c_candidate_multiresolution import G22_THRESHOLDS, classify


def level(friedmann: float, ward: float, source: float, wronskian: float) -> dict:
    return {"diagnostics": {
        "finite": True, "positive_H": True, "min_PX": 1.0, "min_K": 1.0,
        "max_abs_friedmann_residual": friedmann,
        "ward_normalized": ward,
        "validation_source_relative_change": source,
        "validation_wronskian_relative_error": wronskian,
    }}


class CandidateMultiresolutionTests(unittest.TestCase):
    def test_thresholds_are_pre_registered(self):
        self.assertEqual(G22_THRESHOLDS["max_abs_friedmann_residual"], 1.0e-6)
        self.assertEqual(G22_THRESHOLDS["ward_normalized"], 2.0e-6)
        self.assertEqual(G22_THRESHOLDS["validation_source_relative_change"], 1.0e-4)
        self.assertEqual(G22_THRESHOLDS["validation_wronskian_relative_error"], 1.0e-11)

    def test_nonmonotonic_or_above_threshold_fails_closed(self):
        levels = [level(3e-6, 3e-6, 3e-4, 3e-12),
                  level(2e-6, 4e-6, 2e-4, 2e-12),
                  level(1e-6, 1e-6, 1e-4, 1e-12)]
        verdict = classify(levels)
        self.assertFalse(verdict["pass"])
        self.assertEqual(verdict["classification"], "G22_ORANGE_NOT_PASS")

    def test_incomplete_refinement_fails_closed(self):
        levels = [level(9e-7, 1.8e-6, 9e-5, 9e-12),
                  {"success": False, "error": "candidate left positive-H branch"}]
        verdict = classify(levels)
        self.assertFalse(verdict["pass"])
        self.assertEqual(verdict["classification"], "G22_ORANGE_REFINEMENT_FAILURE")

    def test_monotonic_below_threshold_passes(self):
        levels = [level(9e-7, 1.8e-6, 9e-5, 9e-12),
                  level(8e-7, 1.7e-6, 8e-5, 8e-12),
                  level(7e-7, 1.6e-6, 7e-5, 7e-12)]
        self.assertTrue(classify(levels)["pass"])


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