浏览代码

Add preliminary execute_AL test

Yentl Van Tendeloo 7 年之前
父节点
当前提交
277e464883
共有 1 个文件被更改,包括 134 次插入1 次删除
  1. 134 1
      unit/test_all.py

+ 134 - 1
unit/test_all.py

@@ -4312,11 +4312,144 @@ class TestModelverse(unittest.TestCase):
         transformation_execute_MANUAL("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"}, lambda i: i)
         assert len(element_list_nice("users/user/test/a")) == len(element_list_nice("users/user/test/aaa"))
 
+    def test_op_transformation_execute_AL(self):
+        # Add models for transformation
+        model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
+            SimpleAttribute String {}
+            Class A {
+                name = "A"
+                name : String
+            }
+            """)
+        model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
+            SimpleAttribute String {}
+            Class B {
+                name = "B"
+                name : String
+            }
+            """)
+        model_add("users/user/test/a", "users/user/test/A", "A a {}")
+        model_add("users/user/test/b", "users/user/test/B", "B b {}")
+
+        default_code_empty = "Boolean function main(model : Element):\n\treturn True!"
+        default_code_true = "include \"modelling.alh\"\nBoolean function main(model : Element):\n\tinstantiate_attribute(model, \"MODEL_A/a\", \"name\", \"CHANGED\")\n\tinstantiate_node(model, \"MODEL_B/B\", \"\")\n\treturn True!"
+        default_code_false = "include \"modelling.alh\"\nBoolean function main(model : Element):\n\tinstantiate_attribute(model, \"MODEL_A/a\", \"name\", \"CHANGED\")\n\tinstantiate_node(model, \"MODEL_B/B\", \"\")\n\treturn False!"
+
+        # Add some activity to execute
+        transformation_add_AL({}, {}, "users/user/test/c", default_code_true)
+
+        # Now execute
+        transformation_execute_AL("users/user/test/c", {}, {})
+
+        # Now do the same, but with a model
+        transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d", default_code_true)
+
+        transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/aa"})
+
+        lst = element_list_nice("users/user/test/aa")
+        assert len(lst) == 1
+        assert lst[0]["__type"] == "B"
+        assert lst[0]["name"] == None
+        assert lst[0]["__id"].startswith("__")
+
+        # Original input model remains unchanged, as it is not an output model
+        lst = element_list_nice("users/user/test/a")
+        assert len(lst) == 1
+        assert lst[0]["__type"] == "A"
+        assert lst[0]["name"] == None
+        assert lst[0]["__id"].startswith("__")
+
+        # Execute activity with non-existing model (input)
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "dfadf"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except UnknownModel:
+            assert "f" not in model_list("users/user/test")
+
+        # Execute non-existing activity
+        try:
+            transformation_execute_AL("adfadf", {}, {"MODEL_B": "users/user/test/abc"})
+            self.fail()
+        except UnknownModel:
+            assert "abc" not in model_list("users/user/test")
+
+        # Unbound source model
+        try:
+            transformation_execute_AL("users/user/test/d", {}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except SourceModelNotBound:
+            pass
+
+        # Unknown source key
+        try:
+            transformation_execute_AL("users/user/test/d", {"ABC": "users/user/test/a", "MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except SourceModelNotBound:
+            pass
+
+        # Unknown target key
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"DEF": "users/user/test/b"})
+            self.fail()
+        except TargetModelNotBound:
+            pass
+
+        # Read permissions denied source
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except ReadPermissionDenied:
+            pass
+
+        # Execute permissions denied activity
+        try:
+            transformation_execute_AL("administration/core", {"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except ExecutePermissionDenied:
+            pass
+
+        # Write permissions denied target (folder)
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/abc"})
+            self.fail()
+        except WritePermissionDenied:
+            pass
+
+        # Write permissions denied target (model)
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/core"})
+            self.fail()
+        except WritePermissionDenied:
+            pass
+
+        # Execute activity with non-conforming input models
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except TypeMismatch:
+            assert "f" not in model_list("users/user/test")
+
+        # Execute activity with non-conforming output models that already exist
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/c"})
+            self.fail()
+        except TypeMismatch:
+            assert element_list_nice("users/user/test/c") > 0
+
+        # Execute activity with colliding models, which means that it is copied
+        transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f", default_code_empty)
+        transformation_execute_AL("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"})
+        assert len(element_list_nice("users/user/test/a")) == len(element_list_nice("users/user/test/aaa"))
+
+        # Make sure that models are not written when returning False
+        transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/g", default_code_false)
+        transformation_execute_AL("users/user/test/g", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/bb"})
+        assert "bb" not in model_list("users/user/test")
+
     """
     def test_op_model_render(self):
     def test_op_transformation_execute_MT(self):
     def test_op_transformation_execute_AL(self):
-    def test_op_transformation_execute_MANUAL(self):
     def test_op_transformation_signature(self):
     def test_op_process_signature(self):
     """