import unittest from timeline_utils import normalize_timeline class TimelineValidationTests(unittest.TestCase): def test_builds_contiguous_frame_ranges(self): result = normalize_timeline( [ ["Walk forward two steps.", 2], ["Turn around.", 2], ["Wave.", 2], ], fps=20, ) self.assertEqual(result[0]["start_frame"], 0) self.assertEqual(result[0]["end_frame"], 40) self.assertEqual(result[1]["start_frame"], 40) self.assertEqual(result[1]["end_frame"], 80) self.assertEqual(result[2]["start_frame"], 80) self.assertEqual(result[2]["end_frame"], 120) def test_ignores_blank_rows(self): result = normalize_timeline( [["Stand still.", 2], ["", None]], fps=20, ) self.assertEqual(len(result), 1) def test_rejects_more_than_eight_seconds(self): with self.assertRaisesRegex(ValueError, "may not exceed 8 seconds"): normalize_timeline( [["Walk.", 4], ["Wave.", 4], ["Sit.", 2]], fps=20, ) def test_rejects_missing_prompt(self): with self.assertRaisesRegex(ValueError, "action prompt"): normalize_timeline([["", 2]], fps=20) if __name__ == "__main__": unittest.main()