import json
import unittest
from pathlib import Path
import numpy as np

ROOT=Path(__file__).resolve().parents[2];EXP=ROOT/'dihedral_gnn'
class FixedGraphContracts(unittest.TestCase):
 def test_direct_outputs_use_only_prepared_5925_graph(self):
  with np.load(EXP/'outputs/prepared_graph_5925_direct_predictions.npz',allow_pickle=False) as a:
   self.assertEqual(int(a['node_count']),5925);self.assertTrue(bool(a['direct_model_evaluation']));self.assertEqual(a['dihedral_risk_probability'].shape,(2,5925));self.assertEqual(a['normal_baseline_risk_probability'].shape,(2,5925));self.assertEqual(a['dihedral_magnitude_mm'].shape,(2,5925));self.assertEqual(a['normal_baseline_magnitude_mm'].shape,(2,5925))
 def test_contract_has_same_graph_ablation_and_changed_cad_limits(self):
  x=json.loads((EXP/'input_processed/feature_contract.json').read_text());self.assertEqual(x['actual_node_count'],5925);self.assertIn('same GNN',x['normal_baseline']);self.assertIn('new CAD',x['changed_cad']);self.assertNotIn('graph_12000',json.dumps(x))
 def test_viewer_data_has_two_models_and_exact_face_geometry(self):
  x=json.loads((EXP/'outputs/viewer_data.json').read_text());self.assertEqual(len(x['nodes']),5925);self.assertEqual(len(x['models']),2);self.assertEqual(len(x['incident_face_geometry']),5925);self.assertEqual(len(x['models'][0]['runs'][0]['heater_top_c']),17)
  self.assertEqual(sum(x['node_feature']['cad_signed_curvature_valid']),2301);self.assertEqual(len(x['node_feature']['cad_shape_index_valid']),5925)
 def test_augmented_processed_input_has_signed_curvature(self):
  with np.load(EXP/'input_processed/prepared_graph_5925.npz',allow_pickle=False) as a:self.assertEqual(a['x'].shape,(5925,22));self.assertIn('cad_mean_H_signed_1_per_mm',a['feature_names']);self.assertEqual(int(a['feature_valid'][:,18].sum()),2301)
 def test_viewer_has_comparison_and_changed_graph_wording(self):
  h=(EXP/'outputs/viewer.html').read_text();self.assertIn('Normal vs dihedral',h);self.assertIn('modelSelect',h);self.assertNotIn('11,956',h)
if __name__=='__main__':unittest.main()
