3131import org .openmrs .ConceptReferenceRange ;
3232import org .openmrs .Drug ;
3333import org .openmrs .Obs ;
34+ import org .openmrs .ObsReferenceRange ;
3435import org .openmrs .Person ;
3536import org .openmrs .api .APIException ;
3637import org .openmrs .api .context .Context ;
@@ -865,6 +866,86 @@ public void shouldSetInterpretationToCriticalLowIfObsValueIsBelowLowCritical() {
865866 assertEquals (Obs .Interpretation .CRITICALLY_LOW , obs .getInterpretation ());
866867 }
867868
869+ @ Test
870+ public void shouldSetInterpretationToNormalIfObsValueIsAboveLowNormalAndHiNormalIsNull () {
871+ Obs obs = createObsWithReferenceRange (60 , 97 , 4090 , 95.0 , null , 90.0 , null , 0.0 , 100.0 );
872+
873+ Errors errors = new BindException (obs , "obs" );
874+ obsValidator .validate (obs , errors );
875+
876+ assertFalse (errors .hasErrors ());
877+ assertEquals (Obs .Interpretation .NORMAL , obs .getInterpretation ());
878+ }
879+
880+ @ Test
881+ public void shouldSetInterpretationToNormalIfObsValueIsBelowHiNormalAndLowNormalIsNull () {
882+ Obs obs = createObsWithReferenceRange (60 , 100 , 4090 , null , 140.0 , null , null , null , null );
883+
884+ Errors errors = new BindException (obs , "obs" );
885+ obsValidator .validate (obs , errors );
886+
887+ assertFalse (errors .hasErrors ());
888+ assertEquals (Obs .Interpretation .NORMAL , obs .getInterpretation ());
889+ }
890+
891+ @ Test
892+ public void shouldSetInterpretationToHighIfObsValueIsAboveHiNormalAndHiCriticalIsNull () {
893+ Obs obs = createObsWithReferenceRange (60 , 150 , 4090 , null , 140.0 , null , null , null , null );
894+
895+ // Set obs ID to prevent reference range from being overwritten by database values
896+ obs .setId (1 );
897+
898+
899+ Errors errors = new BindException (obs , "obs" );
900+ obsValidator .validate (obs , errors );
901+
902+ assertFalse (errors .hasErrors ());
903+ assertEquals (Obs .Interpretation .HIGH , obs .getInterpretation ());
904+ }
905+
906+ @ Test
907+ public void shouldSetInterpretationToLowIfObsValueIsBelowLowNormalAndLowCriticalIsNull () {
908+ Obs obs = createObsWithReferenceRange (60 , 90 , 4090 , 100.0 , 140.0 , null , 180.0 , 0.0 , 100.0 );
909+
910+ // Set obs ID to prevent reference range from being overwritten by database values
911+ obs .setId (1 );
912+
913+ Errors errors = new BindException (obs , "obs" );
914+ obsValidator .validate (obs , errors );
915+
916+ assertFalse (errors .hasErrors ());
917+ assertEquals (Obs .Interpretation .LOW , obs .getInterpretation ());
918+ }
919+
920+ /**
921+ * Helper method to create an Obs with specific reference range values
922+ * @param value The numeric value for the observation
923+ * @param conceptId The concept id for the observation
924+ * @param lowNormal Low normal value (can be null)
925+ * @param hiNormal High normal value (can be null)
926+ * @param lowCritical Low critical value (can be null)
927+ * @param hiCritical High critical value (can be null)
928+ * @param lowAbsolute Low absolute value (can be null)
929+ * @param hiAbsolute High absolute value (can be null)
930+ */
931+ private static Obs createObsWithReferenceRange (int numberOfYears , double value , int conceptId , Double lowNormal , Double hiNormal ,
932+ Double lowCritical , Double hiCritical , Double lowAbsolute , Double hiAbsolute ) {
933+ Obs obs = getObs (numberOfYears , conceptId , value );
934+
935+ // Set up the reference range manually with the provided values
936+ ObsReferenceRange obsRefRange = new ObsReferenceRange ();
937+ obsRefRange .setHiAbsolute (hiAbsolute );
938+ obsRefRange .setHiCritical (hiCritical );
939+ obsRefRange .setHiNormal (hiNormal );
940+ obsRefRange .setLowAbsolute (lowAbsolute );
941+ obsRefRange .setLowCritical (lowCritical );
942+ obsRefRange .setLowNormal (lowNormal );
943+ obsRefRange .setObs (obs );
944+ obs .setReferenceRange (obsRefRange );
945+
946+ return obs ;
947+ }
948+
868949 private static Obs getObs (int numberOfYears , int conceptId , double valueNumeric ) {
869950 Calendar calendar = Calendar .getInstance ();
870951 calendar .add (Calendar .YEAR , -numberOfYears );
@@ -879,4 +960,5 @@ private static Obs getObs(int numberOfYears, int conceptId, double valueNumeric)
879960 obs .setObsDatetime (new Date ());
880961 return obs ;
881962 }
963+
882964}
0 commit comments