"""The review dialog that shows the recorded pictures beside the curve.""" from __future__ import annotations import pytest from review_test_helpers import wait_review from evidence_helpers import multipoint_session from orisys_autocal.session_review import review_session @pytest.fixture def reviewed(tmp_path): root = multipoint_session( tmp_path / "rec", sites=("P1",), repeats=1, levels=(5.0, 10.0)) return root, review_session(root) def _window(review: dict) -> dict: return review["sites"][0]["windows"][1] def test_the_dialog_shows_the_first_frame_of_the_selected_window(qt_app, reviewed): from orisys_autocal.ui.video_review_dialog import VideoReviewDialog root, review = reviewed window = _window(review) dialog = VideoReviewDialog( root, review, trial_id=window["trial_id"], step_index=int(window["step_index"])) try: wait_review(dialog) assert dialog.video is not None assert dialog.location.frame_id > 0 assert dialog.image.pixmap() is not None and not dialog.image.pixmap().isNull() assert "frame" in dialog.position.text().lower() or "帧" in dialog.position.text() assert dialog.slider.maximum() == dialog.video.frame_count - 1 finally: dialog.close() assert dialog.video is None def test_stepping_moves_one_recorded_frame(qt_app, reviewed): from orisys_autocal.ui.video_review_dialog import VideoReviewDialog root, review = reviewed window = _window(review) dialog = VideoReviewDialog( root, review, trial_id=window["trial_id"], step_index=int(window["step_index"])) try: wait_review(dialog) start = dialog.index dialog._step(1) wait_review(dialog) assert dialog.index == start + 1 dialog._step(-1) wait_review(dialog) assert dialog.index == start finally: dialog.close() def test_a_stale_frame_request_is_dropped(qt_app, reviewed): from orisys_autocal.ui.video_review_dialog import VideoReviewDialog root, review = reviewed window = _window(review) dialog = VideoReviewDialog( root, review, trial_id=window["trial_id"], step_index=int(window["step_index"])) try: wait_review(dialog) dialog._request(0) dialog._request(1) wait_review(dialog) assert dialog.index == 1 assert dialog.video.frame_count >= 2 finally: dialog.close() def test_a_recording_without_video_explains_itself(qt_app, tmp_path): from orisys_autocal.ui.video_review_dialog import VideoReviewDialog root = multipoint_session( tmp_path / "rec", sites=("P1",), repeats=1, levels=(5.0,), with_capture=False) review = review_session(root) window = review["sites"][0]["windows"][1] dialog = VideoReviewDialog( root, review, trial_id=window["trial_id"], step_index=int(window["step_index"])) try: wait_review(dialog) assert dialog.video is None assert not dialog.play_button.isEnabled() assert dialog.image.text() assert "no" in dialog.image.text().lower() or "没有" in dialog.image.text() finally: dialog.close() def test_the_hold_review_dialog_offers_the_video_for_the_selected_window(qt_app, reviewed): from orisys_autocal.ui.session_review_dialog import SessionReviewDialog from orisys_autocal.ui.video_review_dialog import VideoReviewDialog root, review = reviewed dialog = SessionReviewDialog(root, review=review) try: assert dialog.video_button.isEnabled() opened = dialog._video() assert isinstance(opened, VideoReviewDialog) wait_review(opened) opened.close() finally: dialog.close() def test_the_record_overview_offers_the_video_action(qt_app, reviewed): from orisys_autocal.ui.record_overview_dialog import RecordOverviewDialog from orisys_autocal.ui.video_review_dialog import VideoReviewDialog root, review = reviewed dialog = RecordOverviewDialog(root, review=review) try: actions = [action.objectName() for action in dialog.tools.menu().actions()] assert "overview_video" in actions dialog.table.clearSelection() dialog.table.setCurrentCell(-1, -1) assert dialog._video() is None assert dialog.notice.text() dialog.table.selectRow(0) opened = dialog._video() assert isinstance(opened, VideoReviewDialog) wait_review(opened) opened.close() finally: dialog.close() def test_an_unclosed_trial_does_not_offer_the_video(qt_app, tmp_path): from orisys_autocal.ui.session_review_dialog import SessionReviewDialog root = multipoint_session( tmp_path / "rec", sites=("P1",), repeats=1, levels=(5.0,), trial_status="incomplete") review = review_session(root) dialog = SessionReviewDialog(root, review=review) try: assert dialog._video() is None assert dialog.message.text() finally: dialog.close() def test_a_closed_aborted_trial_can_be_replayed_for_diagnosis(qt_app, tmp_path): import json from orisys_autocal.ui.record_overview_dialog import RecordOverviewDialog from orisys_autocal.ui.session_review_dialog import SessionReviewDialog root = multipoint_session(tmp_path / "rec", trial_status="incomplete") path = root / "session.json" manifest = json.loads(path.read_text(encoding="utf-8")) manifest["trials"][0].update( capture_status="incomplete", capture_report={"completed": True}) path.write_text(json.dumps(manifest), encoding="utf-8") review = review_session(root) for kind in (SessionReviewDialog, RecordOverviewDialog): dialog = kind(root, review=review) opened = None try: if isinstance(dialog, RecordOverviewDialog): dialog.table.selectRow(0) opened = dialog._video() assert opened is not None wait_review(opened) assert opened.video is not None assert opened.image.pixmap() is not None finally: if opened is not None: opened.close() dialog.close()