Пример #1
0
def test_start_measurement_transition_prevents_start_if_no_sensor_is_connected(
        machine):
    pytest.helpers.transition_machine_to_s1(machine)
    # Unregister connected dummy sensor
    machine.main_window.unregister_sensor()
    # Try and start measurement
    machine.main_window.measurement_widget.start_button.clicked.emit()
    app.processEvents()
    # Machine stays in state s1
    assert machine.in_state(machine.s1)
Пример #2
0
def test_start_measurement_transition_prevents_start_if_no_patient_is_selected(
    machine_without_patient, ):
    pytest.helpers.transition_machine_to_s1(machine_without_patient)
    machine = machine_without_patient
    machine.patient_id = ''
    # Try and start measurement
    machine.main_window.measurement_widget.start_button.clicked.emit()
    app.processEvents()
    # Machine stays in state s1
    assert machine.in_state(machine.s1)
Пример #3
0
def machine_without_patient(producer_process, database_fixture):
    state_machine = StateMachine(database=database_fixture)
    state_machine.session = add_session(database_fixture)
    logger.register_machine(state_machine)
    state_machine.main_window.producer_process = producer_process
    state_machine.start()
    app.processEvents()
    yield state_machine
    # kill producer
    if state_machine.producer_process.is_alive():
        state_machine.producer_process.join()
    state_machine.stop()
Пример #4
0
def machine(producer_process, database_fixture):
    state_machine = StateMachine(database=database_fixture)
    state_machine.session = add_session(database_fixture)
    state_machine.patient_id = add_patient(database_fixture).patient_id
    logger.register_machine(state_machine)
    state_machine.main_window.producer_process = producer_process
    # Connect and register dummy sensor
    state_machine.main_window.connect_dummy_sensor()
    state_machine.main_window.register_sensor_with_producer()
    state_machine.start()
    app.processEvents()
    yield state_machine
    # Kill producer
    state_machine.producer_process.join()
    state_machine.stop()
Пример #5
0
def test_stop_measurement_pauses_producer_and_inserts_measurements_to_database(machine):
    pytest.helpers.transition_machine_to_s1(machine)
    # start measurement for 2 seconds
    machine.main_window.measurement_widget.start_button.clicked.emit()
    time.sleep(2)
    app.processEvents()
    # stop measurement
    machine.main_window.measurement_widget.stop_button.clicked.emit()
    app.processEvents()
    assert machine.producer_process.is_alive()
    with session_scope(machine.database) as s:
        measurements = (
            s.query(Measurement)
            .filter(Measurement.document_id == machine.document.document_id)
            .all()
        )
        assert len(measurements) > 0
Пример #6
0
def test_transition_from_initial_state_to_note_state_and_back_to_initial_state(machine):
    pytest.helpers.transition_machine_to_s1(machine)
    # Assign document
    machine.document = machine.s2.create_document()
    # Enter sensor info and document
    machine.sensor.enter_info_to_database(machine.database)
    machine.database.insert(machine.document)
    # Generate and enter data
    n = 10
    time_s = list(range(n))
    torque_Nm = list(range(n))
    machine.document.insert_time_series(machine.database, time_s, torque_Nm)
    # Trigger hidden transition from s1 to s6 (NoteState)
    machine._s1_to_s6_signal.emit()
    assert machine.in_state(machine.s6)
    # Enter data
    notes = 'pytest'
    full_turn_count = 1
    machine.s6.dialog.notes = notes
    machine.s6.dialog.full_turn_count = full_turn_count
    # Trigger transition from s6 to s7 (i.e., click Ok on NotesWindow)
    machine.s6.signal_ok.emit()
    app.processEvents()
    # Trigger transition back to s6 (i.e., click No on "are you sure?" prompt)
    machine.s7.signal_no.emit()
    app.processEvents()
    # Verify data is reset
    assert machine.s6.dialog.notes == ''
    assert machine.s6.dialog.full_turn_count == 0
    machine.s6.dialog.notes = notes
    machine.s6.dialog.full_turn_count = full_turn_count
    # Trigger transition from s6 to s7 (i.e., click Ok on NotesWindow)
    machine.s6.signal_ok.emit()
    app.processEvents()
    # Trigger transition from s7 to s1 (i.e., click Yes on "are you sure?" prompt)
    machine.s7.signal_yes.emit()
    app.processEvents()
    assert machine.in_state(machine.s1)
    # Verify that document updates were entered to database
    with session_scope(machine.database) as s:
        document = (
            s.query(Document)
            .filter(Document.document_id == machine.document.document_id)
            .first()
        )
        assert document.notes == notes
        assert float(document.full_turn_count) == full_turn_count
    # Re-enter note state and verify that data have been reset
    machine._s1_to_s6_signal.emit()
    assert machine.in_state(machine.s6)
    assert machine.s6.dialog.notes == ''
    assert machine.s6.dialog.full_turn_count == 0
Пример #7
0
def test_start_measurement_inserts_document_and_sensor_info_to_database(machine):
    pytest.helpers.transition_machine_to_s1(machine)
    # Start measurement
    machine.main_window.measurement_widget.start_button.clicked.emit()
    app.processEvents()
    assert machine.document is not None
    with session_scope(machine.database) as s:
        document = s.query(Document).first()
        assert document.document_id == machine.document.document_id
        # Verify patient, distractor and operator
        assert document.patient_id == machine.patient_id
        assert document.distractor_number == machine.distractor
        assert document.operator == machine.operator
        assert document.sensor_serial_number
        sensor_info = (
            s.query(SensorInfo)
            .filter(SensorInfo.sensor_serial_number == document.sensor_serial_number)
            .all()
        )
        assert len(sensor_info) == 1
Пример #8
0
def test_event_detection_state_default_region_count_equals_turns_in_full_turn(
    database_fixture,
):
    state_machine = StateMachine(database=database_fixture)
    state_machine.document, *_ = pytest.helpers.add_document_and_foreign_keys(
        database_fixture
    )
    state = state_machine.s3
    sensor_info = state.document.get_related_sensor_info(
        database=state_machine.database
    )
    # generate and enter data
    n = 10
    state.document.insert_time_series(
        state_machine.database, list(range(n)), list(range(n))
    )
    # trigger entry with dummy event
    event = QEvent(QEvent.None_)
    state.onEntry(event)
    app.processEvents()
    assert state.region_count() == int(sensor_info.turns_in_full_turn)
Пример #9
0
def test_event_detection_state_flow(machine, qtbot):
    pytest.helpers.transition_machine_to_s1(machine)
    # Assign document
    machine.document = machine.s2.create_document()
    # Enter sensor info and document
    machine.sensor.enter_info_to_database(machine.database)
    machine.database.insert(machine.document)
    # Generate and enter data
    n = 10
    time_s = list(range(n))
    torque_Nm = list(range(n))
    machine.document.insert_time_series(machine.database, time_s, torque_Nm)
    # Trigger hidden transition from s1 to s3 (EventDetectionState)
    machine._s1_to_s3_signal.emit()
    app.processEvents()
    # Note that regions (sensor_info.turns_in_full_turn) are created on state entry
    region_count = machine.s3.region_count()
    # Remove regions
    machine.s3.dialog.clear_regions()
    machine.s3.dialog.set_add_count(0)
    assert machine.s3.region_count() == 0
    region_count = 2
    # Increase region count by up arrow press
    for i in range(region_count):
        with qtbot.waitSignal(machine.s3.signal_value_changed):
            qtbot.keyPress(machine.s3.dialog, Qt.Key_Up)
        assert machine.s3.dialog.get_add_count() == i + 1
    # Decrease region count by down arrow press
    for i in reversed(range(region_count)):
        with qtbot.waitSignal(machine.s3.signal_value_changed):
            qtbot.keyPress(machine.s3.dialog, Qt.Key_Down)
        assert machine.s3.dialog.get_add_count() == i
    # Set correct add count
    machine.s3.dialog.set_add_count(region_count)
    # No existing regions -> press enter clicks Add
    with qtbot.waitSignal(machine.s3.signal_add):
        qtbot.keyPress(machine.s3.dialog, Qt.Key_Enter)
    assert machine.s3.region_count() == region_count
    logger.debug('Regions added and asserted')
    # Regions exist -> press enter clicks Ok
    with qtbot.waitSignal(machine.s3.signal_ok):
        qtbot.keyPress(machine.s3.dialog, Qt.Key_Enter)
    assert machine.in_state(machine.s6)
    # Verify that annotated events were entered
    with session_scope(machine.database) as s:
        events = (
            s.query(AnnotatedEvent)
            .filter(AnnotatedEvent.document_id == machine.document.document_id)
            .all()
        )
        assert len(events) == region_count
        region_edits = [
            machine.s3.dialog.get_region_edit(i) for i in range(region_count)
        ]
        # Verify region edges
        for region_edit, event in zip(region_edits, events):
            assert region_edit.left_edge() == event.event_begin
            assert region_edit.right_edge() == event.event_end
    # Trigger transition back to s3 and verify that annotated events were removed
    machine.s6.signal_close.emit()
    assert machine.in_state(machine.s3)
    # Trigger transition back to s6
    with qtbot.waitSignal(machine.s3.signal_ok):
        qtbot.keyPress(machine.s3.dialog, Qt.Key_Enter)
    assert machine.in_state(machine.s6)
    # Trigger transition from s6 to s7 (i.e., click Ok on NotesWindow)
    machine.s6.signal_ok.emit()
    app.processEvents()
    # Trigger transition back to s6 (i.e., click No on "are you sure?" prompt)
    machine.s7.signal_no.emit()
    app.processEvents()
    # Enter data in NotesWindow
    notes = 'foo'
    full_turn_count = 1.2
    machine.s6.dialog.notes = notes
    machine.s6.dialog.full_turn_count = full_turn_count
    # Trigger transition from s6 to s7 (i.e., click Ok on NotesWindow)
    machine.s6.signal_ok.emit()
    app.processEvents()
    # Trigger transition from s7 to s1 (i.e., click Yes on "are you sure?" prompt)
    machine.s7.signal_yes.emit()
    app.processEvents()
    # Verify that document updates were entered to database
    with session_scope(machine.database) as s:
        document = (
            s.query(Document)
            .filter(Document.document_id == machine.document.document_id)
            .first()
        )
        assert document.notes == notes
        assert float(document.full_turn_count) == full_turn_count