Index: shared/scripts/names.py =================================================================== diff -u -rec74ed46e9862a986f3a0c7e9c6520eefc056650 -r2eadee44ce8be006bae5ae6692b54e33e64c5086 --- shared/scripts/names.py (.../names.py) (revision ec74ed46e9862a986f3a0c7e9c6520eefc056650) +++ shared/scripts/names.py (.../names.py) (revision 2eadee44ce8be006bae5ae6692b54e33e64c5086) @@ -319,3 +319,22 @@ "ALARM_ID_UNDEFINED" ] +o_create_treatment_button = {"container": o_treatmentHome, "text": "CREATE TREATMENT", "type": "Text", "unnamed": 1 } +o_create_treatment_container = {"container": o_qquickview_alarm, "objectName": "TreatmentCreate", "type": "TreatmentCreate" } +o_create_treatment_flickable = {"container": o_create_treatment_container, "id": "_flickable", "type": "Flickable", "unnamed": 1 } +o_create_treatment_saline_bolus_0 = {"container": o_create_treatment_container, "objectName": "_salineBolusRect0", "type": "TouchRect"} +o_create_treatment_saline_bolus_1 = {"container": o_create_treatment_container, "objectName": "_salineBolusRect1", "type": "TouchRect"} +o_create_treatment_saline_bolus_2 = {"container": o_create_treatment_container, "objectName": "_salineBolusRect2", "type": "TouchRect"} +o_create_treatment_acid_0 = {"container": o_create_treatment_container, "objectName": "_acidConcentrateRect0", "type": "TouchRect"} +o_create_treatment_acid_1 = {"container": o_create_treatment_container, "objectName": "_acidConcentrateRect1", "type": "TouchRect"} +o_create_treatment_acid_2 = {"container": o_create_treatment_container, "objectName": "_acidConcentrateRect2", "type": "TouchRect"} +o_create_treatment_bicarbonate_0 = {"container": o_create_treatment_container, "objectName": "_bicarbonateConcentrateRect0", "type": "TouchRect"} +o_create_treatment_dialyzer_0 = {"container": o_create_treatment_container, "objectName": "_dialyzerTypeRect0", "type": "TouchRect"} +o_create_treatment_dialyzer_1 = {"container": o_create_treatment_container, "objectName": "_dialyzerTypeRect1", "type": "TouchRect"} +o_create_treatment_dialyzer_2 = {"container": o_create_treatment_container, "objectName": "_dialyzerTypeRect2", "type": "TouchRect"} +o_create_treatment_dialyzer_3 = {"container": o_create_treatment_container, "objectName": "_dialyzerTypeRect3", "type": "TouchRect"} +o_create_treatment_continue = {"container": o_create_treatment_container, "objectName": "_continueButton", "type": "TouchRect"} +o_create_treatment_rinseback = {"container": o_create_treatment_container, "objectName": "_rinsebackFlowRate", "type": "SliderCreateTreatment"} + +o_create_treatment_confirm_container = {"container": o_qquickview_alarm, "objectName": "TreatmentConfirm", "type": "TreatmentConfirm" } +o_create_treatment_confirm = {"container": o_create_treatment_confirm_container, "objectName": "_continueRect", "type": "TouchRect"} Index: suite.conf =================================================================== diff -u -rf32e3b65bfcf747b049f76b3b5d2384ab37f4c4b -r2eadee44ce8be006bae5ae6692b54e33e64c5086 --- suite.conf (.../suite.conf) (revision f32e3b65bfcf747b049f76b3b5d2384ab37f4c4b) +++ suite.conf (.../suite.conf) (revision 2eadee44ce8be006bae5ae6692b54e33e64c5086) @@ -1,10 +1,10 @@ -AUT=denali -u +AUT=denaliSquish CWD= ENVVARS=envvars HOOK_SUB_PROCESSES=false IMPLICITAUTSTART=0 LANGUAGE=Python OBJECTMAPSTYLE=script -TEST_CASES=tst_Internals tst_HomeScreen tst_ServiceShutdown tst_TreatmentScreen tst_Treatment_Section_BloodDialysate tst_Treatment_BloodDialysateFlowRate tst_Treatment_Time tst_Treatment_Ultrafiltration tst_Treatment_PressureOcclusion tst_Treatment_ParametersRange tst_Treatment_Adjustment_BloodDialysate tst_Treatment_Adjustment_Duration tst_Treatment_Adjustment_Ultrafiltration tst_TreatmentStatesData tst_DGDrainPumpData tst_DGHeatersData tst_DGLoadCellReadingsData tst_DGPressureData tst_DGTemperaturesData tst_DGROPumpData tst_DGReservoirData tst_case2 tst_DGValvesStatesData tst_DGOperationMode tst_HDOperationModeData tst_HDOutletFlowData tst_HDPressureOcclusionData tst_CANBusFaultCount tst_DebugText tst_Alarm_Colors tst_AlarmStatusData tst_AlarmTriggered tst_AlarmCleared +TEST_CASES=tst_Internals tst_HomeScreen tst_ServiceShutdown tst_TreatmentScreen tst_Treatment_Section_BloodDialysate tst_Treatment_BloodDialysateFlowRate tst_Treatment_Time tst_Treatment_Ultrafiltration tst_Treatment_PressureOcclusion tst_Treatment_ParametersRange tst_Treatment_Adjustment_BloodDialysate tst_Treatment_Adjustment_Duration tst_Treatment_Adjustment_Ultrafiltration tst_TreatmentStatesData tst_DGDrainPumpData tst_DGHeatersData tst_DGLoadCellReadingsData tst_DGPressureData tst_DGTemperaturesData tst_DGROPumpData tst_DGReservoirData tst_case2 tst_DGValvesStatesData tst_DGOperationMode tst_HDOperationModeData tst_HDOutletFlowData tst_HDPressureOcclusionData tst_CANBusFaultCount tst_DebugText tst_Alarm_Colors tst_AlarmStatusData tst_AlarmTriggered tst_AlarmCleared tst_CreateTreatment VERSION=3 WRAPPERS=Qt Index: tools/setup_env.sh =================================================================== diff -u -r0641bc72e2338b37ace48847abf301374b6620f6 -r2eadee44ce8be006bae5ae6692b54e33e64c5086 --- tools/setup_env.sh (.../setup_env.sh) (revision 0641bc72e2338b37ace48847abf301374b6620f6) +++ tools/setup_env.sh (.../setup_env.sh) (revision 2eadee44ce8be006bae5ae6692b54e33e64c5086) @@ -20,5 +20,5 @@ rm -rf venv virtualenv --python=python3.6 venv source venv/bin/activate -branch="master" +branch="DEN-4344_Sprint_25" pip3 install git+ssh://git@192.168.10.132:7999/vv/dialin.git@$branch Index: tst_CreateTreatment/config.xml =================================================================== diff -u --- tst_CreateTreatment/config.xml (revision 0) +++ tst_CreateTreatment/config.xml (revision 2eadee44ce8be006bae5ae6692b54e33e64c5086) @@ -0,0 +1,10 @@ + + + + + + +CreateTreatment + + + Index: tst_CreateTreatment/test.py =================================================================== diff -u --- tst_CreateTreatment/test.py (revision 0) +++ tst_CreateTreatment/test.py (revision 2eadee44ce8be006bae5ae6692b54e33e64c5086) @@ -0,0 +1,321 @@ +# -*- coding: utf-8 -*-" + +import names + +from dialin.squish import utils +from dialin.ui.hd_proxy import HDSimulator +from dialin.common.msg_defs import RequestRejectReasons +from time import sleep + + +slider_ranges = { + "bloodFlowRateMin": 100, + "bloodFlowRateMax": 500, + "dialysateFlowRateMin": 100, + "dialysateFlowRateMax": 600, + "durationMin": 60, + "durationMax": 480, + "heparinDispensingRateMin": 0, + "heparinDispensingRateMax": 1000, + "heparinBolusVolumeMin": 100, + "heparinBolusVolumeMax": 2000, + "heparinStopTimeMin": 1000, + "heparinStopTimeMax": 2000, + "salineBolusOptions": [ + "100 mL", + "200 mL", + "300 mL" + ], + "acidConcentrateOptions": [ + "08-1251-1", + "08-2251-0", + "08-3251-9" + ], + "bicarbonateConcentrateOptions": [ + "Dimesol - BC-201" + ], + "dialyzerTypeOptions": [ + "Nipro Elisio-H 17", + "Nipro Elisio-H 19", + "Fresenius Optiflux F160NRe", + "Fresenius Optiflux F180NRe" + ], + "dialysateTempMin": 35, + "dialysateTempMax": 39, + "arterialPressureLimitLowMin": -300, + "arterialPressureLimitLowMax": 200, + "arterialPressureLimitHighMin": -300, + "arterialPressureLimitHighMax": 200, + "venousPressureLimitLowMin": -100, + "venousPressureLimitLowMax": 600, + "venousPressureLimitHighMin": 0, + "venousPressureLimitHighMax": 600, + "bloodPressureMeasureIntervalMin": 0, + "bloodPressureMeasureIntervalMax": 30, + "rinsebackFlowRateMin": 50, + "rinsebackFlowRateMax": 150 +} + + + +def test_load_create_treatment(): + """ + Tests that we can load the create treatment page. + + @return: None + """ + mouseClick(waitForObject(names.o_create_treatment_button)) + test.compare(waitForObjectExists(names.o_create_treatment_flickable).visible, True, "Create treatment page loads") + +def test_parameters_exist(): + """ + Tests that all treatment parameter components exist on the treatment parameters page. + + @return: None + """ + + parameter_names = { + "_bloodFlowRate": "SliderCreateTreatment", + "_dialysateFlowRate": "SliderCreateTreatment", + "_duration": "SliderCreateTreatment", + "_heparinDispensingRate": "SliderCreateTreatment", + "_heparinBolusVolume": "SliderCreateTreatment", + "_heparinStopTime": "SliderCreateTreatment", + + "_salineBolusRect": "RectSelectCreateTreatment", + "_acidConcentrateRect": "RectSelectCreateTreatment", + "_bicarbonateConcentrateRect": "RectSelectCreateTreatment", + "_dialyzerTypeRect": "RectSelectCreateTreatment", + + "_dialysateTemperature": "SliderCreateTreatment", + "_arterialPressureLimits": "SliderDoubleCreateTreatment", + "_venousPressureLimits": "SliderDoubleCreateTreatment", + + "_bloodPressureMeasurementInterval": "SliderCreateTreatment", + "_rinsebackFlowRate": "SliderCreateTreatment", + "_continueButton": "TouchRect", + + } + + for parameter_name, type_name in parameter_names.items(): + test.compare(waitForObjectExists({ + "container": names.o_create_treatment_container, + "objectName": parameter_name, + "type": type_name + }).visible, True, "Found " + parameter_name) + +def test_sliders(): + """ + Tests that all sliders have the correct min / max values and that the selected value is displayed correctly. + + @return: None + """ + + + sliders = { + "_bloodFlowRate": {"min": slider_ranges["bloodFlowRateMin"], "max": slider_ranges["bloodFlowRateMax"], "units": " mL/min" }, + "_dialysateFlowRate": {"min": slider_ranges["dialysateFlowRateMin"], "max": slider_ranges["dialysateFlowRateMax"], "units": " mL/min" }, + "_duration": {"min": slider_ranges["durationMin"], "max": slider_ranges["durationMax"], "units": " min" }, + "_heparinDispensingRate": {"min": slider_ranges["heparinDispensingRateMin"], "max": slider_ranges["heparinDispensingRateMax"], "units": " mL/hr" }, + "_heparinBolusVolume": {"min": slider_ranges["heparinBolusVolumeMin"], "max": slider_ranges["heparinBolusVolumeMax"], "units": " mL" }, + "_heparinStopTime": {"min": slider_ranges["heparinStopTimeMin"], "max": slider_ranges["heparinStopTimeMax"], "units": " min" }, + "_dialysateTemperature": {"min": slider_ranges["dialysateTempMin"], "max": slider_ranges["dialysateTempMax"], "units": " C" }, + "_arterialPressureLimitsLow": {"min": slider_ranges["arterialPressureLimitLowMin"], "max": slider_ranges["arterialPressureLimitLowMax"], "units": " mmHg" }, + "_arterialPressureLimitsHigh": {"min": slider_ranges["arterialPressureLimitHighMin"], "max": slider_ranges["arterialPressureLimitHighMax"], "units": " mmHg" }, + "_venousPressureLimitsLow": {"min": slider_ranges["venousPressureLimitLowMin"], "max": slider_ranges["venousPressureLimitLowMax"], "units": " mmHg" }, + "_venousPressureLimitsHigh": {"min": slider_ranges["venousPressureLimitHighMin"], "max": slider_ranges["venousPressureLimitHighMax"], "units": " mmHg" }, + "_bloodPressureMeasurementInterval": {"min": slider_ranges["bloodPressureMeasureIntervalMin"], "max": slider_ranges["bloodPressureMeasureIntervalMax"], "units": " min" }, + "_rinsebackFlowRate": {"min": slider_ranges["rinsebackFlowRateMin"], "max": slider_ranges["rinsebackFlowRateMax"], "units": " mL/min" }, + } + + for slider_name, slider_info in sliders.items(): + if slider_name == "_heparinStopTime": + flick(waitForObject(names.o_create_treatment_flickable), 0, 700) + sleep(1) + if slider_name == "_dialysateTemperature": + flick(waitForObject(names.o_create_treatment_flickable), 0, 700) + sleep(1) + if slider_name == "_arterialPressureLimitsHigh": + flick(waitForObject(names.o_create_treatment_flickable), 0, 400) + sleep(2) + + + + slider_object_name = slider_name + "Slider" + slider_selected_value_object_name = slider_name + "Value" + slider_object = {"container": names.o_create_treatment_container, + "objectName": slider_object_name, + "type": "Slider" } + test.compare(waitForObjectExists(slider_object).visible, True, "Found " + slider_object_name) + + mouseClick(waitForObject(slider_object), waitForObjectExists(slider_object).width / 2, 5, Qt.LeftButton) + + mouseClick(waitForObject(slider_object), 1, 0, Qt.LeftButton) + + + selected_value_object = { + "container": names.o_create_treatment_container, + "objectName": slider_selected_value_object_name, + "type": "Text" + } + + test.compare(waitForObjectExists(selected_value_object).visible, True) + test.compare(waitForObjectExists(selected_value_object).text, "{0}{1}".format(slider_info["min"], slider_info["units"])) + + mouseClick(waitForObject(slider_object), waitForObjectExists(slider_object).width, 0, Qt.LeftButton) + + test.compare(waitForObjectExists(selected_value_object).visible, True) + test.compare(waitForObjectExists(selected_value_object).text, "{0}{1}".format(slider_info["max"], slider_info["units"])) + + +def check_button_group(buttons, slider_ranges_key): + for idx, btn in enumerate(buttons): + + mouseClick(waitForObject(btn), + waitForObjectExists(btn).width / 2, + waitForObjectExists(btn).height / 2, + Qt.LeftButton) + + test.compare(waitForObjectExists(btn).text.text, slider_ranges[slider_ranges_key][idx]) + +def test_rects(): + """ + Tests that all possible non-slider options are shown. + + @return: None + """ + + flick(waitForObject(names.o_create_treatment_flickable), 0, -1400) + # saline bolus + + saline_bolus_buttons = [ + names.o_create_treatment_saline_bolus_0, + names.o_create_treatment_saline_bolus_1, + names.o_create_treatment_saline_bolus_2 + ] + + check_button_group(saline_bolus_buttons, "salineBolusOptions") + sleep(2) + + flick(waitForObject(names.o_create_treatment_flickable), 0, 300) + + # acid concentrate + acid_options = [ + names.o_create_treatment_acid_0, + names.o_create_treatment_acid_1, + names.o_create_treatment_acid_2 + ] + + check_button_group(acid_options, "acidConcentrateOptions") + + sleep(2) + + flick(waitForObject(names.o_create_treatment_flickable), 0, 400) + + # bicarbonate concentrate + bicarbonate_options = [ + names.o_create_treatment_bicarbonate_0 + ] + check_button_group(bicarbonate_options, "bicarbonateConcentrateOptions") + + # dialyzer type + dialyzer_options = [ + names.o_create_treatment_dialyzer_0, + names.o_create_treatment_dialyzer_1, + names.o_create_treatment_dialyzer_2, + names.o_create_treatment_dialyzer_3, + ] + + check_button_group(dialyzer_options, "dialyzerTypeOptions") + +def test_continue_failure(): + """ + Tests that continue is disabled by default + Simulates a FW response that all parameters are invalid prior to selection. + + @return: None + """ + flick(waitForObject(names.o_create_treatment_flickable), 0, 1800) + + # check that UI didn't change the page after prematurely clicking continue + test.compare(waitForObject(names.o_create_treatment_continue).visible, True) + mouseClick(waitForObject(names.o_create_treatment_continue)) + test.compare(waitForObject(names.o_create_treatment_continue).visible, True) + test.compare(waitForObject(names.o_create_treatment_rinseback).visible, True) + + # simulate FW response that all parameters are invalid + hd_simulator = HDSimulator() + + reject_reasons = [ + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE + ] * hd_simulator.NUM_TREATMENT_PARAMETERS + + test.compare(hd_simulator.cmd_send_treatment_parameter_validation_response(reject_reasons), + True, + "Simulate HD treatment param response") + + flick(waitForObject(names.o_create_treatment_flickable), 0, -1800) + + +def test_continue_success(): + """ + Tests that selecting the continue button moves to the treatment confirm page + Assumes all treatment parameters have already been selected + + @return: None + """ + + flick(waitForObject(names.o_create_treatment_flickable), 0, 700) + + mouseClick(waitForObject(names.o_create_treatment_continue)) + + sleep(0.05) + + # simulate FW response that all parameters are valid + hd_simulator = HDSimulator() + + reject_reasons = [ + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # overall response + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # blood flow + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # dialysate flow + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # duration + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # heparin dispensing rate + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # heparin bolus volume + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # heparin stop time + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # saline bolus + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # acid concentrate + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # bicarbonate concentrate + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # dialyzer type + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # dialysate temperature + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # arterial pressure limit low + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # arterial pressure limit high + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # venous pressure limit low + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # venous pressure limit high + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # blood pressure measurement interval + RequestRejectReasons.REQUEST_REJECT_REASON_NONE, # rinseback flow rate + + ] + + hd_simulator.cmd_send_treatment_parameter_validation_response(reject_reasons) + + sleep(1) + + test.compare(waitForObjectExists(names.o_create_treatment_confirm).visible, True) + +def main(): + utils.tstStart(__file__) + startApplication(names.AUT_NAME + " -q") + sleep(1) + test_load_create_treatment() + sleep(1) + test_continue_failure() + + sleep(1) + test_parameters_exist() + test_sliders() + test_rects() + + test_continue_success() + + utils.tstDone() + Index: tst_Internals/test.py =================================================================== diff -u -r2ef15fa5a3d4c92513a2b99733adfa2fff11478e -r2eadee44ce8be006bae5ae6692b54e33e64c5086 --- tst_Internals/test.py (.../test.py) (revision 2ef15fa5a3d4c92513a2b99733adfa2fff11478e) +++ tst_Internals/test.py (.../test.py) (revision 2eadee44ce8be006bae5ae6692b54e33e64c5086) @@ -12,21 +12,19 @@ # author Behrouz NematiPour # -import names -if names.DIALIN_LINK: - from dialin.squish import utils - from dialin.squish import unittests - from dialin.squish import denaliMessages -else: - import utils - import unittests - import denaliMessages +from dialin.squish import utils +from dialin.squish import unittests +from dialin.utils.base import is_interface_present, is_interface_up + def main(): utils.tstStart(__file__) unittests.test_python_version() unittests.test_crc8() + test.compare(is_interface_present("can0"), True, "CAN interface is present") + test.compare(is_interface_up("can0"), True, "CAN interface is up") + utils.tstDone() \ No newline at end of file