浏览代码

Added many folder-based tests

Yentl Van Tendeloo 7 年之前
父节点
当前提交
30f3add900
共有 4 个文件被更改,包括 255 次插入16 次删除
  1. 8 10
      bootstrap/core_algorithm.alc
  2. 223 4
      unit/test_all.py
  3. 11 1
      wrappers/classes/modelverse.xml
  4. 13 1
      wrappers/modelverse_SCCD.py

+ 8 - 10
bootstrap/core_algorithm.alc

@@ -1628,26 +1628,21 @@ String function cmd_model_modify(model_name : String, metamodel_name : String):
 
 	model_id = get_entry_id(model_name)
 
-	log("Name: " + model_name)
 	if (model_id != ""):
 		if (allow_read(current_user_id, model_id)):
 			type_id = get_entry_id(metamodel_name)
 			if (type_id != ""):
 				if (allow_read(current_user_id, type_id)):
-					log("Type 1: " + read_type(core, model_id))
-					log("Type 2: " + read_type(core, type_id))
 					if (read_type(core, model_id) != "Folder"):
 						if (read_type(core, type_id) != "Folder"):
 							Element new_model
 							new_model = get_full_model(model_id, type_id)
 							if (element_eq(new_model, read_root())):
 								return "Conformance hierarchy unknown for: " + model_name!
-							log("Enter modelling of " + model_name)
 							modify(new_model, allow_write(current_user_id, model_id))
 							if (allow_write(current_user_id, model_id)):
 								// Overwrite the modified model
 								model_overwrite(new_model, model_id, type_id)
-							log("Left model!")
 							return "Success"!
 						else:
 							return "Not a model: " + metamodel_name!
@@ -2378,12 +2373,15 @@ String function cmd_model_types(model_name : String):
 		String result
 
 		result = "Success: "
-		types = allOutgoingAssociationInstances(core, model_id, "instanceOf")
-		while (set_len(types) > 0):
-			type_link = set_pop(types)
-			result = result + cast_string(full_name(readAssociationDestination(core, type_link))) + ", " + cast_string(full_name(anAssociationDestination(core, type_link, "typing"))) + ", None\n"
+		if (read_type(core, model_id) != "Folder"):
+			types = allOutgoingAssociationInstances(core, model_id, "instanceOf")
+			while (set_len(types) > 0):
+				type_link = set_pop(types)
+				result = result + cast_string(full_name(readAssociationDestination(core, type_link))) + ", " + cast_string(full_name(anAssociationDestination(core, type_link, "typing"))) + ", None\n"
 
-		return result!
+			return result!
+		else:
+			return "Not a model: " + model_name!
 	else:
 		return "Model not found: " + model_name!
 	

+ 223 - 4
unit/test_all.py

@@ -256,6 +256,20 @@ class TestModelverse(unittest.TestCase):
         except UnknownModel:
             pass
 
+        # Test verify of a folder (model)
+        try:
+            verify("users", "formalisms/SimpleClassDiagrams")
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Test verify of a folder (metamodel)
+        try:
+            verify("users/user/test/a", "users")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_permission_modify(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
         assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
@@ -429,6 +443,13 @@ class TestModelverse(unittest.TestCase):
         model_add("users/user/test/e", "users/user/test/d")
         model_add("users/user/test/f", "users/user/test/e")
 
+        # Cannot instantiate a folder metamodel
+        try:
+            model_add("users/user/test/z", "users")
+            self.fail()
+        except NotAModel:
+            assert "z" not in model_list("users/user/test")
+
     def test_op_model_add_compilation_error(self):
         try:
             model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
@@ -445,10 +466,9 @@ class TestModelverse(unittest.TestCase):
                 }
                 """)
             #TODO at the moment, this still succeeds!
-            #self.fail()
+            self.fail()
         except:
             raise
-            pass
 
     def test_op_model_move(self):
         # Test basic scenario
@@ -494,6 +514,15 @@ class TestModelverse(unittest.TestCase):
         except WritePermissionDenied:
             pass
 
+        # Test moving an entire folder
+        folder_create("users/user/test/folder_a")
+        model_add("users/user/test/folder_a/a", "formalisms/SimpleClassDiagrams")
+        model_add("users/user/test/folder_a/b", "formalisms/SimpleClassDiagrams")
+        model_add("users/user/test/folder_a/c", "formalisms/SimpleClassDiagrams")
+        all_models = model_list_full("users/user/test/folder_a")
+        model_move("users/user/test/folder_a", "users/user/test/folder_b")
+        assert model_list_full("users/user/test/folder_b") == all_models
+
     def test_op_model_delete(self):
         # Test basic delete
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
@@ -595,9 +624,18 @@ class TestModelverse(unittest.TestCase):
         try:
             model_overwrite("users/user/test", "")
             self.fail()
-        except UnknownMetamodellingHierarchy:
+        except NotAModel:
             assert model_list("users/user/test") == before
 
+        # Test overwrite when there is no conformance relation
+        model_add("users/user/test/b", "formalisms/SimpleClassDiagrams")
+        alter_context("users/user/test/a", "users/user/test/b")
+        try:
+            model_overwrite("users/user/test/a", "")
+            self.fail()
+        except UnknownMetamodellingHierarchy:
+            pass
+
     def test_op_user_logout(self):
         try:
             element_list_nice("administration/core")
@@ -665,6 +703,13 @@ class TestModelverse(unittest.TestCase):
         # No write permission, but can query
         assert type(all_instances("formalisms/SimpleClassDiagrams", "Class")) == set
 
+        # Check with "folder" model
+        try:
+            all_instances("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_admin_promote_demote(self):
         # Verify that user doesn't have admin permissions
         try:
@@ -708,6 +753,19 @@ class TestModelverse(unittest.TestCase):
         except UnknownUser:
             pass
 
+        # Try with folders
+        try:
+            admin_promote("users")
+            self.fail()
+        except UnknownUser:
+            pass
+
+        try:
+            admin_demote("users")
+            self.fail()
+        except UnknownUser:
+            pass
+
         # Can also demote ourselves again
         admin_demote("user")
 
@@ -769,6 +827,13 @@ class TestModelverse(unittest.TestCase):
             user_logout()
             login("user", "user")
 
+        # Check on folder "model"
+        try:
+            user_password("users", "users2")
+            self.fail()
+        except UnknownUser:
+            pass
+
     def test_op_model_types(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
 
@@ -818,6 +883,13 @@ class TestModelverse(unittest.TestCase):
         # Test non-model location
         assert model_types("formalisms") == set([])
 
+        # Check on folder "model"
+        try:
+            model_types("users")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_folder_create(self):
         # Create a folder
         assert folder_create("users/user/test/folder_a") == None
@@ -921,6 +993,13 @@ class TestModelverse(unittest.TestCase):
         # No write permission, but can query
         assert type(element_list("formalisms/SimpleClassDiagrams")) == set
 
+        # Check on folder "model"
+        try:
+            element_list("users")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_element_list_nice(self):
         # Test simple element_list_nice
         model_add("users/user/test/a", "formalisms/ProcessModel", """
@@ -1025,6 +1104,13 @@ class TestModelverse(unittest.TestCase):
         # No write permission, but can query
         assert type(element_list_nice("formalisms/SimpleClassDiagrams")) == list
 
+        # Check on folder "model"
+        try:
+            element_list_nice("users")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_types(self):
         # Try operation of unopened model
         assert types("formalisms/ProcessModel") == element_list("formalisms/SimpleClassDiagrams")
@@ -1067,6 +1153,13 @@ class TestModelverse(unittest.TestCase):
         # No write permission for either M or MM, but can query
         assert type(types("formalisms/SimpleClassDiagrams")) == set
 
+        # Check on folder "model"
+        try:
+            types("users")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_read_info(self):
         # Basic case
         model_add("users/user/test/a", "formalisms/ProcessModel", """
@@ -1109,6 +1202,13 @@ class TestModelverse(unittest.TestCase):
         # No write permission, but can query
         assert type(read_info("formalisms/SimpleClassDiagrams", "Class")) == tuple
 
+        # Check on folder "model"
+        try:
+            read_info("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_read_attrs(self):
         # Basic behaviour
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
@@ -1194,6 +1294,13 @@ class TestModelverse(unittest.TestCase):
         # No write permissions, but can query
         assert type(read_attrs("formalisms/SimpleClassDiagrams", "Class")) == type(dict())
 
+        # Check on folder "model"
+        try:
+            read_attrs("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attr_assign(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute Natural {
@@ -1306,6 +1413,13 @@ class TestModelverse(unittest.TestCase):
         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}
 
+        # Check on folder "model"
+        try:
+            attr_assign("users", "a", "b", "c")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attr_delete(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute Natural {
@@ -1412,6 +1526,13 @@ class TestModelverse(unittest.TestCase):
         except UnknownAttribute:
             pass
 
+        # Check on folder "model"
+        try:
+            attr_delete("users", "a", "b")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attr_delete_code(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute Natural {
@@ -1456,6 +1577,13 @@ class TestModelverse(unittest.TestCase):
         attr_delete("users/user/test/a", "Place", "constraint")
         assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
 
+        # Check on folder "model"
+        try:
+            attr_delete("users", "a", "b")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attr_assign_code(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute Natural {
@@ -1565,6 +1693,13 @@ class TestModelverse(unittest.TestCase):
         except CompilationError:
             pass
 
+        # Check on folder "model"
+        try:
+            attr_assign_code("users", "a", "b", "c")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_instantiate(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
         assert element_list("users/user/test/a") == set([])
@@ -1716,6 +1851,13 @@ class TestModelverse(unittest.TestCase):
         except IncorrectFormat:
             assert element_list("users/user/test/a") == before
 
+        # Check on folder "model"
+        try:
+            instantiate("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_delete_element(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             Class A {}
@@ -1797,6 +1939,13 @@ class TestModelverse(unittest.TestCase):
         except UnknownElement:
             assert element_list_nice("users/user/test/d") == [{"__type" : "Class", "__id": "A", "lower_cardinality": None, "upper_cardinality": None, "constraint": {"AL": ""}, "name": None, "abstract": None}]
 
+        # Check on folder "model"
+        try:
+            delete_element("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_AL_text(self):
         # Test normal situation with code provided by assignment
         model_add("users/user/test/b", "formalisms/SimpleClassDiagrams", """
@@ -1891,6 +2040,13 @@ class TestModelverse(unittest.TestCase):
         # No write permissions, but can query
         assert type(read_outgoing("formalisms/SimpleClassDiagrams", "Class", "")) == type(set())
 
+        # Check on folder "model"
+        try:
+            read_outgoing("users", "a", "")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_read_incoming(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -1955,6 +2111,13 @@ class TestModelverse(unittest.TestCase):
         # No write permissions, but can query
         assert type(read_incoming("formalisms/SimpleClassDiagrams", "Class", "")) == type(set())
 
+        # Check on folder "model"
+        try:
+            read_incoming("users", "a", "")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_read_association_source(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2013,6 +2176,13 @@ class TestModelverse(unittest.TestCase):
         except NotAnAssociation:
             pass
 
+        # Check on folder "model"
+        try:
+            read_association_source("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_read_association_destination(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2066,11 +2236,18 @@ class TestModelverse(unittest.TestCase):
 
         # Not an association
         try:
-            read_association_source("users/user/test/a", "A")
+            read_association_destination("users/user/test/a", "A")
             self.fail()
         except NotAnAssociation:
             pass
 
+        # Check on folder "model"
+        try:
+            read_association_destination("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_connections_between(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2127,6 +2304,13 @@ class TestModelverse(unittest.TestCase):
         # No write permissions, but can query
         assert connections_between("formalisms/SimpleClassDiagrams", "Association", "Association") == set(["Association", "Inheritance"])
 
+        # Check on folder "model"
+        try:
+            connections_between("users", "a", "b")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_define_attribute(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2217,6 +2401,13 @@ class TestModelverse(unittest.TestCase):
         except UnknownM3:
             pass
 
+        # Check on folder "model"
+        try:
+            define_attribute("users", "a", "b", "c")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_read_defined_attrs(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2285,6 +2476,13 @@ class TestModelverse(unittest.TestCase):
         except UnknownM3:
             pass
 
+        # Check on folder "model"
+        try:
+            read_defined_attrs("users", "a")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_undefine_attribute(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2369,6 +2567,13 @@ class TestModelverse(unittest.TestCase):
         except WritePermissionDenied:
             assert read_defined_attrs("formalisms/SimpleClassDiagrams", "Class") == before
 
+        # Check on folder "model"
+        try:
+            undefine_attribute("users", "a", "b", True)
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attribute_optional(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2477,6 +2682,13 @@ class TestModelverse(unittest.TestCase):
         except UnknownAttribute:
             assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural", "new_name": "String"}, {"value": "Natural"})
 
+        # Check on folder "model"
+        try:
+            attribute_optional("users", "a", "b", True)
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attribute_type(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}
@@ -2581,6 +2793,13 @@ class TestModelverse(unittest.TestCase):
         except UnknownAttribute:
             assert read_defined_attrs("users/user/test/a", "D") == ({"value": "String", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
 
+        # Check on folder "model"
+        try:
+            attribute_type("users", "a", "b", "c")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_attribute_name(self):
         model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
             SimpleAttribute String {}

+ 11 - 1
wrappers/classes/modelverse.xml

@@ -2223,7 +2223,7 @@
                             </raise>
                         </onentry>
 
-                        <transition cond="self.expect_response_partial('Success: ')" target="../prepare_call">
+                        <transition cond="self.expect_response_partial('Success: ', pop=False)" target="../prepare_call">
                             <script>
                                 response = self.split_response(self.responses.pop(0))
                                 if response:
@@ -2232,6 +2232,16 @@
                                     self.registered_metamodel[self.current_model] = None
                             </script>
                         </transition>
+
+                        <transition cond="self.expect_response_partial('Not a model: ', pop=False)" target="../../wait_for_action/megamodelling">
+                            <script>
+                                self.actions.pop(0)
+                            </script>
+                            <raise event="exception">
+                                <parameter expr="'NotAModel'"/>
+                                <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                            </raise>
+                        </transition>
                     </state>
 
                     <state id="prepare_call">

+ 13 - 1
wrappers/modelverse_SCCD.py

@@ -1697,6 +1697,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_going_manual_search_0.setTrigger(None)
         _initialized_behaviour_going_manual_search_0.setGuard(self._initialized_behaviour_going_manual_search_0_guard)
         self.states["/initialized/behaviour/going_manual/search"].addTransition(_initialized_behaviour_going_manual_search_0)
+        _initialized_behaviour_going_manual_search_1 = Transition(self, self.states["/initialized/behaviour/going_manual/search"], [self.states["/initialized/behaviour/wait_for_action/megamodelling"]])
+        _initialized_behaviour_going_manual_search_1.setAction(self._initialized_behaviour_going_manual_search_1_exec)
+        _initialized_behaviour_going_manual_search_1.setTrigger(None)
+        _initialized_behaviour_going_manual_search_1.setGuard(self._initialized_behaviour_going_manual_search_1_guard)
+        self.states["/initialized/behaviour/going_manual/search"].addTransition(_initialized_behaviour_going_manual_search_1)
         
         # transition /initialized/behaviour/going_manual/prepare_call
         _initialized_behaviour_going_manual_prepare_call_0 = Transition(self, self.states["/initialized/behaviour/going_manual/prepare_call"], [self.states["/initialized/behaviour/wait_for_action/megamodelling"]])
@@ -3735,7 +3740,14 @@ class Modelverse(RuntimeClassBase):
             self.registered_metamodel[self.current_model] = None
     
     def _initialized_behaviour_going_manual_search_0_guard(self, parameters):
-        return self.expect_response_partial('Success: ')
+        return self.expect_response_partial('Success: ', pop=False)
+    
+    def _initialized_behaviour_going_manual_search_1_exec(self, parameters):
+        self.actions.pop(0)
+        self.raiseInternalEvent(Event("exception", None, ['NotAModel', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_going_manual_search_1_guard(self, parameters):
+        return self.expect_response_partial('Not a model: ', pop=False)
     
     def _initialized_behaviour_going_manual_prepare_call_0_exec(self, parameters):
         self.actions.pop(0)