Index: sources/model/mtreatmentparameters.h =================================================================== diff -u -rc71deaab48699cffdf9db816dfac2778d79c2238 -r9612f309f51323d5f89fa7acd64acb3e355380e2 --- sources/model/mtreatmentparameters.h (.../mtreatmentparameters.h) (revision c71deaab48699cffdf9db816dfac2778d79c2238) +++ sources/model/mtreatmentparameters.h (.../mtreatmentparameters.h) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) @@ -32,6 +32,28 @@ qint32 venousPressureLimitHigh = 0; // mmHg quint32 bloodPressureMeasureInterval = 0; // minutes quint32 rinsebackFlowRate = 0; // mL/min + + bool operator == (const Data &other) const { + if (other.bloodFlowRate != bloodFlowRate) return false; + if (other.dialysateFlowRate != dialysateFlowRate) return false; + if (other.duration != duration) return false; + if (other.heparinDispensingRate != heparinDispensingRate) return false; + if (other.heparinBolusVolume != heparinBolusVolume) return false; + if (other.heparinStopTime != heparinStopTime) return false; + if (other.salineBolus != salineBolus) return false; + if (other.acidConcentrate != acidConcentrate) return false; + if (other.bicarbonateConcentrate != bicarbonateConcentrate) return false; + if (other.dialyzerType != dialyzerType) return false; + if (other.dialysateTemp != dialysateTemp) return false; + if (other.arterialPressureLimitLow != arterialPressureLimitLow) return false; + if (other.arterialPressureLimitHigh != arterialPressureLimitHigh) return false; + if (other.venousPressureLimitLow != venousPressureLimitLow) return false; + if (other.venousPressureLimitHigh != venousPressureLimitHigh) return false; + if (other.bloodPressureMeasureInterval != bloodPressureMeasureInterval) return false; + if (other.rinsebackFlowRate != rinsebackFlowRate) return false; + return true; + } + }; Data data; Index: sources/view/VCreateTreatment.cpp =================================================================== diff -u -r542278273f3d13ad5fb5ba8916178d747c78fe77 -r9612f309f51323d5f89fa7acd64acb3e355380e2 --- sources/view/VCreateTreatment.cpp (.../VCreateTreatment.cpp) (revision 542278273f3d13ad5fb5ba8916178d747c78fe77) +++ sources/view/VCreateTreatment.cpp (.../VCreateTreatment.cpp) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) @@ -29,11 +29,10 @@ * Loads treatment parameters from a json file * \return QJsonObject holding the treatment parameters */ -QJsonObject VCreateTreatment::loadTreatmentParameterRanges() +QJsonObject VCreateTreatment::loadTreatmentParameterRanges(const QString &path) { - // coco begin validated: The treatment parameters file needs to be present QJsonObject obj; - if (!FileHandler::readJSON(Treatment_Parameter_Ranges_Path, obj)) + if (!FileHandler::readJSON(path, obj)) { // TODO: notify user } @@ -71,8 +70,6 @@ _salineBolusOptions = jsonArrayToStringList(value.toArray()); else if (key == GET_VARIABLE_NAME(acidConcentrateOptions)) _acidConcentrateOptions = jsonArrayToStringList(value.toArray()); - else if (key == GET_VARIABLE_NAME(acidConcentrateOptions)) - _acidConcentrateOptions = jsonArrayToStringList(value.toArray()); else if (key == GET_VARIABLE_NAME(bicarbonateConcentrateOptions)) _bicarbonateConcentrateOptions = jsonArrayToStringList(value.toArray()); else if (key == GET_VARIABLE_NAME(dialyzerTypeOptions)) @@ -118,8 +115,6 @@ } return obj; - - // coco end } /** @@ -264,11 +259,12 @@ * Slot to handle a validation response from FW * \param actionType The action type must be a create treatment response * \param messageData The message data must contain the reject reason codes for all parameters + * \returns True if FW OK's treatment parameters, false otherwise */ -void VCreateTreatment::onFWValidationResponse(GuiActionType actionType, QVariantList messageData) { +bool VCreateTreatment::onFWValidationResponse(GuiActionType actionType, QVariantList messageData) { if (actionType != GuiActionType::ID_CreateTreatmentRsp) - return; + return false; Model::TreatmentParametersResp response; TreatmentParametersRespData data = response.fromVariantList(messageData); @@ -352,6 +348,8 @@ if (success) emit showConfirm(); + return success; + } /** Index: sources/view/VCreateTreatment.h =================================================================== diff -u -r542278273f3d13ad5fb5ba8916178d747c78fe77 -r9612f309f51323d5f89fa7acd64acb3e355380e2 --- sources/view/VCreateTreatment.h (.../VCreateTreatment.h) (revision 542278273f3d13ad5fb5ba8916178d747c78fe77) +++ sources/view/VCreateTreatment.h (.../VCreateTreatment.h) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) @@ -96,7 +96,7 @@ TreatmentData treatmentData; bool validate(const TreatmentData &vData); QString saveNewTreatment(QJsonObject obj); - QJsonObject loadTreatmentParameterRanges(); + QJsonObject loadTreatmentParameterRanges(const QString &path = Treatment_Parameter_Ranges_Path); QStringList jsonArrayToStringList(const QJsonArray &arr); bool indexInItems(quint32 idx, const QStringList &items); void setTreatmentData(); @@ -134,7 +134,7 @@ void onFinishedConfirm(); void onFinishedPrime(); void onStart(); - void onFWValidationResponse(GuiActionType actionType, QVariantList messageData); + bool onFWValidationResponse(GuiActionType actionType, QVariantList messageData); void onUserModifiedParameters(); }; Index: unittests/tst_views.cpp =================================================================== diff -u -r542278273f3d13ad5fb5ba8916178d747c78fe77 -r9612f309f51323d5f89fa7acd64acb3e355380e2 --- unittests/tst_views.cpp (.../tst_views.cpp) (revision 542278273f3d13ad5fb5ba8916178d747c78fe77) +++ unittests/tst_views.cpp (.../tst_views.cpp) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) @@ -117,6 +117,7 @@ QCOMPARE(view.isbloodPressureMeasureIntervalSet, true); QCOMPARE(view.isrinsebackFlowRateSet, true); QCOMPARE(view.validate(view.treatmentData), true); + view.onFinishedCreate(); } else { QCOMPARE(view.validate(view.treatmentData), false); @@ -155,33 +156,107 @@ } /*! + * \brief tst_views::VCreateTreatment_init_ranges + * Initializes the treatment parameter ranges + * \param obj - QJsonObject to write the ranges to + */ +void tst_views::VCreateTreatment_init_ranges(QJsonObject &obj) +{ + obj["bloodFlowRateMin"] = 100; + obj["bloodFlowRateMax"] = 500; + obj["dialysateFlowRateMin"] = 100; + obj["dialysateFlowRateMax"] = 600; + obj["durationMin"] = 60; + obj["durationMax"] = 480; + obj["heparinDispensingRateMin"] = 0; + obj["heparinDispensingRateMax"] = 1000; + obj["heparinBolusVolumeMin"] = 100; + obj["heparinBolusVolumeMax"] = 2000; + obj["heparinStopTimeMin"] = 1000; + obj["heparinStopTimeMax"] = 2000; + obj["salineBolusOptions"] = QJsonArray({ + "100 mL", + "200 mL", + "300 mL" + }); + obj["acidConcentrateOptions"] = QJsonArray({ + "08-1251-1", + "08-2251-0", + "08-3251-9" + }), + obj["bicarbonateConcentrateOptions"] = QJsonArray({ + "Dimesol - BC-201" + }), + obj["dialyzerTypeOptions"] = QJsonArray({ + "Nipro Elisio-H 17", + "Nipro Elisio-H 19", + "Fresenius Optiflux F160NRe", + "Fresenius Optiflux F180NRe" + }); + obj["dialysateTempMin"] = 35; + obj["dialysateTempMax"] = 39; + obj["arterialPressureLimitLowMin"] = -300; + obj["arterialPressureLimitLowMax"] = 200; + obj["arterialPressureLimitHighMin"] = -300; + obj["arterialPressureLimitHighMax"] = 200; + obj["venousPressureLimitLowMin"] = -100; + obj["venousPressureLimitLowMax"] = 600; + obj["venousPressureLimitHighMin"] = 0; + obj["venousPressureLimitHighMax"] = 600; + obj["bloodPressureMeasureIntervalMin"] = 0; + obj["bloodPressureMeasureIntervalMax"] = 30; + obj["rinsebackFlowRateMin"] = 50; + obj["rinsebackFlowRateMax"] = 150; +} + +/*! * \brief tst_views::VCreateTreatment_validation_ranges * Tests the treatment parameter validation ranges are checked */ void tst_views::VCreateTreatment_validation_ranges() { View::VCreateTreatment view; - view.set_bloodFlowRate(-1); - view.set_dialysateFlowRate(-1); - view.set_duration(-1); - view.set_heparinDispensingRate(-1); - view.set_heparinBolusVolume(-1); - view.set_heparinStopTime(-1); + // adjust quint32 minimums + view.bloodFlowRateMin(1); + view.dialysateFlowRateMin(1); + view.durationMin(1); + view.heparinDispensingRateMin(2); + view.heparinBolusVolumeMin(1); + view.heparinStopTimeMin(1); + + view.dialysateTempMin(1); + view.arterialPressureLimitLowMin(2); + view.arterialPressureLimitHighMin(2); + view.venousPressureLimitLowMin(2); + view.venousPressureLimitHighMin(2); + view.bloodPressureMeasureIntervalMin(2); + view.rinsebackFlowRateMin(1); + + // setters + view.set_bloodFlowRate(0); + view.set_dialysateFlowRate(0); + view.set_duration(0); + view.set_heparinDispensingRate(1); + + view.set_heparinBolusVolume(0); + view.set_heparinStopTime(0); view.set_salineBolusVolume(-1); view.set_acidConcentrate(-1); view.set_bicarbonateConcentrate(-1); view.set_dialyzerType(-1); - view.set_dialysateTemp(-1); - view.set_arterialPressureLimitLow(-1); - view.set_arterialPressureLimitHigh(-1); - view.set_venousPressureLimitLow(-1); - view.set_venousPressureLimitHigh(-1); + view.set_dialysateTemp(0); + view.set_arterialPressureLimitLow(1); + view.set_arterialPressureLimitHigh(1); + view.set_venousPressureLimitLow(1); + view.set_venousPressureLimitHigh(1); - view.set_bloodPressureMeasureInterval(-1); - view.set_rinsebackFlowRate(-1); + view.set_bloodPressureMeasureInterval(1); + view.set_rinsebackFlowRate(0); + view.setTreatmentData(); + QCOMPARE(view.isbloodFlowRateSet, true); QCOMPARE(view.isdialysateFlowRateSet, true); QCOMPARE(view.isdurationSet, true); @@ -202,32 +277,45 @@ QCOMPARE(view.validate(view.treatmentData), false); + // edge case when pressure lows are set greater than the highs + view.set_arterialPressureLimitLow(view.arterialPressureLimitHighMin()+1); + view.set_venousPressureLimitLow(view.venousPressureLimitHighMin()+1); + QCOMPARE(view.validate(view.treatmentData), false); + + view.onResetCreateTreatment(); + + for (int i = 0; i < 17; ++i) { VCreateTreatment_simulate_valid_parameters(view); - if (i == 0) view.set_bloodFlowRate(view.bloodFlowRateMax()+1); - if (i == 1) view.set_dialysateFlowRate(view.dialysateFlowRateMax()+1); - if (i == 2) view.set_duration(view.durationMax()+1); - if (i == 3) view.set_heparinDispensingRate(view.heparinDispensingRateMax()+1); + switch (i) { + case 0: view.set_bloodFlowRate(view.bloodFlowRateMax()+1); break; + case 1: view.set_dialysateFlowRate(view.dialysateFlowRateMax()+1); break; + case 2: view.set_duration(view.durationMax()+1); break; + case 3: view.set_heparinDispensingRate(view.heparinDispensingRateMax()+1); break; - if (i == 4) view.set_heparinBolusVolume(view.heparinBolusVolumeMax()+1); - if (i == 5) view.set_heparinStopTime(view.heparinStopTimeMax()+1); - if (i == 6) view.set_salineBolusVolume(view.salineBolusOptions().length()); - if (i == 7) view.set_acidConcentrate(view.acidConcentrateOptions().length()); - if (i == 8) view.set_bicarbonateConcentrate(view.bicarbonateConcentrateOptions().length()); + case 4: view.set_heparinBolusVolume(view.heparinBolusVolumeMax()+1); break; + case 5: view.set_heparinStopTime(view.heparinStopTimeMax()+1); break; + case 6: view.set_salineBolusVolume(view.salineBolusOptions().length()); break; + case 7: view.set_acidConcentrate(view.acidConcentrateOptions().length()); break; + case 8: view.set_bicarbonateConcentrate(view.bicarbonateConcentrateOptions().length()); break; - if (i == 9) view.set_dialyzerType(view.dialyzerTypeOptions().length()); - if (i == 10) view.set_dialysateTemp(view.dialysateTempMax()+1); - if (i == 11) view.set_arterialPressureLimitLow(view.arterialPressureLimitLowMax()+1); - if (i == 12) view.set_arterialPressureLimitHigh(view.arterialPressureLimitHighMax()+1); - if (i == 13) view.set_venousPressureLimitLow(view.venousPressureLimitLowMax()+1); - if (i == 14) view.set_venousPressureLimitHigh(view.venousPressureLimitHighMax()+1); + case 9: view.set_dialyzerType(view.dialyzerTypeOptions().length()); break; + case 10: view.set_dialysateTemp(view.dialysateTempMax()+1); break; + case 11: view.set_arterialPressureLimitLow(view.arterialPressureLimitLowMax()+1); break; + case 12: view.set_arterialPressureLimitHigh(view.arterialPressureLimitHighMax()+1); break; + case 13: view.set_venousPressureLimitLow(view.venousPressureLimitLowMax()+1); break; + case 14: view.set_venousPressureLimitHigh(view.venousPressureLimitHighMax()+1); break; - if (i == 15) view.set_bloodPressureMeasureInterval(view.bloodPressureMeasureIntervalMax()+1); - if (i == 16) view.set_rinsebackFlowRate(view.rinsebackFlowRateMax()+1); + case 15: view.set_bloodPressureMeasureInterval(view.bloodPressureMeasureIntervalMax()+1); break; + case 16: view.set_rinsebackFlowRate(view.rinsebackFlowRateMax()+1); break; + default: break; + } + QCOMPARE(view.validate(view.treatmentData), false); + view.onFinishedCreate(); } } @@ -299,6 +387,8 @@ QCOMPARE(view.jsonArrayToStringList(arr), list); arr << "1"; + QVERIFY(view.jsonArrayToStringList(arr) != list); + list << "1"; QCOMPARE(view.jsonArrayToStringList(arr), list); @@ -315,3 +405,96 @@ } +/*! + * \brief tst_views::VCreateTreatment_fw_validation_response + * Tests handling of a FW validation response and parameter integrity + */ +void tst_views::VCreateTreatment_fw_validation_response() +{ + View::VCreateTreatment view; + GuiActionType action = GuiActionType::ID_CreateTreatmentRsp; + + for (int i = 0; i < 18; ++i) + { + // 0 = OK, 1,2,3 ... parameter is not OK + QVariantList messageData; + if (i == 0) messageData.append(1); else messageData.append(0); + if (i == 1) messageData.append(1); else messageData.append(0); + if (i == 2) messageData.append(1); else messageData.append(0); + if (i == 3) messageData.append(1); else messageData.append(0); + if (i == 4) messageData.append(1); else messageData.append(0); + if (i == 5) messageData.append(1); else messageData.append(0); + if (i == 6) messageData.append(1); else messageData.append(0); + if (i == 7) messageData.append(1); else messageData.append(0); + if (i == 8) messageData.append(1); else messageData.append(0); + if (i == 9) messageData.append(1); else messageData.append(0); + if (i == 10) messageData.append(1); else messageData.append(0); + if (i == 11) messageData.append(1); else messageData.append(0); + if (i == 12) messageData.append(1); else messageData.append(0); + if (i == 13) messageData.append(1); else messageData.append(0); + if (i == 14) messageData.append(1); else messageData.append(0); + if (i == 15) messageData.append(1); else messageData.append(0); + if (i == 16) messageData.append(1); else messageData.append(0); + if (i == 17) messageData.append(1); else messageData.append(0); + QVERIFY(!view.onFWValidationResponse(action, messageData)); + } + + TreatmentData dataBackup = view.treatmentData; + + QVariantList validMessageData; + for (int i = 0; i < 18; ++i) { validMessageData.append(0); } + + QVERIFY(!view.onFWValidationResponse(GuiActionType::ID_CreateTreatmentReq, validMessageData)); + + QVERIFY(view.onFWValidationResponse(GuiActionType::ID_CreateTreatmentRsp, validMessageData)); + + view.saveTreatmentProfile(false); + QVERIFY(!view._saveTreatmentProfile); + view.onFinishedConfirm(); + + view.saveTreatmentProfile(true); + QVERIFY(view._saveTreatmentProfile); + view.onFinishedConfirm(); + + + view.onFinishedSaveNewTreatment(true); + view.onFinishedSaveNewTreatment(false); + view.onFinishedPrime(); + view.onStart(); + + QCOMPARE(view.treatmentData, dataBackup); + +} + +/*! + * \brief tst_views::VCreateTreatment_load_parameter_ranges + * Tests that parameter ranges are loaded correctly from disk. + */ +void tst_views::VCreateTreatment_load_parameter_ranges() +{ + View::VCreateTreatment view; + + QJsonObject obj; + + VCreateTreatment_init_ranges(obj); + + obj["UnexpectedParameter"] = 123; + + QJsonDocument document(obj); + + QString path = "/tmp/ranges.json"; + + _FileSaver.concurrentSave(path, document.toJson(), false); + + QThread::msleep(500); + + QJsonObject readObj = view.loadTreatmentParameterRanges(path); + + QCOMPARE(obj, readObj); + + readObj = view.loadTreatmentParameterRanges("/tmp/wrong_path.json"); + + QVERIFY(obj != readObj); + +} + Index: unittests/tst_views.h =================================================================== diff -u -r542278273f3d13ad5fb5ba8916178d747c78fe77 -r9612f309f51323d5f89fa7acd64acb3e355380e2 --- unittests/tst_views.h (.../tst_views.h) (revision 542278273f3d13ad5fb5ba8916178d747c78fe77) +++ unittests/tst_views.h (.../tst_views.h) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) @@ -39,6 +39,9 @@ void VCreateTreatment_save(); void VCreateTreatment_json(); void VCreateTreatment_enums(); + void VCreateTreatment_fw_validation_response(); + void VCreateTreatment_init_ranges(QJsonObject &obj); + void VCreateTreatment_load_parameter_ranges(); };