Example #1
0
    def test_commit_and_rollback_subtype(self):
        """ Test commit and rollback of a subtype constraint. """
        obj1 = ObjectType(name="O1")
        obj2 = ObjectType(name="O2")
        cons = Constraint.SubtypeConstraint(subtype=obj1, supertype=obj2)

        self.assertEquals(obj1.covered_by, [])
        self.assertEquals(obj1.direct_subtypes, [])
        self.assertEquals(obj1.direct_supertypes, [])
        self.assertEquals(obj2.covered_by, [])
        self.assertEquals(obj2.direct_subtypes, [])
        self.assertEquals(obj2.direct_supertypes, [])

        cons.commit()

        self.assertEquals(obj1.covered_by, [cons])
        self.assertEquals(obj1.direct_subtypes, [])
        self.assertEquals(obj1.direct_supertypes, [obj2])
        self.assertEquals(obj2.covered_by, [cons])
        self.assertEquals(obj2.direct_subtypes, [obj1])
        self.assertEquals(obj2.direct_supertypes, [])

        with self.assertRaises(NotImplementedError):
            cons.rollback()

        # The commented out code below was used before I decided to raise
        # NotImplementedError for rollback.  See the comments in rollback().
        """
Example #2
0
    def test_duplicate_role_name(self):
        """ Test that a new name is generated for a role if the role name is
            already present on the fact type. """
        fact_type = FactType(name="Test")
        fact_type.add_role(ObjectType(name="Person"), name="R1")
        fact_type.add_role(ObjectType(name="Dog"), name="R1")

        names = [role.name for role in fact_type.roles]

        self.assertEquals(names, ["R1", "Dog"])
Example #3
0
    def test_display_nonempty(self):
        """ Test display of non-empty set."""
        _set = ModelElementSet()
        _set.add(ObjectType(name="GHI"))
        _set.add(ObjectType(name="XYZ"))
        _set.add(ObjectType(name="ABC"))
        _set.display()

        output = sys.stdout.getvalue().strip()
        self.assertEqual(output, "Model Elements:\n    ABC\n    GHI\n    XYZ")
Example #4
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)
Example #5
0
    def test_domain(self):
        """ Test object type domain under various name scenarios. """
        actual = ObjectType().domain.draw(2)
        expect = ['0', '1']
        self.assertItemsEqual(actual, expect)

        actual = ObjectType(name='').domain.draw(2)
        expect = ['0', '1']
        self.assertItemsEqual(actual, expect)

        actual = ObjectType(name='Test').domain.draw(2)
        expect = ['Test0', 'Test1']
        self.assertItemsEqual(actual, expect)

        actual = ObjectType(name='Test1').domain.draw(2)
        expect = ['Test1_0', 'Test1_1']
        self.assertItemsEqual(actual, expect)
Example #6
0
    def test_compatible_roles_via_subtype(self):
        """ Test case where join is OK because one role player is a subtype of
            the other role player. """
        obj1 = ObjectType(name="A")
        obj2 = ObjectType(name="B")
        obj3 = ObjectType(name="C")

        fact1 = FactType("AIsB")
        fact1.add_role(obj1)
        fact1.add_role(obj2)

        fact2 = FactType("BIsC")
        fact2.add_role(obj2)
        fact2.add_role(obj3)

        join1 = (fact1.roles[0], fact2.roles[0])
        join2 = (fact2.roles[0], fact1.roles[0])

        join_path = JoinPath()

        # At this point there is no subtype relation from obj1 to obj2, so the
        # join fails
        with self.assertRaises(JoinPathException) as ex:
            join_path.add_join(*join1)

        msg = "join roles must be played by compatible object types"
        self.assertEquals(ex.exception.message, msg)

        with self.assertRaises(JoinPathException) as ex:
            join_path.add_join(*join2)

        msg = "join roles must be played by compatible object types"
        self.assertEquals(ex.exception.message, msg)

        # Create a subtype relation so the join succeeds.
        cons = SubtypeConstraint(obj1, obj2)
        cons.commit()

        join_path.add_join(*join1)
        self.assertEquals(join_path.joins, [join1])

        # Reset the join path and try the join in the opposite direction
        join_path = JoinPath()
        join_path.add_join(*join2)
        self.assertEquals(join_path.joins, [join2])
Example #7
0
 def test_rename(self):
     """ Confirm items with same name added to set get renamed. """
     _set = ModelElementSet()
     _set.add(ObjectType(name="Item"))
     _set.add(FactType(name="Item"))
     _set.add(FactType(name="Item"))
     self.assertEqual(_set.count(), 3)
     self.assertIsInstance(_set.get("Item"), ObjectType)
     self.assertIsInstance(_set.get("Item2"), FactType)
     self.assertIsInstance(_set.get("Item3"), FactType)
Example #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, [])
Example #9
0
    def setUp(self):
        self.obj1 = ObjectType(name="A")
        self.obj2 = ObjectType(name="B")
        self.obj3 = ObjectType(name="C")

        self.fact1 = FactType(name="AHasB")
        self.fact1.add_role(self.obj1)
        self.fact1.add_role(self.obj2)

        self.fact2 = FactType(name="BHasC")
        self.fact2.add_role(self.obj2)
        self.fact2.add_role(self.obj3)

        self.fact3 = FactType(name="ALikesA")
        self.fact3.add_role(self.obj1)
        self.fact3.add_role(self.obj1)

        self.fact4 = FactType(name="ALikesB")
        self.fact4.add_role(self.obj1)
        self.fact4.add_role(self.obj2)
Example #10
0
    def test_display_nonempty(self):
        """ Test Display of non-empty model. """
        model = Model()
        model.object_types.add(ObjectType(name="O1"))
        model.fact_types.add(FactType(name="F1"))
        model.fact_types.add(FactType(name="F2"))
        model.constraints.add(Constraint(name="C1"))
        model.display()

        output = sys.stdout.getvalue().strip()
        self.assertEqual(output, "Object Types:\n    O1\nFact Types:\n    F1\n    F2\nConstraints:\n    C1")
Example #11
0
    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)
Example #12
0
    def test_add_role(self):
        """ Confirm we can add a role to the fact type. """
        obj1 = ObjectType(name="Person")
        obj2 = ObjectType(name="School")

        fact_type = FactType(name="PersonAttendsSchoolWithPersonAndPerson")

        role1 = fact_type.add_role(obj1)
        role2 = fact_type.add_role(obj2)
        role3 = fact_type.add_role(obj1)
        role4 = fact_type.add_role(obj1)

        self.assertEquals(fact_type.arity(), 4)

        self.assertIs(role1.fact_type, fact_type)
        self.assertIs(role1.player, obj1)
        self.assertEquals(role1.name, "Person")

        self.assertIs(role2.fact_type, fact_type)
        self.assertIs(role2.player, obj2)
        self.assertEquals(role2.name, "School")

        self.assertIs(role3.fact_type, fact_type)
        self.assertIs(role3.player, obj1)
        self.assertEquals(role3.name, "Person2")

        self.assertIs(role4.fact_type, fact_type)
        self.assertIs(role4.player, obj1)
        self.assertEquals(role4.name, "Person3")

        self.assertItemsEqual(obj1.roles, [])
        self.assertItemsEqual(obj2.roles, [])

        fact_type.commit()

        self.assertItemsEqual(obj1.roles, [role1, role3, role4])
        self.assertItemsEqual(obj2.roles, [role2])
Example #13
0
    def test_add_remove_object_type(self):
        """ Test adding and removing an object type from the model. """
        model = Model()
        obj1 = ObjectType(name="O1")
        model.add(obj1)

        self.assertEquals(model.object_types.count(), 1)
        self.assertEquals(model.object_types.get("O1"), obj1)

        with self.assertRaises(NotImplementedError):
            model.remove(obj1)

        # I decided for now to just raise a NotImplementedError for rollback,
        # since I'm not sure what the right behavior should be.
        """
Example #14
0
    def test_add_remove_fact_type(self):
        """ Test adding and removing a fact type from the model. """
        model = Model()
        fact = FactType(name="F1")
        fact.add_role(player=ObjectType(name="O1"))
        model.add(fact)

        self.assertEquals(model.fact_types.count(), 1)
        self.assertEquals(model.fact_types.get("F1"), fact)

        with self.assertRaises(NotImplementedError):
            model.remove(fact)

        # I decided for now to just raise a NotImplementedError for rollback,
        # since I'm not sure what the right behavior should be.
        """
Example #15
0
    def test_get_elements(self):
        """ Test get() method. """
        model = Model()
        obj = ObjectType(name="O1")
        cons = Constraint(name="O1")
        fact = FactType(name="F1")
    
        model.add(obj)
        model.add(cons)
        model.add(fact)

        self.assertEquals(model.get("ObjectTypes.O1"), obj)
        self.assertEquals(model.get("Constraints.O1"), cons)
        self.assertEquals(model.get("FactTypes.F1"), fact)
        self.assertEquals(model.get("ObjectTypes."), None)
        self.assertEquals(model.get("F1"), None)       
Example #16
0
    def test_add_remove_constraint_with_side_effects(self):
        """ Test adding and removing a generic constraint from the model. """
        model = Model()
        obj1 = ObjectType(name="O1")        
        cons1 = Constraint(name="C1", covers=[obj1])
        model.add(obj1)
        model.add(cons1)

        self.assertEquals(model.constraints.count(), 1)
        self.assertEquals(model.constraints.get("C1"), cons1)
        self.assertEquals(model.constraints.get("C1").covers[0], obj1)
        self.assertEquals(model.object_types.get("O1").covered_by[0], cons1)

        model.remove(cons1)
        self.assertEquals(model.constraints.count(), 0)
        self.assertEquals(model.constraints.get("C1"), None)
        self.assertEquals(model.object_types.get("O1").covered_by, [])
Example #17
0
 def setUp(self):
     self.object_type1 = ObjectType(name="Object Type 1")
     self.fact_type1 = FactType(name="Fact Type 1")
     self.constraint1 = Constraint(name="Constraint 1")
Example #18
0
 def test_rollback(self):
     """ Test rollback of an ObjectType. """
     with self.assertRaises(NotImplementedError):
         ObjectType().rollback()
Example #19
0
 def test_add_object_type(self):
     """ Test the addition of an object type to a constraint. """
     covers = [ObjectType(uid="2", name="O1")]
     cons = Constraint.Constraint(uid="1", name="C1", covers=covers)
     self.assertEquals(cons.covers[0].name, "O1")