Browse Source

attr_assign with None becomes an attr_delete

Yentl Van Tendeloo 7 years ago
parent
commit
5b4e01f084
3 changed files with 34 additions and 69 deletions
  1. 32 67
      unit/test_all.py
  2. 1 1
      wrappers/classes/modelverse.xml
  3. 1 1
      wrappers/modelverse_SCCD.py

+ 32 - 67
unit/test_all.py

@@ -1016,80 +1016,45 @@ class TestModelverse(unittest.TestCase):
         assert attr_assign("users/user/test/b", "p2t", "weight", 0) == None
         assert read_attrs("users/user/test/b", "p2t") == {"weight": 0}
 
-    def test_op_attr_delete(self):
-        model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
-            SimpleAttribute Natural {
-                name = "natural"
-            }
-            SimpleAttribute String {
-                name = "string"
-            }
-
-            Class Place {
-                name = "Place"
-                name : String
-                capacity : Natural
-            }
-            Class Transition {
-                name = "Transition"
-                name : String
-            }
-            Association P2T (Place, Transition) {
-                name = "P2T"
-                weight : Natural
-            }
-            Association T2P (Transition, Place) {
-                name = "T2P"
-                weight : Natural
-            }
-            """)
-        assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": "natural"}
-        assert attr_delete("users/user/test/a", "Natural", "name") == None
-        assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": None}
+        # Non-existing model
+        try:
+            attr_assign("users/afa", "p1", "name", "abc")
+            self.fail()
+        except UnknownModel:
+            pass
 
-        assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
-        assert attr_delete("users/user/test/a", "Place", "name") == None
-        assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": None, "abstract": False, "lower_cardinality": None, "upper_cardinality": None}
+        # Non-existing element
+        try:
+            attr_assign("users/user/test/a", "PPPPPPP", "name", "abc")
+            self.fail()
+        except UnknownElement:
+            pass
 
+        # No read permissions
         try:
-            # Cannot delete action language attributes
-            attr_delete("users/user/test/a", "Place", "constraint")
-        except:
-            raise
+            attr_assign("administration/core", "formalisms", "name", "abc")
+            self.fail()
+        except ReadPermissionDenied:
             pass
 
-        assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": "P2T", "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None}
-        assert attr_delete("users/user/test/a", "P2T", "name") == None
-        assert attr_delete("users/user/test/a", "P2T", "source_lower_cardinality") == None
-        assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": None, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None}
+        # No write permissions
+        try:
+            attr_assign("formalisms/SimpleClassDiagrams", "Class", "name", "abc")
+            self.fail()
+        except WritePermissionDenied:
+            pass
 
-        model_add("users/user/test/b", "users/user/test/a", """
-            Place p1 {
-                name = "place 1"
-                capacity = 2
-            }
-            Place p2 {
-                name = "place 2"
-                capacity = 1
-            }
-            Transition t1 {
-                name = "transition"
-            }
-            
-            P2T p2t (p1, t1) {
-                weight = 4
-            }
-            T2P t2p (t1, p2) {
-                weight = 10
-            }
-            """)
-        assert read_attrs("users/user/test/b", "p1") == {"name": "place 1", "capacity": 2}
-        assert attr_delete("users/user/test/b", "p1", "capacity") == None
-        assert read_attrs("users/user/test/b", "p1") == {"name": "place 3", "capacity": None}
+        # No such attribute
+        try:
+            attr_assign("users/user/test/a", "Place", "ddd", 1)
+            self.fail()
+        except UnknownAttribute:
+            pass
 
-        assert read_attrs("users/user/test/b", "p2t") == {"weight": 4}
-        assert attr_delete("users/user/test/b", "p2t", "weight") == None
-        assert read_attrs("users/user/test/b", "p2t") == {"weight": None}
+        # Assign None, equals to attr_delete
+        assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "NewPlace", "abstract": False, "lower_cardinality": 4, "upper_cardinality": None}
+        attr_assign("users/user/test/a", "Place", "name", None)
+        assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": None, "abstract": False, "lower_cardinality": 4, "upper_cardinality": None}
 
     """
     def test_op_model_render(self):

+ 1 - 1
wrappers/classes/modelverse.xml

@@ -1083,7 +1083,7 @@
                     <state id="attr_assign">
                         <onentry>
                             <raise event="request">
-                                <parameter expr="['attr_add', self.parameters[1], self.parameters[2], self.parameters[3]]"/>
+                                <parameter expr="['attr_add', self.parameters[1], self.parameters[2], self.parameters[3]] if self.parameters[3] is not None else ['attr_delete', self.parameters[1], self.parameters[2]]"/>
                             </raise>
                         </onentry>
 

+ 1 - 1
wrappers/modelverse_SCCD.py

@@ -2077,7 +2077,7 @@ class Modelverse(RuntimeClassBase):
         self.raiseInternalEvent(Event("request", None, [['delete', self.parameters[1]]]))
     
     def _initialized_behaviour_operations_attr_assign_enter(self):
-        self.raiseInternalEvent(Event("request", None, [['attr_add', self.parameters[1], self.parameters[2], self.parameters[3]]]))
+        self.raiseInternalEvent(Event("request", None, [['attr_add', self.parameters[1], self.parameters[2], self.parameters[3]] if self.parameters[3] is not None else ['attr_delete', self.parameters[1], self.parameters[2]]]))
     
     def _initialized_behaviour_operations_attr_delete_enter(self):
         self.raiseInternalEvent(Event("request", None, [['attr_delete', self.parameters[1], self.parameters[2]]]))