/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.order; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.time.DateUtils; import org.junit.Test; import org.openmrs.Order; import org.openmrs.OrderType; /** * Contains test for OrderUtil */ public class OrderUtilTest { public static boolean isActiveOrder(Order order, Date asOfDate) { return order.isActive(asOfDate) && order.getAction() != Order.Action.DISCONTINUE; } public static void setDateStopped(Order targetOrder, Date dateStopped) { try { Field field = null; Boolean isAccessible = null; try { field = Order.class.getDeclaredField("dateStopped"); isAccessible = field.isAccessible(); if (!isAccessible) { field.setAccessible(true); } field.set(targetOrder, dateStopped); } finally { if (field != null && isAccessible != null) { field.setAccessible(isAccessible); } } } catch (Exception e) { e.printStackTrace(); } } /** * @see OrderUtil#isType(org.openmrs.OrderType, org.openmrs.OrderType) */ @Test public void isType_shouldTrueIfOrderType2IsTheSameOrIsASubtypeOfOrderType1() { OrderType orderType = new OrderType(); OrderType subType1 = new OrderType(); OrderType subType2 = new OrderType(); subType2.setParent(subType1); subType1.setParent(orderType); assertTrue(OrderUtil.isType(subType2, subType2)); assertTrue(OrderUtil.isType(subType1, subType2)); assertTrue(OrderUtil.isType(orderType, subType2)); } /** * @see OrderUtil#isType(org.openmrs.OrderType, org.openmrs.OrderType) */ @Test public void isType_shouldReturnFalseIfTheyAreBothNull() { assertFalse(OrderUtil.isType(null, null)); } /** * @see OrderUtil#isType(org.openmrs.OrderType, org.openmrs.OrderType) */ @Test public void isType_shouldReturnFalseIfAnyIsNullAndTheOtherIsNot() { assertFalse(OrderUtil.isType(new OrderType(), null)); assertFalse(OrderUtil.isType(null, new OrderType())); } /** * @see OrderUtil#isType(org.openmrs.OrderType, org.openmrs.OrderType) */ @Test public void isType_shouldFalseIfOrderType2IsNeitherTheSameNorASubtypeOfOrderType1() { assertFalse(OrderUtil.isType(new OrderType(), new OrderType())); } /** * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1AndOrder2DoNotHaveEndDate() { Date date = new Date(); Order order1 = new Order(); order1.setScheduledDate(DateUtils.addDays(date, 4)); //Order1 scheduled after 4 days without stop date order1.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); Order order2 = new Order(); order2.setDateActivated(date); order2.setScheduledDate(DateUtils.addDays(date, 6)); //Order2 scheduled after 6 days without stop date order2.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); //Checks vice versa } /** * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1AndOrder2HaveSameStartDates() { Date date = new Date(); Order order1 = new Order(); order1.setDateActivated(date); order1.setScheduledDate(DateUtils.addDays(date, 6)); //Order1 scheduled after 6 days order1.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); Order order2 = new Order(); order2.setDateActivated(date); order2.setScheduledDate(DateUtils.addDays(date, 6)); //Order2 also scheduled after 6 days order2.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order2)); } /** * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnFalseIfOrder1EndsBeforeOrder2Starts() { Date date = new Date(); Order order1 = new Order(); order1.setDateActivated(date); order1.setAutoExpireDate(DateUtils.addDays(date, 2)); //Order1 getting expired after 2 days Order order2 = new Order(); order2.setDateActivated(date); order2.setScheduledDate(DateUtils.addDays(date, 4)); //Order2 scheduled after 4 days order2.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); assertFalse(OrderUtil.checkScheduleOverlap(order1, order2)); assertFalse(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnFalseIfOrder1StartsAfterOrder2() { Date date = new Date(); Order order1 = new Order(); order1.setScheduledDate(DateUtils.addDays(date, 11)); //Order1 getting started after existing order's stop order1.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); Order order2 = new Order(); order2.setDateActivated(date); order2.setAutoExpireDate(DateUtils.addDays(date, 2)); //Order2 expiring after 2 days assertFalse(OrderUtil.checkScheduleOverlap(order1, order2)); assertFalse(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * versa * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1StopsAfterTheOrder2HasAlreadyBeenActivated() { Date date = new Date(); Order order1 = new Order(); order1.setDateActivated(date); //Order1 scheduled today getting expired after 5 days order1.setAutoExpireDate(DateUtils.addDays(date, 5)); Order order2 = new Order(); order2.setDateActivated(date); order2.setScheduledDate(DateUtils.addDays(date, 4)); //Order2 scheduled after 4 days order2.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1StartsWhenTheOrder2IsActive() { Date date = new Date(); Order order1 = new Order(); order1.setScheduledDate(DateUtils.addDays(date, 3)); //Order1 scheduled after 3 days order1.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); Order order2 = new Order(); order2.setDateActivated(date); //Order2 scheduled today getting expired after 4 days order2.setAutoExpireDate(DateUtils.addDays(date, 4)); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @see OrderUtil#checkScheduleOverlap(Order,Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1StartsBeforeOrder2AndEndsAfterOrder2() { Date date = new Date(); Order order1 = new Order(); order1.setScheduledDate(DateUtils.addDays(date, 4)); //Order1 scheduled after 4 days getting expired after 14 days order1.setAutoExpireDate(DateUtils.addDays(date, 14)); order1.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); Order order2 = new Order(); order2.setDateActivated(date); order2.setScheduledDate(DateUtils.addDays(date, 6)); //Order2 scheduled after 6 days getting expired after 10 days order2.setAutoExpireDate(DateUtils.addDays(date, 10)); order2.setUrgency(Order.Urgency.ON_SCHEDULED_DATE); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @throws ParseException * @see OrderUtil#checkScheduleOverlap(org.openmrs.Order, org.openmrs.Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder2StartsBeforeOrder1AndEndsAfterOrder1() throws ParseException { DateFormat df = new SimpleDateFormat("dd/MM/yyy"); Order order1 = new Order(); order1.setDateActivated(df.parse("03/08/2014")); order1.setAutoExpireDate(df.parse("05/08/2014")); Order order2 = new Order(); order2.setDateActivated(df.parse("01/08/2014")); order2.setAutoExpireDate(df.parse("07/08/2014")); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @throws ParseException * @see OrderUtil#checkScheduleOverlap(org.openmrs.Order, org.openmrs.Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1StartsOnTheStopDateOfOrder2() throws ParseException { DateFormat df = new SimpleDateFormat("dd/MM/yyy"); Order order1 = new Order(); order1.setDateActivated(df.parse("13/08/2014")); Order order2 = new Order(); order2.setDateActivated(df.parse("05/08/2014")); order2.setAutoExpireDate(order1.getDateActivated()); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); //Assuming order1 has an end date order1.setAutoExpireDate(df.parse("15/08/2014")); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @throws ParseException * @see OrderUtil#checkScheduleOverlap(org.openmrs.Order, org.openmrs.Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfOrder1EndsOnTheStartDateOfOrder2() throws ParseException { DateFormat df = new SimpleDateFormat("dd/MM/yyy"); Order order1 = new Order(); order1.setDateActivated(df.parse("05/08/2014")); order1.setAutoExpireDate(df.parse("13/08/2014")); Order order2 = new Order(); order2.setDateActivated(order1.getAutoExpireDate()); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); //Assuming order2 has an end date order2.setAutoExpireDate(df.parse("15/08/2014")); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } /** * @throws ParseException * @see OrderUtil#checkScheduleOverlap(org.openmrs.Order, org.openmrs.Order) */ @Test public void checkScheduleOverlap_shouldReturnTrueIfBothOrdersStartAndEndOnSameDates() throws ParseException { DateFormat df = new SimpleDateFormat("dd/MM/yyy"); Order order1 = new Order(); order1.setDateActivated(df.parse("05/08/2014")); order1.setAutoExpireDate(df.parse("13/08/2014")); Order order2 = new Order(); order2.setDateActivated(order1.getDateActivated()); order2.setDateActivated(order1.getAutoExpireDate()); assertTrue(OrderUtil.checkScheduleOverlap(order1, order2)); assertTrue(OrderUtil.checkScheduleOverlap(order2, order1)); } }