def test_load_hardcoded_file(test_video_file): """ Test loading a stats file with some hard-coded data generated by this test case. """ from scenedetect.stats_manager import COLUMN_NAME_FPS from scenedetect.stats_manager import COLUMN_NAME_FRAME_NUMBER from scenedetect.stats_manager import COLUMN_NAME_TIMECODE stats_manager = StatsManager() stats_file = open(TEST_STATS_FILES[0], 'w') try: stats_writer = get_csv_writer(stats_file) some_metric_key = 'some_metric' some_metric_value = 1.2 some_frame_key = 100 base_timecode = FrameTimecode(0, 29.97) some_frame_timecode = base_timecode + some_frame_key # Write out a valid file. stats_writer.writerow( [COLUMN_NAME_FPS, '%.10f' % base_timecode.get_framerate()]) stats_writer.writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writer.writerow([ some_frame_key, some_frame_timecode.get_timecode(), str(some_metric_value) ]) stats_file.close() stats_file = open(TEST_STATS_FILES[0], 'r') stats_manager.load_from_csv(csv_file=stats_file, base_timecode=base_timecode) # Check that we decoded the correct values. assert stats_manager.metrics_exist(some_frame_key, [some_metric_key]) assert stats_manager.get_metrics( some_frame_key, [some_metric_key])[0] == pytest.approx(some_metric_value) finally: stats_file.close() os.remove(TEST_STATS_FILES[0])
def test_load_hardcoded_file(test_video_file): """ Test loading a stats file with some hard-coded data generated by this test case. """ from scenedetect.stats_manager import COLUMN_NAME_FPS from scenedetect.stats_manager import COLUMN_NAME_FRAME_NUMBER from scenedetect.stats_manager import COLUMN_NAME_TIMECODE stats_manager = StatsManager() stats_file = open(TEST_STATS_FILES[0], 'w') try: stats_writer = get_csv_writer(stats_file) some_metric_key = 'some_metric' some_metric_value = 1.2 some_frame_key = 100 base_timecode = FrameTimecode(0, 29.97) some_frame_timecode = base_timecode + some_frame_key # Write out a valid file. stats_writer.writerow([COLUMN_NAME_FPS, '%.10f' % base_timecode.get_framerate()]) stats_writer.writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writer.writerow( [some_frame_key, some_frame_timecode.get_timecode(), str(some_metric_value)]) stats_file.close() stats_file = open(TEST_STATS_FILES[0], 'r') stats_manager.load_from_csv(csv_file=stats_file, base_timecode=base_timecode) # Check that we decoded the correct values. assert stats_manager.metrics_exist(some_frame_key, [some_metric_key]) assert stats_manager.get_metrics( some_frame_key, [some_metric_key])[0] == pytest.approx(some_metric_value) finally: stats_file.close() os.remove(TEST_STATS_FILES[0])
def test_load_corrupt_stats(test_video_file): """ Test loading a corrupted stats file created by outputting data in the wrong format. """ from scenedetect.stats_manager import COLUMN_NAME_FPS from scenedetect.stats_manager import COLUMN_NAME_FRAME_NUMBER from scenedetect.stats_manager import COLUMN_NAME_TIMECODE stats_manager = StatsManager() stats_files = [open(stats_file, 'wt') for stats_file in TEST_STATS_FILES] try: stats_writers = [get_csv_writer(stats_file) for stats_file in stats_files] some_metric_key = 'some_metric' some_metric_value = str(1.2) some_frame_key = 100 base_timecode = FrameTimecode(0, 29.97) some_frame_timecode = base_timecode + some_frame_key # Write out some invalid files. # File 0: Blank FPS [StatsFileCorrupt] stats_writers[0].writerow([COLUMN_NAME_FPS]) stats_writers[0].writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writers[0].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) # File 1: Invalid FPS [StatsFileCorrupt] stats_writers[1].writerow([COLUMN_NAME_FPS, '%0.10f' % 0.0000001]) stats_writers[1].writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writers[1].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) # File 2: Wrong FPS [StatsFileFramerateMismatch] stats_writers[2].writerow( [COLUMN_NAME_FPS, '%.10f' % (base_timecode.get_framerate() / 2.0)]) stats_writers[2].writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writers[2].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) # File 3: Wrong Header Names [StatsFileCorrupt] stats_writers[3].writerow([COLUMN_NAME_FPS, '%.10f' % base_timecode.get_framerate()]) stats_writers[3].writerow( [COLUMN_NAME_TIMECODE, COLUMN_NAME_FRAME_NUMBER, some_metric_key]) stats_writers[3].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) for stats_file in stats_files: stats_file.close() stats_files = [open(stats_file, 'rt') for stats_file in TEST_STATS_FILES] with pytest.raises(StatsFileCorrupt): stats_manager.load_from_csv(stats_files[0], base_timecode) with pytest.raises(StatsFileCorrupt): stats_manager.load_from_csv(stats_files[1], base_timecode) with pytest.raises(StatsFileFramerateMismatch): stats_manager.load_from_csv(stats_files[2], base_timecode) with pytest.raises(StatsFileCorrupt): stats_manager.load_from_csv(stats_files[3], base_timecode) finally: for stats_file in stats_files: stats_file.close() for stats_file in TEST_STATS_FILES: os.remove(stats_file)
def test_load_corrupt_stats(test_video_file): """ Test loading a corrupted stats file created by outputting data in the wrong format. """ from scenedetect.stats_manager import COLUMN_NAME_FPS from scenedetect.stats_manager import COLUMN_NAME_FRAME_NUMBER from scenedetect.stats_manager import COLUMN_NAME_TIMECODE stats_manager = StatsManager() stats_files = [open(stats_file, 'wt') for stats_file in TEST_STATS_FILES] try: stats_writers = [get_csv_writer(stats_file) for stats_file in stats_files] some_metric_key = 'some_metric' some_metric_value = str(1.2) some_frame_key = 100 base_timecode = FrameTimecode(0, 29.97) some_frame_timecode = base_timecode + some_frame_key # Write out some invalid files. # File 0: Blank FPS [StatsFileCorrupt] stats_writers[0].writerow([COLUMN_NAME_FPS]) stats_writers[0].writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writers[0].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) # File 1: Invalid FPS [StatsFileCorrupt] stats_writers[1].writerow([COLUMN_NAME_FPS, '%0.10f' % 0.0000001]) stats_writers[1].writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writers[1].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) # File 2: Wrong FPS [StatsFileFramerateMismatch] stats_writers[2].writerow( [COLUMN_NAME_FPS, '%.10f' % (base_timecode.get_framerate() / 2.0)]) stats_writers[2].writerow( [COLUMN_NAME_FRAME_NUMBER, COLUMN_NAME_TIMECODE, some_metric_key]) stats_writers[2].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) # File 3: Wrong Header Names [StatsFileCorrupt] stats_writers[3].writerow([COLUMN_NAME_FPS, '%.10f' % base_timecode.get_framerate()]) stats_writers[3].writerow( [COLUMN_NAME_TIMECODE, COLUMN_NAME_FRAME_NUMBER, some_metric_key]) stats_writers[3].writerow( [some_frame_key, some_frame_timecode.get_timecode(), some_metric_value]) for stats_file in stats_files: stats_file.close() stats_files = [open(stats_file, 'rt') for stats_file in TEST_STATS_FILES] with pytest.raises(StatsFileCorrupt): stats_manager.load_from_csv(stats_files[0], base_timecode) with pytest.raises(StatsFileCorrupt): stats_manager.load_from_csv(stats_files[1], base_timecode) with pytest.raises(StatsFileFramerateMismatch): stats_manager.load_from_csv(stats_files[2], base_timecode) with pytest.raises(StatsFileCorrupt): stats_manager.load_from_csv(stats_files[3], base_timecode) finally: for stats_file in stats_files: stats_file.close() for stats_file in TEST_STATS_FILES: os.remove(stats_file)