import sys import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from sync_logic import compute_offset class TestComputeOffset(unittest.TestCase): def test_audio_ahead_needs_delay(self): # Flash seen at 5.000s, beep heard at 4.500s -> audio is running # ahead of video, so audio needs to be delayed to catch up. offset = compute_offset(video_mark_sec=5.000, audio_mark_sec=4.500) self.assertAlmostEqual(offset.delay_ms, 500.0) self.assertEqual(offset.target, "audio") def test_audio_behind_needs_video_delay(self): # This is our synthetic test fixture: audio was shifted +350ms # later than video, so the fix is to delay video to catch up to # the already-late audio -- NOT to delay audio further. offset = compute_offset(video_mark_sec=5.000, audio_mark_sec=5.350) self.assertAlmostEqual(offset.delay_ms, -350.0) self.assertEqual(offset.target, "video") def test_already_in_sync(self): offset = compute_offset(video_mark_sec=5.000, audio_mark_sec=5.000) self.assertEqual(offset.delay_ms, 0.0) self.assertEqual(offset.target, "none") def test_describe_formatting(self): self.assertIn("audio will be delayed", compute_offset(5.5, 5.0).describe()) self.assertIn("video will be delayed", compute_offset(5.0, 5.5).describe()) self.assertIn("+500", compute_offset(5.5, 5.0).describe()) self.assertIn("-500", compute_offset(5.0, 5.5).describe()) if __name__ == "__main__": unittest.main()