180 lines
6.1 KiB
Python
180 lines
6.1 KiB
Python
"""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()
|