def test_commit_rollback_iuc(self): """ Test commit and rollback of internal uniqueness constraints.""" obj1 = EntityType(name="O1") obj2 = EntityType(name="V1") fact1 = FactType(name="F1") role1 = fact1.add_role(player=obj1) role2 = fact1.add_role(player=obj2) fact1.commit() fact2 = FactType(name="F2") role3 = fact2.add_role(player=obj1) fact2.commit() cons1 = Constraint.UniquenessConstraint(covers=[role1], identifier_for=None) cons2 = Constraint.UniquenessConstraint(covers=[role2], identifier_for=obj1) self.assertEquals(role1.covered_by, []) self.assertEquals(role2.covered_by, []) self.assertEquals(obj1.identifying_constraint, None) self.assertEquals(obj1.ref_roles, []) self.assertItemsEqual(obj1.roles, [role1, role3]) cons1.commit() cons2.commit() self.assertEquals(role1.covered_by, [cons1]) self.assertEquals(role2.covered_by, [cons2]) self.assertEquals(obj1.identifying_constraint, cons2) self.assertEquals(obj1.ref_roles, [role1]) cons1.rollback() cons2.rollback() self.assertEquals(role1.covered_by, []) self.assertEquals(role2.covered_by, []) self.assertEquals(obj1.identifying_constraint, None) self.assertEquals(obj1.ref_roles, [])
def test_commit_and_rollback_affect_on_role_unique(self): """ Test affect of commit and rollback on role.unique """ fact = FactType("AHasB") fact.add_role(ObjectType("A")) fact.add_role(ObjectType("B")) fact.commit() role = fact.roles[0] self.assertFalse(role.unique) # Unique after covered by a simple IUC uniq1 = Constraint.UniquenessConstraint(covers=[role]) uniq1.commit() self.assertTrue(role.unique) # No longer unique after rollback uniq1.rollback() self.assertFalse(role.unique) # Not unique after covered by spanning IUC uniq2 = Constraint.UniquenessConstraint(covers=[role, fact.roles[1]]) uniq2.commit() self.assertFalse(role.unique) # Unique again, covered by simple IUC uniq1.commit() self.assertTrue(role.unique) # Cover by a second simple IUC uniq3 = Constraint.UniquenessConstraint(covers=[role]) uniq3.commit() # Still unique after rollback, because it's still covered by a simple IUC uniq1.rollback() self.assertTrue(role.unique) # No longer unique: not covered by any simple IUCs. uniq3.rollback() self.assertFalse(role.unique)
def _load_uniqueness_constraint(self, xml_node): """ Load uniqueness constraint. """ attribs, name = get_basic_attribs(xml_node) name = "Uniqueness constraint " + name # Get object type that this constraint is a preferred id for pref_node = find(xml_node, "PreferredIdentifierFor") if pref_node is not None: uid = pref_node.get("ref") attribs['identifier_for'] = self._elements.get(uid) # Get sequence of covered roles covers = self._load_role_sequence(xml_node, name) if covers and isinstance(covers[0], Constraint.SubtypeConstraint): return None # Covers a role in an implicit subtype fact else: return Constraint.UniquenessConstraint(covers=covers, **attribs)
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 test_commit_rollback_euc(self): """ Test commit and rollback of external uniqueness constraint.""" obj1 = EntityType(name="O1") obj2 = EntityType(name="V1") obj3 = EntityType(name="V2") fact1 = FactType(name="F1") role11 = fact1.add_role(player=obj1) role12 = fact1.add_role(player=obj2) fact1.commit() fact2 = FactType(name="F2") role21 = fact2.add_role(player=obj1) role23 = fact2.add_role(player=obj3) fact2.commit() fact3 = FactType(name="F3") role31 = fact3.add_role(player=obj1) fact3.commit() cons = Constraint.UniquenessConstraint(covers=[role12, role23], identifier_for=obj1) self.assertEquals(obj1.identifying_constraint, None) self.assertEquals(obj1.ref_roles, []) self.assertItemsEqual(obj1.roles, [role11, role21, role31]) cons.commit() self.assertEquals(obj1.identifying_constraint, cons) self.assertItemsEqual(obj1.ref_roles, [role11, role21]) cons.rollback() self.assertEquals(obj1.identifying_constraint, None) self.assertEquals(obj1.ref_roles, [])