package edu.stanford.slac.archiverappliance.PB.data;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import org.apache.log4j.Logger;
import org.epics.archiverappliance.ByteArray;
import org.epics.archiverappliance.Event;
import org.epics.archiverappliance.common.TimeUtils;
import org.epics.archiverappliance.config.ArchDBRTypes;
import org.epics.archiverappliance.data.DBRTimeEvent;
import org.epics.archiverappliance.utils.simulation.SimulationEventStream;
import org.junit.Test;
public class FieldValuesTest {
private static Logger logger = Logger.getLogger(FieldValuesTest.class.getName());
@Test
public void testFieldValues() throws Exception {
for(ArchDBRTypes dbrType : ArchDBRTypes.values()) {
if(!dbrType.isV3Type()) continue;
logger.info("Testing setting and getting of field values for DBR_type: " + dbrType.name());
short year = TimeUtils.getCurrentYear();
BoundaryConditionsSimulationValueGenerator valuegenerator = new BoundaryConditionsSimulationValueGenerator();
try(SimulationEventStream simstream = new SimulationEventStream(dbrType, valuegenerator)) {
PBTypeSystem pbTypeSystem = new PBTypeSystem();
Constructor<? extends DBRTimeEvent> constructorFromDBRTimeEvent = pbTypeSystem.getSerializingConstructor(dbrType);
Constructor<? extends DBRTimeEvent> constructorFromBytes = pbTypeSystem.getUnmarshallingFromByteArrayConstructor(dbrType);
int fieldCount = 1;
for(Event ev : simstream) {
// This should get the PB event
DBRTimeEvent pb0 = constructorFromDBRTimeEvent.newInstance(ev);
String fieldName = "HIHI";
String fieldValue = "0.0";
pb0.addFieldValue(fieldName, fieldValue);
ByteArray raw1 = pb0.getRawForm();
DBRTimeEvent pb1DbrTimeEvent = constructorFromBytes.newInstance(year, raw1);
assertTrue("Adding 1 field value does not turn hasFieldValues on ", pb1DbrTimeEvent.hasFieldValues());
assertTrue("Adding 1 field value yields different results " + pb1DbrTimeEvent.getFieldValue(fieldName), pb1DbrTimeEvent.getFieldValue(fieldName).equals(fieldValue));
assertTrue("Adding 1 field value default of isActualChange is true ", !pb1DbrTimeEvent.isActualChange());
assertTrue("Adding 1 field value getFieldNames does not contain field ", pb1DbrTimeEvent.getFields().containsKey(fieldName));
pb1DbrTimeEvent.markAsActualChange();
assertTrue("Adding 1 field value after marking as actual change isActualChange is false ", pb1DbrTimeEvent.isActualChange());
// Test adding multiple fields at the same time.
DBRTimeEvent pbm0 = constructorFromDBRTimeEvent.newInstance(ev);
HashMap<String, String> values = new HashMap<String, String>();
values.put("HIHI", "0.0");
values.put("LOLO", "-1.0");
values.put("LOPR", "1000.0");
values.put("HOPR", "-10000.0");
pbm0.setFieldValues(values, false);
assertTrue("Adding multiple field values does not turn hasFieldValues on ", pbm0.hasFieldValues());
assertTrue("Adding multiple field values after marking as cached isActualChange is true ", !pbm0.isActualChange());
assertTrue("Adding multiple field values yields different results ", compareMaps(values, pbm0.getFields()));
fieldCount++;
if(fieldCount > 10) {
break;
}
}
}
}
}
private static boolean compareMaps(HashMap<String, String> map1, HashMap<String, String> map2) {
if(map1.size() != map2.size()) {
logger.error("The sizes are different");
return false;
}
for(String key : map1.keySet()) {
if(!map2.containsKey(key)) {
logger.error("Map2 does not contain " + key);
return false;
}
if(!map1.get(key).equals(map2.get(key))) {
logger.error("Map1 has " + map1.get(key) + " and map2 has " + map2.get(key) + " for key " + key);
return false;
}
}
return true;
}
}