package org.openehr.am.template;
import java.math.BigInteger;
import openEHR.v1.template.Statement;
import org.openehr.am.archetype.constraintmodel.ArchetypeConstraint;
import org.openehr.am.archetype.constraintmodel.CObject;
import org.openehr.rm.support.basic.Interval;
public class SetNodeOccurrencesTest extends TemplateTestBase {
public void setUp() throws Exception {
super.setUp();
archetype = loadArchetype(
"openEHR-EHR-ITEM_TREE.medication_test_three.v1.adl");
rule = Statement.Factory.newInstance();
rule.setPath(PATH);
rule.setMax(null);
rule.setMin(null);
}
public void testSetMaxOccurrencesToZeroOnOptionalNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(0, null));
flattener.applyOccurrencesConstraint(archetype, cobj, BigInteger.valueOf(0), null);
constraint = archetype.node(PATH);
assertTrue("unexpected constraint", constraint instanceof CObject);
assertEquals("unexpected max occurrences", 0,
cobj.getOccurrences().getUpper().intValue());
assertEquals("unexpected min occurrences", 0,
cobj.getOccurrences().getLower().intValue());
}
// make optional node required
public void testSetMinOccurrencesToOneOnOptionalNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(0, 1));
flattener.applyOccurrencesConstraint(archetype, cobj, null, BigInteger.valueOf(1));
constraint = archetype.node(PATH);
assertTrue("unexpected constraint", constraint instanceof CObject);
assertEquals("unexpected max occurrences", 1,
cobj.getOccurrences().getUpper().intValue());
assertEquals("unexpected min occurrences", 1,
cobj.getOccurrences().getLower().intValue());
}
// make optional node not allowed
public void testSetMaxOccurrencesTozeroOnOptionalNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(0, 1));
flattener.applyOccurrencesConstraint(archetype, cobj, BigInteger.valueOf(0), null);
constraint = archetype.node(PATH);
assertTrue("unexpected constraint", constraint instanceof CObject);
assertEquals("unexpected max occurrences", 0,
cobj.getOccurrences().getUpper().intValue());
assertEquals("unexpected min occurrences", 0,
cobj.getOccurrences().getLower().intValue());
}
public void testSetMaxOccurrencesToZeroOnRequiredNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(1, 1));
try {
flattener.applyOccurrencesConstraint(archetype, cobj, BigInteger.valueOf(0), null);
fail("expect flattening exception on contradicting occurrences");
} catch(FlatteningException e) {}
}
public void testSetMaxOccurrencesToTwoOnRequiredNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(1, 1));
try {
flattener.applyOccurrencesConstraint(archetype, cobj, BigInteger.valueOf(2), null);
fail("expect flattening exception on too permissive occurrences");
} catch(FlatteningException e) {}
}
public void testSetMaxOccurrencesToOneOnRequiredNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(1, 1));
flattener.applyOccurrencesConstraint(archetype, cobj, BigInteger.valueOf(1), null);
constraint = archetype.node(PATH);
assertTrue("unexpected constraint", constraint instanceof CObject);
assertEquals("unexpected max occurrences", 1,
cobj.getOccurrences().getUpper().intValue());
assertEquals("unexpected min occurrences", 1,
cobj.getOccurrences().getLower().intValue());
}
public void testSetMinOccurrencesToZeroOnRequiredNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(1, 1));
try {
flattener.applyOccurrencesConstraint(archetype, cobj, null, BigInteger.valueOf(0));
fail("expect flattening exception on too permissive occurrences");
} catch(FlatteningException e) {}
}
public void testSetMinOccurrencesToTwoOnRequiredNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(1, 1));
try {
flattener.applyOccurrencesConstraint(archetype, cobj, null, BigInteger.valueOf(2));
fail("expect flattening exception on contradicting occurrences");
} catch(FlatteningException e) {}
}
public void testSetMinOccurrencesToOneOnOptionalNode2() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(0, null));
flattener.applyOccurrencesConstraint(archetype, cobj, null, BigInteger.valueOf(1));
constraint = archetype.node(PATH);
assertTrue("unexpected constraint", constraint instanceof CObject);
assertEquals("unexpected min occurrences", 1,
cobj.getOccurrences().getLower().intValue());
assertNull("unexpected max occurrences",
cobj.getOccurrences().getUpper());
}
public void testSetMinOccurrencesToTwoOnOptionalNode() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(0, null));
flattener.applyOccurrencesConstraint(archetype, cobj, null, BigInteger.valueOf(2));
constraint = archetype.node(PATH);
assertEquals("unexpected min occurrences", 2,
cobj.getOccurrences().getLower().intValue());
assertNull("unexpected max occurrences",
cobj.getOccurrences().getUpper());
}
public void testSetMaxOccurrencesToOneOnOptionalNodeWithoutMinimum() throws Exception {
constraint = archetype.node(PATH);
CObject cobj = (CObject) constraint;
cobj.setOccurrences(new Interval<Integer>(0, null));
flattener.applyOccurrencesConstraint(archetype, cobj, BigInteger.valueOf(1), null);
constraint = archetype.node(PATH);
assertEquals("unexpected min occurrences", 0,
cobj.getOccurrences().getLower().intValue());
assertEquals("unexpected max occurrences", 1,
cobj.getOccurrences().getUpper().intValue());
}
private static final String PATH = "/items[at0001]";
private Statement rule;
private ArchetypeConstraint constraint;
}