/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.module.reporting.dataset.definition.evaluator;
import org.junit.Assert;
import org.junit.Test;
import org.openmrs.module.reporting.dataset.SimpleDataSet;
import org.openmrs.module.reporting.dataset.definition.MultiParameterDataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.SqlDataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.service.DataSetDefinitionService;
import org.openmrs.module.reporting.evaluation.EvaluationContext;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.openmrs.test.Verifies;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MultiParameterDataSetEvaluatorTest extends BaseModuleContextSensitiveTest {
@Autowired
DataSetDefinitionService dataSetDefinitionService;
/**
* @see {@link org.openmrs.module.reporting.dataset.definition.evaluator.MultiParameterDataSetEvaluator#evaluate(org.openmrs.module.reporting.dataset.definition.DataSetDefinition, org.openmrs.module.reporting.evaluation.EvaluationContext)}
*/
@Test
@Verifies(value = "should evaluate a MultiParameterDataSetDefinition", method = "evaluate(DataSetDefinition,EvaluationContext)")
public void evaluate_shouldEvaluateAMultiParameterDataSetDefinition() throws Exception {
SqlDataSetDefinition sqlDataSetDefinition = new SqlDataSetDefinition();
sqlDataSetDefinition.setSqlQuery("select t.patient_id, p.gender, p.birthdate from patient t inner join person p on t.patient_id = p.person_id where p.birthdate < :maxBirthDate order by patient_id asc");
sqlDataSetDefinition.addParameter(new Parameter("maxBirthDate", "maxBirthDate", Date.class));
MultiParameterDataSetDefinition multiParameterDataSetDefinition = new MultiParameterDataSetDefinition();
multiParameterDataSetDefinition.setBaseDefinition(sqlDataSetDefinition);
List<Map<String, Object>> iterations = new ArrayList<Map<String, Object>>();
Map<String, Object> iteration = new HashMap<String, Object>();
iteration.put("maxBirthDate", "${input}");
iterations.add(iteration);
iteration = new HashMap<String, Object>();
iteration.put("maxBirthDate", "${input+2d}");
iterations.add(iteration);
multiParameterDataSetDefinition.setIterations(iterations);
multiParameterDataSetDefinition.addParameter(new Parameter("input", "input", Date.class));
Calendar cal = Calendar.getInstance();
cal.set(1976, Calendar.AUGUST, 24, 0, 0);
Date firstIterationParameter = cal.getTime();
cal.add(Calendar.DATE, 2);
Date secondIterationParameter = cal.getTime();
EvaluationContext evaluationContext = new EvaluationContext(new Date());
evaluationContext.addParameterValue("input", firstIterationParameter);
SimpleDataSet result = (SimpleDataSet) dataSetDefinitionService.evaluate(multiParameterDataSetDefinition, evaluationContext);
Assert.assertNotNull(result.getMetaData().getColumn("parameter.maxBirthDate"));
Assert.assertNotNull(result.getMetaData().getColumn("PATIENT_ID"));
Assert.assertNotNull(result.getMetaData().getColumn("GENDER"));
Assert.assertNotNull(result.getMetaData().getColumn("BIRTHDATE"));
Assert.assertEquals(3, result.getRows().size());
// Asserting result parameter for first iteration
Assert.assertEquals(firstIterationParameter, result.getColumnValue(1, "parameter.maxBirthDate"));
// Asserting result parameters for second iteration
Assert.assertEquals(secondIterationParameter, result.getColumnValue(2, "parameter.maxBirthDate"));
Assert.assertEquals(secondIterationParameter, result.getColumnValue(3, "parameter.maxBirthDate"));
Date firstDateResult = (Date) result.getColumnValue(1, "BIRTHDATE");
Date secondDateResult = (Date) result.getColumnValue(2, "BIRTHDATE");
Date thirdDateResult = (Date) result.getColumnValue(3, "BIRTHDATE");
// Asserting evaluation results values; first and second dates are the same - both iteration returns them
Assert.assertEquals(Timestamp.valueOf("1975-04-08 00:00:00.0"), firstDateResult);
Assert.assertEquals(Timestamp.valueOf("1975-04-08 00:00:00.0"), secondDateResult);
Assert.assertEquals(Timestamp.valueOf("1976-08-25 00:00:00.0"), thirdDateResult);
// Asserting values for first iteration
Assert.assertTrue(firstDateResult.before(firstIterationParameter));
Assert.assertFalse(thirdDateResult.before(firstIterationParameter));
// Asserting values for second iteration
Assert.assertTrue(secondDateResult.before(secondIterationParameter));
Assert.assertTrue(thirdDateResult.before(secondIterationParameter));
}
}