import unittest
from sampling import make_plan


class SamplingTests(unittest.TestCase):
    def test_native10_all_frames(self):
        p=make_plan([100+i/10 for i in range(52)],None)
        self.assertEqual(p['source_frame_indices'],list(range(1,53)))
        self.assertEqual(p['display_samples'],list(range(52)))
    def test_30fps_ranges_context(self):
        p=make_plan([i/30 for i in range(180)], [31,91])
        self.assertEqual(p['display_samples'],list(range(10,31)))
        self.assertEqual(len(p['target_seconds']),38)
        self.assertEqual(p['source_frame_indices'][0],1)
        self.assertEqual(p['source_frame_indices'][-1],112)
    def test_no_forced_boundary_frame(self):
        p=make_plan([i/30 for i in range(90)],[2,12])
        self.assertEqual([p['source_frame_indices'][i] for i in p['display_samples']],[4,7,10])
    def test_no_upsampling(self):
        with self.assertRaises(ValueError):make_plan([i/5 for i in range(20)],None)
    def test_invalid_pts_or_bounds(self):
        for pts in ([],[0,0],[1,0],[0,float('nan')]):
            with self.assertRaises(ValueError):make_plan(pts,None)
        with self.assertRaises(ValueError):make_plan([i/10 for i in range(20)],[1,21])
    def test_nearest_float_comparison(self):
        p=make_plan([0,.08,.12,.2,.3],None)
        self.assertEqual(p['source_frame_indices'][1],3)
        self.assertEqual(len(set(p['source_frame_indices'])),len(p['source_frame_indices']))


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