示例#1
0
    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)
示例#2
0
    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")
示例#3
0
 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)
示例#4
0
 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])
示例#5
0
 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)
示例#6
0
    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")
示例#7
0
    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)
示例#8
0
    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, [])
示例#9
0
    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)