"""Independent arithmetic and boundary assertions for the public worked example.""" import copy import csv from datetime import date from pathlib import Path import unittest from review_cohort import review BASE = Path(__file__).parent class ReviewTests(unittest.TestCase): def setUp(self): with (BASE / 'start-cohort.csv').open(newline='') as source: self.rows = list(csv.DictReader(source)) def run_review(self, rows=None, as_of='2026-11-04', days=90): return review(self.rows if rows is None else rows, date.fromisoformat(as_of), days) def test_hand_checked_example(self): r = self.run_review() self.assertEqual(r['counts'], dict(total=6, pending=2, mature=4, retained=2, early_exit=1, retention_unknown=1, goal_observed=2, goal_met=1, goal_not_met=1, manager_observed=1, both_observed=1)) self.assertEqual(r['retention_coverage'], dict(numerator=3, denominator=4, percent=75.0)) self.assertEqual(r['retained_among_known'], dict(numerator=2, denominator=3, percent=66.67)) self.assertEqual(r['retained_cohort_lower_bound']['percent'], 50) self.assertEqual(r['retained_cohort_upper_bound']['percent'], 75) self.assertEqual(r['goal_coverage_among_confirmed_full_window']['denominator'], 2) self.assertEqual(r['manager_coverage_among_confirmed_full_window']['percent'], 50) self.assertIsNone(r['combined_quality_score']) def test_exit_after_checkpoint_does_not_rewrite_retention(self): self.assertEqual(self.run_review()['episode_checks'][1]['observation_state'], 'retained') def test_exit_on_checkpoint_is_not_retained(self): row = copy.deepcopy(self.rows[2]); row['exit_on'] = '2026-10-01' self.assertEqual(self.run_review([row])['counts']['early_exit'], 1) def test_young_episodes_remain_pending_with_no_zero_fill(self): r = self.run_review(self.rows[4:]) self.assertEqual(r['counts']['pending'], 2) self.assertIsNone(r['retained_among_known']['percent']) self.assertEqual(r['counts']['goal_not_met'], 0) def test_empty_cohort_has_null_percentages(self): self.assertIsNone(self.run_review([])['retention_coverage']['percent']) def test_reject_duplicate_and_future_evidence(self): with self.assertRaises(ValueError): self.run_review([self.rows[0], self.rows[0]]) with self.assertRaises(ValueError): self.run_review([self.rows[0]], as_of='2026-11-03') def test_reject_wrong_window_and_incomplete_record(self): row = copy.deepcopy(self.rows[0]); row['goal_window_end'] = '2026-09-28' with self.assertRaises(ValueError): self.run_review([row]) row['goal_window_end'] = '' with self.assertRaises(ValueError): self.run_review([row]) def test_review_point_is_configurable_and_checkpoint_is_inclusive(self): r = self.run_review([self.rows[4]], days=34) self.assertEqual(r['episode_checks'][0]['checkpoint_on'], '2026-11-04') self.assertEqual(r['counts']['retained'], 1) if __name__ == '__main__': unittest.main()