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)
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)
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()
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()
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
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
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
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)
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