def test_commit_and_rollback_value(self): """ Test commit and rollback of value constraints. """ d0 = Domain.IntegerDomain() role = Role(name="R1") obj = ObjectType(name="O1", data_type=d0) d1 = Constraint.ValueDomain() d1.add_range("Dog") rvc = Constraint.ValueConstraint(name="RVC", covers=[role], domain=d1) self.assertEquals(role.covered_by, []) rvc.commit() self.assertEquals(role.covered_by, [rvc]) rvc.rollback() self.assertEquals(role.covered_by, []) vc = Constraint.ValueConstraint(name="VTVC", covers=[obj], domain=d1) self.assertEquals(obj.covered_by, []) self.assertEquals(obj.domain, obj.data_type) self.assertEquals(obj.domain, d0) vc.commit() self.assertEquals(obj.covered_by, [vc]) self.assertEquals(obj.domain, d1) self.assertEquals(obj.data_type, d0) vc.rollback() self.assertEquals(obj.covered_by, []) self.assertEquals(obj.domain, obj.data_type) self.assertEquals(obj.domain, d0)
def test_vc_too_large(self): """ Test a value constraint range that is too large. """ cons = Constraint.ValueConstraint() with self.assertRaises(Constraint.ValueConstraintError) as ex: cons.domain.add_range(0, Constraint.ValueDomain.MAX_SIZE) self.assertEquals(ex.exception.message, "The range of the value constraint is too large") cons = Constraint.ValueConstraint() with self.assertRaises(Constraint.ValueConstraintError) as ex: cons.domain.add_range(75, float('inf')) self.assertEquals(ex.exception.message, "Value constraints only support integer ranges")
def test_vc_int_ranges_open(self): """ Test the addition of value ranges to a value constraint with explicit inclusion values. """ cons = Constraint.ValueConstraint(uid="1", name="VC1") cons.domain.add_range("1", "2", min_open=True) cons.domain.add_range("5", "10", max_open=True) cons.domain.add_range("11", "13", min_open=True, max_open=True) self.assertItemsEqual(cons.domain.draw(10), [2, 5, 6, 7, 8, 9, 12]) self.assertEquals(cons.size, 7)
def test_vc_int_ranges(self): """ Test the addition of value ranges to a value constraint with default inclusion values. """ cons = Constraint.ValueConstraint(name="VC1") cons.domain.add_range("1", "4") self.assertItemsEqual(cons.domain.draw(10), [1, 2, 3, 4]) self.assertEquals(cons.size, 4) cons.domain.add_range("3", "5") self.assertItemsEqual(cons.domain.draw(10), [1, 2, 3, 4, 5])
def test_vc_add_enum(self): """ Test the addition of enumerated items to a value constraint.""" domain = Constraint.ValueDomain() domain.add_range("Dog", "Dog") domain.add_range("Cat") domain.add_range(1.35) domain.add_range(9) cons = Constraint.ValueConstraint(domain, name="VC1") self.assertItemsEqual(cons.domain.draw(4), ["Dog", "Cat", 1.35, 9]) self.assertEquals(cons.size, 4)
def test_vc_invalid_range(self): """ Test a value constraint with an invalid integer range. """ cons = Constraint.ValueConstraint() with self.assertRaises(Constraint.ValueConstraintError) as ex: cons.domain.add_range("12", "13", min_open=True, max_open=True) self.assertEquals(ex.exception.message, "The range of the value constraint is invalid") with self.assertRaises(Constraint.ValueConstraintError) as ex: cons.domain.add_range("3", "2") self.assertEquals(ex.exception.message, "The range of the value constraint is invalid")
def test_of_type_without_hit(self): """ Test of_type method with empty result. """ cons_set = Constraint.ConstraintSet() cons1 = Constraint.SubsetConstraint(uid="1", name="S1") cons2 = Constraint.ValueConstraint(uid="2", name="V1") cons3 = Constraint.SubsetConstraint(uid="3", name="S2") cons_set.add(cons1) cons_set.add(cons2) cons_set.add(cons3) actual = cons_set.of_type(Constraint.MandatoryConstraint) expect = [] self.assertItemsEqual(actual, expect)
def test_commit_and_rollback(self): """ Test committing and rolling back constraints on a model. """ model = Model() obj1 = ObjectType(name="O1") obj2 = ObjectType(name="O2") fact = FactType(name="F1") role1 = fact.add_role(player=obj1, name="R1") role2 = fact.add_role(player=obj2, name="R2") cons1 = Constraint.MandatoryConstraint(name="M1", covers=[role1]) cons2 = Constraint.UniquenessConstraint(name="U1", covers=[role1, role2]) cons3 = Constraint.ValueConstraint(name="V1", covers=[obj1]) for element in [obj1, obj2, fact, cons1, cons2, cons3]: model.add(element) self.assertEquals(model.constraints.get("M1").covers, [role1]) self.assertEquals(model.constraints.get("U1").covers, [role1, role2]) self.assertEquals(model.constraints.get("V1").covers, [obj1]) self.assertEquals(role1.covered_by, [cons1, cons2]) self.assertEquals(role2.covered_by, [cons2]) self.assertEquals(obj1.covered_by, [cons3]) model.remove(cons2) model.remove(cons3) self.assertEquals(model.constraints.get("M1"), cons1) self.assertEquals(model.constraints.get("U1"), None) self.assertEquals(model.constraints.get("V1"), None) self.assertEquals(role1.covered_by, [cons1]) self.assertEquals(role2.covered_by, []) self.assertEquals(obj1.covered_by, []) # Test that additional rollback has no effect model.remove(cons3) self.assertEquals(model.constraints.get("M1"), cons1) self.assertEquals(model.constraints.get("V1"), None) self.assertEquals(obj1.covered_by, [])
def _load_value_constraint(self, node): """ Load value constraint. """ attribs, name = get_basic_attribs(node) attribs['covers'] = covers = self._get_covered_element(node) data_type = covers[0].data_type if covers else None try: domain = Constraint.ValueDomain() for value_range in node_collection(node, "ValueRanges"): domain.add_range( min_value=value_range.get("MinValue"), max_value=value_range.get("MaxValue"), min_open=(value_range.get("MinInclusion") == "Open"), max_open=(value_range.get("MaxInclusion") == "Open"), data_type=data_type) except Constraint.ValueConstraintError as ex: reason = ex.message.lower() mesg = "Value constraint {0} because {1}".format(name, reason) self.omissions.append(mesg) return None return Constraint.ValueConstraint(domain, **attribs)