package org.openehr.am.template; import org.openehr.am.archetype.constraintmodel.ArchetypeConstraint; import org.openehr.am.archetype.constraintmodel.CComplexObject; import org.openehr.am.openehrprofile.datatypes.quantity.CDvQuantity; import org.openehr.am.openehrprofile.datatypes.quantity.CDvQuantityItem; import org.openehr.rm.support.basic.Interval; import openEHR.v1.template.QuantityConstraint; import openEHR.v1.template.QuantityUnitConstraint; import openEHR.v1.template.Statement; public class QuantityConstraintTest extends TemplateTestBase { public void setUp() throws Exception { super.setUp(); archetype = loadArchetype( "openEHR-EHR-ITEM_TREE.medication_quantity_test.v1.adl"); constraint = archetype.node(PATH); ccobj = (CComplexObject) constraint; rule = Statement.Factory.newInstance(); rule.setPath(PATH); } public void tearDown() { constraint = null; flattened = null; archetype = null; } public void testSetQuantityConstraintWithMagnitudeAndUnits() throws Exception { QuantityConstraint qc = QuantityConstraint.Factory.newInstance(); QuantityUnitConstraint quc = qc.addNewUnitMagnitude(); quc.setUnit("/min"); quc.setMaxMagnitude(300); quc.setMinMagnitude(10); quc.setIncludesMaximum(true); quc.setIncludesMinimum(true); rule.setConstraint(qc); flattener.applyValueConstraint(archetype, ccobj, rule); archetype.reloadNodeMaps(); constraint = archetype.node(PATH + "/value"); CDvQuantityItem item = new CDvQuantityItem( new Interval<Double>(Double.valueOf(10.0), Double.valueOf(300)), "/min"); assertCDvQuantityWithSingleItem(constraint, item); } public void testSetQuantityConstraintWithIncludedUnits() throws Exception { String[] units = { "mmol/L" }; QuantityConstraint qc = QuantityConstraint.Factory.newInstance(); qc.setIncludedUnitsArray(units); rule.setConstraint(qc); flattener.applyValueConstraint(archetype, ccobj, rule); archetype.reloadNodeMaps(); constraint = archetype.node(PATH + "/value"); CDvQuantityItem item = new CDvQuantityItem(units[0]); assertCDvQuantityWithSingleItem(constraint, item); } public void testSetQuantityConstraintWithIncludedUnitsOnTemplate() throws Exception { flattenTemplate("test_quantity_constraint_included_units.oet"); constraint = flattened.node(PATH + "/value"); CDvQuantityItem item = new CDvQuantityItem("mmol/L"); assertCDvQuantityWithSingleItem(constraint, item); } public void testIncludedUnitsWithEmptyCDvQuantity() throws Exception { flattenTemplate("test_quantity_constraint_included_units3.oet"); String path = "/data[at0001]/items[at0004]"; ArchetypeConstraint ac = flattened.node(path + "/value"); CDvQuantityItem item = new CDvQuantityItem("mg/day"); assertCDvQuantityWithSingleItem(ac, item); } public void testSetQuantityConstraintWithMagnitudeAndUnitsOnTemplate() throws Exception { flattenTemplate("test_quantity_constraint_magnitude.oet"); constraint = flattened.node(PATH + "/value"); CDvQuantityItem item = new CDvQuantityItem( new Interval<Double>(10.0, 300.0), "/min"); assertCDvQuantityWithSingleItem(constraint, item); } public void testSetQuantityConstraintWithExcludedUnitsOnTemplate() throws Exception { flattenTemplate("test_quantity_constraint_excluded_units.oet"); ArchetypeConstraint ac = flattened.node(PATH + "/value"); CDvQuantityItem item = new CDvQuantityItem( new Interval<Double>(0.0, 1000.0), "cm"); assertCDvQuantityWithSingleItem(ac, item); } public void testSetQuantityConstraintWithMixedConstraints() throws Exception { flattenTemplate("test_quantity_constraint_mixed.oet"); String path = "/items[openEHR-EHR-OBSERVATION.lab_test.v1 and " + "name/value='B-HB']/data[at0001]/events[at0002]/data[at0003]" + "/items[at0078]/value"; ArchetypeConstraint ac = flattened.node(path); Interval<Double> magnitude = new Interval<Double>(20.0, 300.0); CDvQuantityItem item = new CDvQuantityItem(magnitude, "g/L"); assertCDvQuantityWithSingleItem(ac, item); } private static final String PATH = "/items[at0001]"; private Statement rule; private ArchetypeConstraint constraint; private CComplexObject ccobj; }