package org.openmrs.module.reporting.dataset.definition.evaluator;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.api.context.Context;
import org.openmrs.module.reporting.ReportingConstants;
import org.openmrs.module.reporting.cohort.definition.AgeCohortDefinition;
import org.openmrs.module.reporting.common.DateUtil;
import org.openmrs.module.reporting.common.TestUtil;
import org.openmrs.module.reporting.dataset.MapDataSet;
import org.openmrs.module.reporting.dataset.definition.CohortIndicatorDataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.DataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.service.DataSetDefinitionService;
import org.openmrs.module.reporting.evaluation.EvaluationContext;
import org.openmrs.module.reporting.evaluation.parameter.Mapped;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.openmrs.module.reporting.indicator.CohortIndicator;
import org.openmrs.module.reporting.indicator.dimension.CohortIndicatorAndDimensionResult;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.openmrs.test.Verifies;
public class CohortIndicatorDataSetEvaluatorTest extends BaseModuleContextSensitiveTest {
protected static final String XML_DATASET_PATH = "org/openmrs/module/reporting/include/";
protected static final String XML_REPORT_TEST_DATASET = "ReportTestDataset";
/**
* Run this before each unit test in this class. The "@Before" method in
* {@link BaseContextSensitiveTest} is run right before this method.
*
* @throws Exception
*/
@Before
public void setup() throws Exception {
executeDataSet(XML_DATASET_PATH + new TestUtil().getTestDatasetFilename(XML_REPORT_TEST_DATASET));
}
/**
* @see {@link CohortIndicatorDataSetEvaluator#evaluate(DataSetDefinition,EvaluationContext)}
*/
@Test
@Verifies(value = "should evaluate a CohortIndicatorDataSetDefinition", method = "evaluate(DataSetDefinition,EvaluationContext)")
public void evaluate_shouldEvaluateACohortIndicatorDataSetDefinition() throws Exception {
AgeCohortDefinition childrenOnDate = new AgeCohortDefinition();
childrenOnDate.addParameter(new Parameter("effectiveDate", "effectiveDate", Date.class));
childrenOnDate.setMaxAge(14);
AgeCohortDefinition adultsOnDate = new AgeCohortDefinition();
adultsOnDate.addParameter(new Parameter("effectiveDate", "effectiveDate", Date.class));
adultsOnDate.setMinAge(15);
CohortIndicator childrenAtStart = new CohortIndicator();
childrenAtStart.addParameter(ReportingConstants.START_DATE_PARAMETER);
childrenAtStart.addParameter(ReportingConstants.END_DATE_PARAMETER);
childrenAtStart.setUuid(UUID.randomUUID().toString());
childrenAtStart.setCohortDefinition(childrenOnDate, "effectiveDate=${startDate}");
CohortIndicator childrenAtEnd = new CohortIndicator();
childrenAtEnd.addParameter(ReportingConstants.START_DATE_PARAMETER);
childrenAtEnd.addParameter(ReportingConstants.END_DATE_PARAMETER);
childrenAtEnd.setUuid(UUID.randomUUID().toString());
childrenAtEnd.setCohortDefinition(childrenOnDate, "effectiveDate=${endDate}");
CohortIndicator adultsAtStart = new CohortIndicator();
adultsAtStart.addParameter(ReportingConstants.START_DATE_PARAMETER);
adultsAtStart.addParameter(ReportingConstants.END_DATE_PARAMETER);
adultsAtStart.setUuid(UUID.randomUUID().toString());
adultsAtStart.setCohortDefinition(adultsOnDate, "effectiveDate=${startDate}");
CohortIndicator adultsAtEnd = new CohortIndicator();
adultsAtEnd.addParameter(ReportingConstants.START_DATE_PARAMETER);
adultsAtEnd.addParameter(ReportingConstants.END_DATE_PARAMETER);
adultsAtEnd.setUuid(UUID.randomUUID().toString());
adultsAtEnd.setCohortDefinition(adultsOnDate, "effectiveDate=${endDate}");
Map<String, Object> periodMappings = new HashMap<String, Object>();
periodMappings.put("startDate", "${startDate}");
periodMappings.put("endDate", "${endDate}");
CohortIndicatorDataSetDefinition d = new CohortIndicatorDataSetDefinition();
d.addParameter(ReportingConstants.START_DATE_PARAMETER);
d.addParameter(ReportingConstants.END_DATE_PARAMETER);
d.addColumn("1", "Children At Start", new Mapped<CohortIndicator>(childrenAtStart, periodMappings), "");
d.addColumn("2", "Children At End", new Mapped<CohortIndicator>(childrenAtEnd, periodMappings), "");
d.addColumn("3", "Adults At Start", new Mapped<CohortIndicator>(adultsAtStart, periodMappings), "");
d.addColumn("4", "Adults At End", new Mapped<CohortIndicator>(adultsAtEnd, periodMappings), "");
EvaluationContext context = new EvaluationContext();
context.addParameterValue(ReportingConstants.START_DATE_PARAMETER.getName(), DateUtil.getDateTime(1980, 1, 1));
context.addParameterValue(ReportingConstants.END_DATE_PARAMETER.getName(), DateUtil.getDateTime(2000, 1, 1));
MapDataSet result = (MapDataSet)Context.getService(DataSetDefinitionService.class).evaluate(d, context);
Assert.assertEquals(2, ((CohortIndicatorAndDimensionResult)result.getData().getColumnValue("1")).getValue());
Assert.assertEquals(1, ((CohortIndicatorAndDimensionResult)result.getData().getColumnValue("2")).getValue());
Assert.assertEquals(2, ((CohortIndicatorAndDimensionResult)result.getData().getColumnValue("3")).getValue());
Assert.assertEquals(4, ((CohortIndicatorAndDimensionResult)result.getData().getColumnValue("4")).getValue());
}
}