"""test_scripts.py — Anti-smuggle script tests."""

from __future__ import annotations

import json
import sys
import unittest
from pathlib import Path

REPO_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(REPO_ROOT / "scripts"))


class TestSeedlock(unittest.TestCase):
    """seedlock: deterministic RNG."""

    def test_seeded_rng_reproducible(self):
        from seedlock import SeededRNG
        a = SeededRNG(42)
        b = SeededRNG(42)
        self.assertEqual(a.random(), b.random())
        self.assertEqual(a.randint(0, 100), b.randint(0, 100))

    def test_seeded_rng_different_seeds(self):
        from seedlock import SeededRNG
        a = SeededRNG(1)
        b = SeededRNG(2)
        # Different seeds should produce different sequences
        results = {(a.random(), b.random()) for _ in range(10)}
        self.assertGreater(len(results), 1)


class TestCheckDeterminism(unittest.TestCase):
    """check_determinism: hash chain verification."""

    def test_import(self):
        import check_determinism
        self.assertTrue(hasattr(check_determinism, "check_artifact_chain"))
        self.assertTrue(hasattr(check_determinism, "scan_seed_violations"))

    def test_compute_hash(self):
        from check_determinism import compute_json_sha256
        h = compute_json_sha256({"a": 1, "b": 2})
        self.assertIsInstance(h, str)
        self.assertEqual(len(h), 64)


class TestVerifyWithSympy(unittest.TestCase):
    """verify_with_sympy: CAS/SMT grounding."""

    def test_import(self):
        import verify_with_sympy
        self.assertTrue(hasattr(verify_with_sympy, "extract_ofratio_values"))
        self.assertTrue(hasattr(verify_with_sympy, "extract_ncderived_chains"))


class TestCrossValidate(unittest.TestCase):
    """cross_validate: multi-model comparison."""

    def test_extract_theorems(self):
        from cross_validate import extract_theorems
        lean_code = "theorem ncDerived_mul (r : FixtureRow) : ncDerived r = ... := by rfl"
        theorems = extract_theorems(lean_code)
        self.assertIn("ncDerived_mul", theorems)

    def test_statements_equivalent(self):
        from cross_validate import statements_equivalent
        self.assertTrue(statements_equivalent("a + b = c", "x + y = z"))
        self.assertFalse(statements_equivalent("a + b = c", "a - b = c"))


class TestQcFlagGenerator(unittest.TestCase):
    """qc_flag.mutation_generator: mutation generation."""

    def test_apply_mutation(self):
        from qc_flag.mutation_generator import apply_mutation
        result = apply_mutation("allOk 8 = true", "allOk 8 = true \u2192 allOk 8 = false")
        self.assertEqual(result, "allOk 8 = false")

    def test_load_manifest(self):
        from qc_flag.mutation_generator import load_manifest
        m = load_manifest()
        self.assertIn("sources", m)
        self.assertGreater(len(m["sources"]), 0)


class TestModelPanel(unittest.TestCase):
    """model_panel: financial decision engine."""

    def test_import(self):
        try:
            sys.path.insert(0, str(REPO_ROOT / ".." / "Research Stack" / "4-Infrastructure" / "shim"))
            import model_panel
            self.assertTrue(hasattr(model_panel, "estimate_query_cost"))
        except ImportError:
            self.skipTest("model_panel.py not accessible (Research Stack path)")


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