/*! * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * \file tst_views.cpp * \author (last) Peter Lucia * \date (last) 15-Oct-2020 * \author (original) Behrouz NematiPour * \date (original) 21-Apr-2020 * */ #include "tst_views.h" // Qt // Project #include "VAdjustmentResponseBase.h" #include "VTreatmentAdjustmentUltrafiltrationState.h" #include "FileHandler.h" #include "VPreTreatmentDisposablesPrimeData.h" #include "VAlarmStatus.h" tst_views::tst_views(QObject *parent) : QObject(parent) { } void tst_views::VTreatmentAdjustmentsResponse_text_NoReason() { View::VAdjustmentResponseBase v; v.adjustment_Reason(GuiRequestReasons::REQUEST_REJECT_REASON_NONE); QVERIFY(v.text().isEmpty()); } void tst_views::VTreatmentAdjustmentsResponse_text_WAReason() { View::VAdjustmentResponseBase v; v.adjustment_Reason(GuiRequestReasons::REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE); QVERIFY(! v.text().isEmpty()); } void tst_views::VTreatmentAdjustmentUltrafiltrationState_text() { View::VTreatmentAdjustmentUltrafiltrationState v; // if accepted then return empty v.adjustment_Accepted(true); v.adjustment_Reason(GuiRequestReasons::REQUEST_REJECT_REASON_NONE); QCOMPARE(v.text(), ""); // try rejected v.adjustment_Accepted(false); // if not accepted and a reason passed then the parent should translate it and return v.adjustment_Reason(GuiRequestReasons::REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE); QCOMPARE(v.text(), tr("REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE")); // if not accepted and not running v.adjustment_Reason(GuiRequestReasons::REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS); QCOMPARE(v.text(), tr("REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS")); // if not accepted and not paused v.adjustment_Reason(GuiRequestReasons::REQUEST_REJECT_REASON_UF_NOT_PAUSED); QCOMPARE(v.text(), tr("REQUEST_REJECT_REASON_UF_NOT_PAUSED")); } /*! * \brief tst_views::VCreateTreatment_validation * Tests treatment parameter validation */ void tst_views::VCreateTreatment_validation() { for (int i = 0; i < 18; ++i) { View::VTreatmentCreate view; if (i != 0) view.bloodFlowRate(view.bloodFlowRateMax()); if (i != 1) view.dialysateFlowRate(view.dialysateFlowRateMax()); if (i != 2) view.duration(view.durationMax()); if (i != 3) view.heparinDispensingRate(view.heparinDispensingRateMax()); if (i != 4) view.heparinBolusVolume(view.heparinBolusVolumeMax()); if (i != 5) view.heparinStopTime(view.heparinStopTimeMax()); if (i != 6) view.salineBolusVolume(view.salineBolusVolumeMax()); if (i != 7) view.acidConcentrate(view.acidConcentrateMax()); if (i != 8) view.bicarbonateConcentrate(view.bicarbonateConcentrateMax()); if (i != 9) view.dialyzerType(view.dialyzerTypeMax()); if (i != 10) view.dialysateTemp(view.dialysateTempMax()); if (i != 11) view.arterialPressureLimitLow(view.arterialPressureLimitLowMin()); if (i != 12) view.arterialPressureLimitHigh(view.arterialPressureLimitHighMax()); if (i != 13) view.venousPressureLimitLow(view.venousPressureLimitLowMin()); if (i != 14) view.venousPressureLimitHigh(view.venousPressureLimitHighMax()); if (i != 15) view.bloodPressureMeasureInterval(view.bloodPressureMeasureIntervalMax()); if (i != 16) view.rinsebackFlowRate(view.rinsebackFlowRateMax()); if (i == 17) { QCOMPARE(view.isbloodFlowRateSet, true); QCOMPARE(view.isdialysateFlowRateSet, true); QCOMPARE(view.isdurationSet, true); QCOMPARE(view.isheparinDispensingRateSet, true); QCOMPARE(view.isheparinBolusVolumeSet, true); QCOMPARE(view.isheparinStopTimeSet, true); QCOMPARE(view.issalineBolusVolumeSet, true); QCOMPARE(view.isacidConcentrateSet, true); QCOMPARE(view.isbicarbonateConcentrateSet, true); QCOMPARE(view.isdialyzerTypeSet, true); QCOMPARE(view.isdialysateTempSet, true); QCOMPARE(view.isarterialPressureLimitLowSet, true); QCOMPARE(view.isarterialPressureLimitHighSet, true); QCOMPARE(view.isvenousPressureLimitLowSet, true); QCOMPARE(view.isvenousPressureLimitHighSet, true); QCOMPARE(view.isbloodPressureMeasureIntervalSet, true); QCOMPARE(view.isrinsebackFlowRateSet, true); QCOMPARE(view.validate(view.treatmentData), true); // check getters QCOMPARE(view.bloodFlowRate(), view.bloodFlowRateMax()); QCOMPARE(view.dialysateFlowRate(), view.dialysateFlowRateMax()); QCOMPARE(view.duration(), view.durationMax()); QCOMPARE(view.heparinDispensingRate(),view.heparinDispensingRateMax()); QCOMPARE(view.heparinBolusVolume(),view.heparinBolusVolumeMax()); QCOMPARE(view.heparinStopTime(),view.heparinStopTimeMax()); QCOMPARE(view.salineBolusVolume(), view.salineBolusVolumeMax()); QCOMPARE(view.acidConcentrate(), view.acidConcentrateMax()); QCOMPARE(view.bicarbonateConcentrate(), view.bicarbonateConcentrateMax()); QCOMPARE(view.dialyzerType(), view.dialyzerTypeMax()); QCOMPARE(view.dialysateTemp(), view.dialysateTempMax()); QCOMPARE(view.arterialPressureLimitLow(),view.arterialPressureLimitLowMin()); QCOMPARE(view.arterialPressureLimitHigh(), view.arterialPressureLimitHighMax()); QCOMPARE(view.venousPressureLimitLow(), view.venousPressureLimitLowMin()); QCOMPARE(view.venousPressureLimitHigh(), view.venousPressureLimitHighMax()); QCOMPARE(view.bloodPressureMeasureInterval(), view.bloodPressureMeasureIntervalMax()); QCOMPARE(view.rinsebackFlowRate(), view.rinsebackFlowRateMax()); view.doValidation(); } else { QCOMPARE(view.validate(view.treatmentData), false); } } } /*! * \brief tst_views::VCreateTreatment_simulate_valid_parameters * Simulates a user selection of valid parameters * \param view VCreateTreatment object to be set with valid parameters */ void tst_views::VCreateTreatment_simulate_valid_parameters(View::VTreatmentCreate &view) { view.bloodFlowRate(view.bloodFlowRateMax()); view.dialysateFlowRate(view.dialysateFlowRateMax()); view.duration(view.durationMax()); view.heparinDispensingRate(view.heparinDispensingRateMax()); view.heparinBolusVolume(view.heparinBolusVolumeMax()); view.heparinStopTime(view.heparinStopTimeMax()); view.salineBolusVolume(view.salineBolusVolumeMax()); view.acidConcentrate(view.acidConcentrateMax()); view.bicarbonateConcentrate(view.bicarbonateConcentrateMax()); view.dialyzerType(view.dialyzerTypeMax()); view.dialysateTemp(view.dialysateTempMax()); view.arterialPressureLimitLow(view.arterialPressureLimitLowMin()); view.arterialPressureLimitHigh(view.arterialPressureLimitHighMax()); view.venousPressureLimitLow(view.venousPressureLimitLowMin()); view.venousPressureLimitHigh(view.venousPressureLimitHighMax()); view.bloodPressureMeasureInterval(view.bloodPressureMeasureIntervalMax()); view.rinsebackFlowRate(view.rinsebackFlowRateMax()); } /*! * \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["salineBolusVolumeMin"] = 100; obj["salineBolusVolumeMax"] = 300; 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::VTreatmentCreate v; // check resolutions QCOMPARE(v.bloodFlowRateRes(), quint32(25)); QCOMPARE(v.dialysateFlowRateRes(), quint32(50 )); QCOMPARE(v.durationRes(), quint32(15 )); QCOMPARE(v.heparinDispensingRateRes(), qreal(0.1)); QCOMPARE(v.heparinBolusVolumeRes(), qreal(0.1)); QCOMPARE(v.heparinStopTimeRes(), quint32(10 )); QCOMPARE(v.salineBolusVolumeRes(), quint32(100)); QCOMPARE(v.acidConcentrateRes(), quint32(1)); QCOMPARE(v.bicarbonateConcentrateRes(), quint32(1)); QCOMPARE(v.dialyzerTypeRes(), quint32(1)); QCOMPARE(v.dialysateTempRes(), qreal(0.5)); QCOMPARE(v.arterialPressureLimitLowRes(), qint32(10)); QCOMPARE(v.arterialPressureLimitHighRes(), qint32(10)); QCOMPARE(v.venousPressureLimitLowRes(), qint32(10)); QCOMPARE(v.venousPressureLimitHighRes(), qint32(10)); QCOMPARE(v.bloodPressureMeasureIntervalRes(), quint32(5)); QCOMPARE(v.rinsebackFlowRateRes(), quint32(25)); v.bloodFlowRateRes (quint32(26)); v.dialysateFlowRateRes (quint32(51)); v.durationRes (quint32(16)); v.heparinDispensingRateRes (qreal(0.2)); v.heparinBolusVolumeRes (qreal(0.2)); v.heparinStopTimeRes (quint32(11)); v.salineBolusVolumeRes (quint32(101)); v.acidConcentrateRes (quint32(2)); v.bicarbonateConcentrateRes (quint32(2)); v.dialyzerTypeRes (quint32(2)); v.dialysateTempRes (qreal(0.6)); v.arterialPressureLimitLowRes (qint32(11)); v.arterialPressureLimitHighRes (qint32(11)); v.venousPressureLimitLowRes (qint32(11)); v.venousPressureLimitHighRes (qint32(11)); v.bloodPressureMeasureIntervalRes (quint32(6)); v.rinsebackFlowRateRes (quint32(26)); QCOMPARE(v.bloodFlowRateRes(), quint32(26)); QCOMPARE(v.dialysateFlowRateRes(), quint32(51)); QCOMPARE(v.durationRes(), quint32(16)); QCOMPARE(v.heparinDispensingRateRes(), qreal(0.2)); QCOMPARE(v.heparinBolusVolumeRes(), qreal(0.2)); QCOMPARE(v.heparinStopTimeRes(), quint32(11)); QCOMPARE(v.salineBolusVolumeRes(), quint32(101)); QCOMPARE(v.acidConcentrateRes(), quint32(2)); QCOMPARE(v.bicarbonateConcentrateRes(), quint32(2)); QCOMPARE(v.dialyzerTypeRes(), quint32(2)); QCOMPARE(v.dialysateTempRes(), qreal(0.6)); QCOMPARE(v.arterialPressureLimitLowRes(), qint32(11)); QCOMPARE(v.arterialPressureLimitHighRes(), qint32(11)); QCOMPARE(v.venousPressureLimitLowRes(), qint32(11)); QCOMPARE(v.venousPressureLimitHighRes(), qint32(11)); QCOMPARE(v.bloodPressureMeasureIntervalRes(), quint32(6)); QCOMPARE(v.rinsebackFlowRateRes(), quint32(26)); View::VTreatmentCreate view; // adjust quint32 minimums view.bloodFlowRateMin(1); view.dialysateFlowRateMin(1); view.durationMin(1); view.heparinDispensingRateMin(2); view.heparinBolusVolumeMin(1); view.heparinStopTimeMin(1); view.salineBolusVolumeMin(1); view.acidConcentrateMin(1); view.bicarbonateConcentrateMin(1); view.dialyzerTypeMin(1); view.dialysateTempMin(1); view.arterialPressureLimitLowMin(2); view.arterialPressureLimitHighMin(2); view.venousPressureLimitLowMin(2); view.venousPressureLimitHighMin(2); view.bloodPressureMeasureIntervalMin(2); view.rinsebackFlowRateMin(1); // setters view.bloodFlowRate(0); view.dialysateFlowRate(0); view.duration(0); view.heparinDispensingRate(1); view.heparinBolusVolume(0); view.heparinStopTime(0); view.salineBolusVolume(0); view.acidConcentrate(view.acidConcentrateMin()); view.bicarbonateConcentrate(view.bicarbonateConcentrateMin()); view.dialyzerType(view.dialyzerTypeMin()); view.dialysateTemp(0); view.arterialPressureLimitLow(1); view.arterialPressureLimitHigh(1); view.venousPressureLimitLow(1); view.venousPressureLimitHigh(1); view.bloodPressureMeasureInterval(1); view.rinsebackFlowRate(0); view.setTreatmentData(); QCOMPARE(view.isbloodFlowRateSet, true); QCOMPARE(view.isdialysateFlowRateSet, true); QCOMPARE(view.isdurationSet, true); QCOMPARE(view.isheparinDispensingRateSet, true); QCOMPARE(view.isheparinBolusVolumeSet, true); QCOMPARE(view.isheparinStopTimeSet, true); QCOMPARE(view.issalineBolusVolumeSet, true); QCOMPARE(view.isacidConcentrateSet, true); QCOMPARE(view.isbicarbonateConcentrateSet, true); QCOMPARE(view.isdialyzerTypeSet, true); QCOMPARE(view.isdialysateTempSet, true); QCOMPARE(view.isarterialPressureLimitLowSet, true); QCOMPARE(view.isarterialPressureLimitHighSet, true); QCOMPARE(view.isvenousPressureLimitLowSet, true); QCOMPARE(view.isvenousPressureLimitHighSet, true); QCOMPARE(view.isbloodPressureMeasureIntervalSet, true); QCOMPARE(view.isrinsebackFlowRateSet, true); QCOMPARE(view.validate(view.treatmentData), false); // edge case when pressure lows are set greater than the highs view.arterialPressureLimitLow(view.arterialPressureLimitHighMin()+1); view.venousPressureLimitLow(view.venousPressureLimitHighMin()+1); QCOMPARE(view.validate(view.treatmentData), false); view.doResetCreateTreatment(); for (int i = 0; i < 17; ++i) { VCreateTreatment_simulate_valid_parameters(view); switch (i) { case 0: view.bloodFlowRate(view.bloodFlowRateMax()+1); break; case 1: view.dialysateFlowRate(view.dialysateFlowRateMax()+1); break; case 2: view.duration(view.durationMax()+1); break; case 3: view.heparinDispensingRate(view.heparinDispensingRateMax()+1); break; case 4: view.heparinBolusVolume(view.heparinBolusVolumeMax()+1); break; case 5: view.heparinStopTime(view.heparinStopTimeMax()+1); break; case 6: view.salineBolusVolume(view.salineBolusVolumeMax()+1); break; case 7: view.acidConcentrate(view.acidConcentrateOptions().length()); break; case 8: view.bicarbonateConcentrate(view.bicarbonateConcentrateOptions().length()); break; case 9: view.dialyzerType(view.dialyzerTypeOptions().length()); break; case 10: view.dialysateTemp(view.dialysateTempMax()+1); break; case 11: view.arterialPressureLimitLow(view.arterialPressureLimitLowMax()+1); break; case 12: view.arterialPressureLimitHigh(view.arterialPressureLimitHighMax()+1); break; case 13: view.venousPressureLimitLow(view.venousPressureLimitLowMax()+1); break; case 14: view.venousPressureLimitHigh(view.venousPressureLimitHighMax()+1); break; case 15: view.bloodPressureMeasureInterval(view.bloodPressureMeasureIntervalMax()+1); break; case 16: view.rinsebackFlowRate(view.rinsebackFlowRateMax()+1); break; default: break; } QCOMPARE(view.validate(view.treatmentData), false); view.doValidation(); } view.dialyzerType(-1); QVERIFY(!(view.dialyzerTypeOptions().length() - 1 < (int)view.dialyzerType())); QStringList result = view.doGetOperatingParameterValues(); QCOMPARE(result.at(2), "None"); } void tst_views::VCreateTreatment_check_init() { View::VTreatmentCreate view; quint32 val = 150; view.bloodFlowRateMin(val); ++val; view.bloodFlowRateMin(val); view.bloodFlowRateMin(val); QCOMPARE(val, view.bloodFlowRateMin()); val = 501; view.bloodFlowRateMax(val); ++val; view.bloodFlowRateMax(val); view.bloodFlowRateMax(val); QCOMPARE(val, view.bloodFlowRateMax()); val = 100; view.dialysateFlowRateMin(val); ++val; view.dialysateFlowRateMin(val); QCOMPARE(val, view.dialysateFlowRateMin()); val = 600; view.dialysateFlowRateMax(val); ++val; view.dialysateFlowRateMax(val); view.dialysateFlowRateMax(val); QCOMPARE(val, view.dialysateFlowRateMax()); val = 60; view.durationMin(val); ++val; view.durationMin(val); QCOMPARE(val, view.durationMin()); val = 480; view.durationMax(val); ++val; view.durationMax(val); view.durationMax(val); QCOMPARE(val, view.durationMax()); val = 0; view.heparinDispensingRateMin(val); ++val; view.heparinDispensingRateMin(val); view.heparinDispensingRateMin(val); QCOMPARE(val, view.heparinDispensingRateMin()); val = 1000; view.heparinDispensingRateMax(val); ++val; view.heparinDispensingRateMax(val); view.heparinDispensingRateMax(val); QCOMPARE(val, view.heparinDispensingRateMax()); val = 100; view.heparinBolusVolumeMin(val); ++val; view.heparinBolusVolumeMin(val); view.heparinBolusVolumeMin(val); QCOMPARE(val, view.heparinBolusVolumeMin()); val = 2000; view.heparinBolusVolumeMax(val); ++val; view.heparinBolusVolumeMax(val); view.heparinBolusVolumeMax(val); QCOMPARE(val, view.heparinBolusVolumeMax()); val = 1000; view.heparinStopTimeMin(val); ++val; view.heparinStopTimeMin(val); view.heparinStopTimeMin(val); QCOMPARE(val, view.heparinStopTimeMin()); val = 2000; view.heparinStopTimeMax(val); ++val; view.heparinStopTimeMax(val); view.heparinStopTimeMax(val); QCOMPARE(val, view.heparinStopTimeMax()); val = 480; view.durationMax(val); ++val; view.durationMax(val); view.durationMax(val); QCOMPARE(val, view.durationMax()); val = 300; view.salineBolusVolumeMax(val); ++val; view.salineBolusVolumeMax(val); view.salineBolusVolumeMax(val); QCOMPARE(val, view.salineBolusVolumeMax()); QStringList options = QStringList() << "08-1251-1" << "08-2251-0" << "08-3251-9"; view.acidConcentrateOptions(options); options.append(" "); view.acidConcentrateMax(view.acidConcentrateMax()+1); view.acidConcentrateOptions(options); view.acidConcentrateOptions(options); QCOMPARE(options, view.acidConcentrateOptions()); options = QStringList() << "Dimesol - BC-201"; view.bicarbonateConcentrateOptions(options); options.append(" "); view.bicarbonateConcentrateMax(view.bicarbonateConcentrateMax()+1); view.bicarbonateConcentrateOptions(options); view.bicarbonateConcentrateOptions(options); QCOMPARE(options, view.bicarbonateConcentrateOptions()); options = QStringList() << "Nipro Elisio-H 17" << "Nipro Elisio-H 19" << "Fresenius Optiflux F160NRe" << "Fresenius Optiflux F180NRe"; view.dialyzerTypeOptions(options); options.append(" "); view.dialyzerTypeMax(view.dialyzerTypeMax()+1); view.dialyzerTypeOptions(options); view.dialyzerTypeOptions(options); QCOMPARE(options, view.dialyzerTypeOptions()); val = 36; view.dialysateTempMin(val); ++val; view.dialysateTempMin(val); view.dialysateTempMin(val); QCOMPARE(val, view.dialysateTempMin()); val = 37; view.dialysateTempMax(val); ++val; view.dialysateTempMax(val); view.dialysateTempMax(val); QCOMPARE(val, view.dialysateTempMax()); qint32 v; v = -299; view.arterialPressureLimitLowMin(v); ++v; view.arterialPressureLimitLowMin(v); view.arterialPressureLimitLowMin(v); QCOMPARE(v, view.arterialPressureLimitLowMin()); v = 201; view.arterialPressureLimitLowMax(v); ++v; view.arterialPressureLimitLowMax(v); view.arterialPressureLimitLowMax(v); QCOMPARE(v, view.arterialPressureLimitLowMax()); v = 1000; view.arterialPressureLimitHighMin(v); ++v; view.arterialPressureLimitHighMin(v); view.arterialPressureLimitHighMin(v); QCOMPARE(v, view.arterialPressureLimitHighMin()); v = 2000; view.arterialPressureLimitHighMax(v); ++v; view.arterialPressureLimitHighMax(v); view.arterialPressureLimitHighMax(v); QCOMPARE(v, view.arterialPressureLimitHighMax()); v = -101; view.venousPressureLimitLowMin(v); ++v; view.venousPressureLimitLowMin(v); view.venousPressureLimitLowMin(v); QCOMPARE(v, view.venousPressureLimitLowMin()); v = 601; view.venousPressureLimitLowMax(v); ++v; view.venousPressureLimitLowMax(v); view.venousPressureLimitLowMax(v); QCOMPARE(v, view.venousPressureLimitLowMax()); v = 10; view.venousPressureLimitHighMin(v); ++v; view.venousPressureLimitHighMin(v); view.venousPressureLimitHighMin(v); QCOMPARE(v, view.venousPressureLimitHighMin()); v = 601; view.venousPressureLimitHighMax(v); ++v; view.venousPressureLimitHighMax(v); view.venousPressureLimitHighMax(v); QCOMPARE(v, view.venousPressureLimitHighMax()); val = 1; view.bloodPressureMeasureIntervalMin(val); ++val; view.bloodPressureMeasureIntervalMin(val); view.bloodPressureMeasureIntervalMin(val); QCOMPARE(val, view.bloodPressureMeasureIntervalMin()); val = 31; view.bloodPressureMeasureIntervalMax(val); ++val; view.bloodPressureMeasureIntervalMax(val); view.bloodPressureMeasureIntervalMax(val); QCOMPARE(val, view.bloodPressureMeasureIntervalMax()); val = 10; view.rinsebackFlowRateMin(val); ++val; view.rinsebackFlowRateMin(val); view.rinsebackFlowRateMin(val); QCOMPARE(val, view.rinsebackFlowRateMin()); val = 149; view.rinsebackFlowRateMax(val); ++val; view.rinsebackFlowRateMax(val); view.rinsebackFlowRateMax(val); QCOMPARE(val, view.rinsebackFlowRateMax()); bool b = false; view.continueEnabled(b); view.continueEnabled(b); QCOMPARE(b, view.continueEnabled()); view.saveTreatmentProfile(b); view.saveTreatmentProfile(b); QCOMPARE(b, view.saveTreatmentProfile()); } void tst_views::VCreateTreatment_save_csv() { View::VTreatmentCreate view; QString csvData = view.getParameterRangesDataCSV(); QString filename = QString("/tmp/out_%0.csv").arg(QDateTime::currentDateTime().toString(datetimeFormat)); view.saveTreatmentRangesCSV(filename); QString readCsvData; FileHandler::read(filename, readCsvData); QCOMPARE(csvData, readCsvData); QVERIFY(!FileHandler::read(filename + "invalid", readCsvData)); } /*! * \brief tst_views::VCreateTreatment_save * Tests that VCreateTreatment saves treatment profiles properly. */ void tst_views::VCreateTreatment_save() { View::VTreatmentCreate view; QJsonObject objectWritten { {"bloodFlowRate", QString::number(view.treatmentData.bloodFlowRate)}, {"dialysateFlowRate", QString::number(view.treatmentData.dialysateFlowRate)}, {"duration", QString::number(view.treatmentData.duration)}, {"heparinDispensingRate", QString::number(view.treatmentData.heparinDispensingRate)}, {"heparinBolusVolume", QString::number(view.treatmentData.heparinBolusVolume)}, {"heparinStopTime", QString::number(view.treatmentData.heparinStopTime)}, {"acidConcentrate", QString::number(view.treatmentData.acidConcentrate)}, {"bicarbonateConcentrate", QString::number(view.treatmentData.bicarbonateConcentrate)}, {"dialyzerType", QString::number(view.treatmentData.dialyzerType)}, {"dialysateTemp", QString::number(view.treatmentData.dialysateTemp)}, {"arterialPressureLimitLow", QString::number(view.treatmentData.arterialPressureLimitLow)}, {"arterialPressureLimitHigh", QString::number(view.treatmentData.arterialPressureLimitHigh)}, {"venousPressureLimitLow", QString::number(view.treatmentData.venousPressureLimitLow)}, {"venousPressureLimitHigh", QString::number(view.treatmentData.venousPressureLimitHigh)}, {"bloodPressureMeasureInterval",QString::number(view.treatmentData.bloodPressureMeasureInterval)}, {"rinsebackFlowRate", QString::number(view.treatmentData.rinsebackFlowRate)} }; QString dir = QString("/tmp/newTreatment_%0.json").arg(QDateTime::currentDateTime().toString(datetimeFormat)); QString oldFilename = view.saveNewTreatment(objectWritten, dir); QDateTime startTime = QDateTime::currentDateTime(); int elapsedSeconds = 0; while (!QFile(oldFilename).exists()) { elapsedSeconds = startTime.secsTo(QDateTime::currentDateTime()); } startTime = QDateTime::currentDateTime(); QString filename = view.saveNewTreatment(objectWritten, dir); QVERIFY(oldFilename != filename); QVERIFY(elapsedSeconds < 0.5); elapsedSeconds = 0; QJsonObject objectReadTemp; while (!FileHandler::read(filename, objectReadTemp) || (objectWritten != objectReadTemp)) { elapsedSeconds = startTime.secsTo(QDateTime::currentDateTime()); } QVERIFY(elapsedSeconds < 0.5); QJsonObject objectRead; QVERIFY(FileHandler::read(filename, objectRead)); QCOMPARE(objectWritten, objectRead); } /*! * \brief tst_views::VCreateTreatment_enums * Tests that enums are handled properly */ void tst_views::VCreateTreatment_enums() { View::VTreatmentCreate view; GuiRequestReasons reason = GuiRequestReasons::REQUEST_REJECT_REASON_NONE; QCOMPARE(view.enumToString(reason), "REQUEST_REJECT_REASON_NONE"); QCOMPARE(view.enumToString(static_cast(-1)), "[-1] Unknown Rejection Reason"); QCOMPARE(view.enumToString(static_cast(GuiRequestReasons::NUM_OF_REQUEST_REJECT_REASONS + 1)), QString("[%0] Unknown Rejection Reason").arg(GuiRequestReasons::NUM_OF_REQUEST_REJECT_REASONS + 1)); } /*! * \brief tst_views::VCreateTreatment_json * Tests a helper function's conversion from QJsonArray to QStringList */ void tst_views::VCreateTreatment_json() { View::VTreatmentCreate view; QJsonArray arr; QStringList list; QCOMPARE(view.jsonArrayToStringList(arr), list); arr << "1"; QVERIFY(view.jsonArrayToStringList(arr) != list); list << "1"; QCOMPARE(view.jsonArrayToStringList(arr), list); arr << QJsonValue("1") << QJsonValue("2"); list << "1" << "2"; QCOMPARE(view.jsonArrayToStringList(arr), list); arr << 3 << 4; list << "3" << "4"; QVERIFY(view.jsonArrayToStringList(arr) != list); } /*! * \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::VTreatmentCreate view; GuiActionType action = GuiActionType::ID_AdjustParametersValidationRsp; for (int i = 0; i < 18; ++i) { // 0 = OK, 1,2,3 ... parameter is not OK QVariantList messageData; AdjustParametersValidationResponseData respData; if (i == 0) respData.requestValid = 1; else respData.requestValid = 0; if (i == 1) respData.bloodFlowRate = 1; else respData.bloodFlowRate = 0; if (i == 2) respData.dialysateFlowRate = 1; else respData.dialysateFlowRate = 0; if (i == 3) respData.duration = 1; else respData.duration = 0; if (i == 4) respData.heparinStopTime = 1; else respData.heparinStopTime = 0; if (i == 5) respData.salineBolus = 1; else respData.salineBolus = 0; if (i == 6) respData.acidConcentrate = 1; else respData.acidConcentrate = 0; if (i == 7) respData.bicarbonateConcentrate = 1; else respData.bicarbonateConcentrate = 0; if (i == 8) respData.dialyzerType = 1; else respData.dialyzerType = 0; if (i == 9) respData.bloodPressureMeasureInterval = 1; else respData.bloodPressureMeasureInterval= 0; if (i == 10) respData.rinsebackFlowRate = 1; else respData.rinsebackFlowRate = 0; if (i == 11) respData.arterialPressureLimitLow = 1; else respData.arterialPressureLimitLow = 0; if (i == 12) respData.arterialPressureLimitHigh = 1; else respData.arterialPressureLimitHigh = 0; if (i == 13) respData.venousPressureLimitLow = 1; else respData.venousPressureLimitLow = 0; if (i == 14) respData.venousPressureLimitHigh = 1; else respData.venousPressureLimitHigh = 0; if (i == 15) respData.heparinDispensingRate = 1; else respData.heparinDispensingRate = 0; if (i == 16) respData.heparinBolusVolume = 1; else respData.heparinBolusVolume = 0; if (i == 17) respData.dialysateTemp = 1; else respData.dialysateTemp = 0; QVERIFY(!view.onActionReceive(respData)); } AdjustParametersValidationRequestData dataBackup = view.treatmentData; AdjustParametersValidationResponseData respData; QVERIFY(view.onActionReceive(respData)); view.saveTreatmentProfile(false); QVERIFY(!view._saveTreatmentProfile); view.doConfirm(); view.saveTreatmentProfile(true); QVERIFY(view._saveTreatmentProfile); view.doConfirm(); view.doStartTreatment(); QCOMPARE(view.treatmentData.bloodFlowRate, dataBackup.bloodFlowRate); QCOMPARE(view.treatmentData.dialysateFlowRate, dataBackup.dialysateFlowRate); QCOMPARE(view.treatmentData.duration, dataBackup.duration); QCOMPARE(view.treatmentData.heparinDispensingRate, dataBackup.heparinDispensingRate); QCOMPARE(view.treatmentData.heparinBolusVolume, dataBackup.heparinBolusVolume); QCOMPARE(view.treatmentData.heparinStopTime, dataBackup.heparinStopTime); QCOMPARE(view.treatmentData.salineBolus, dataBackup.salineBolus); QCOMPARE(view.treatmentData.acidConcentrate, dataBackup.acidConcentrate); QCOMPARE(view.treatmentData.bicarbonateConcentrate, dataBackup.bicarbonateConcentrate); QCOMPARE(view.treatmentData.dialyzerType, dataBackup.dialyzerType); QCOMPARE(view.treatmentData.dialysateTemp, dataBackup.dialysateTemp); QCOMPARE(view.treatmentData.arterialPressureLimitLow, dataBackup.arterialPressureLimitLow); QCOMPARE(view.treatmentData.arterialPressureLimitHigh, dataBackup.arterialPressureLimitHigh); QCOMPARE(view.treatmentData.venousPressureLimitLow, dataBackup.venousPressureLimitLow); QCOMPARE(view.treatmentData.venousPressureLimitHigh, dataBackup.venousPressureLimitHigh); QCOMPARE(view.treatmentData.bloodPressureMeasureInterval, dataBackup.bloodPressureMeasureInterval); QCOMPARE(view.treatmentData.rinsebackFlowRate, dataBackup.rinsebackFlowRate); } /*! * \brief tst_views::VCreateTreatment_load_parameter_ranges * Tests that parameter ranges are loaded correctly from disk. */ void tst_views::VCreateTreatment_load_parameter_ranges() { View::VTreatmentCreate view; QJsonObject obj; VCreateTreatment_init_ranges(obj); obj["UnexpectedParameter"] = 123; QJsonDocument document(obj); QString path = QString("/tmp/ranges_%0.json").arg(QDateTime::currentDateTime().toString(datetimeFormat));; _FileSaver.onConcurrentSave(path, document.toJson(), false); int elapsedSeconds = 0; QDateTime startTime = QDateTime::currentDateTime(); while (view.loadTreatmentParameterRanges(path) != obj) elapsedSeconds += startTime.secsTo(QDateTime::currentDateTime()); QJsonObject readObj = view.loadTreatmentParameterRanges(path); QCOMPARE(obj, readObj); QVERIFY(elapsedSeconds < 2); readObj = view.loadTreatmentParameterRanges(QString("/tmp/wrong_path_%0.json") .arg(QDateTime::currentDateTime().toString(datetimeFormat))); QVERIFY(obj != readObj); }