Browse Source

Fix error in bottom formalism and add test for it

Yentl Van Tendeloo 8 years ago
parent
commit
3c13fe62ba
4 changed files with 63 additions and 15 deletions
  1. 2 2
      bootstrap/bottom.mvc
  2. 6 0
      bootstrap/conformance_finding.alc
  3. 23 13
      bootstrap/core_algorithm.alc
  4. 32 0
      integration/test_mvc.py

+ 2 - 2
bootstrap/bottom.mvc

@@ -1,8 +1,8 @@
 import models/SimpleClassDiagrams as SCD
 
-SCD bottom{
+SCD Bottom{
     Class Node {}
     Association Edge : Node (Node, Node) {}
 }
 
-export bottom to models/bottom
+export Bottom to models/Bottom

+ 6 - 0
bootstrap/conformance_finding.alc

@@ -50,22 +50,28 @@ Boolean function find_type_mapping(model : Element):
 		edge_element = read_root()
 
 		elems = dict_keys(model["metamodel"]["model"])
+		log("Elements in metamodel: " + set_to_string(elems))
 		while (set_len(elems) > 0):
 			elem = set_pop(elems)
+			log("Check " + elem)
 
 			if (bool_not(is_edge(model["metamodel"]["model"][elem]))):
 				if (element_neq(node_element, read_root())):
+					log("Multiple nodes detected!")
 					return False!
 				node_element = elem
 			else:
 				// Is an edge, but might be the inheritance link...
+				log("type: " + read_type(model["metamodel"], elem))
 				if (read_type(model["metamodel"], elem) != "Inheritance"):
 					// Is not the inheritance link
 					if (element_neq(edge_element, read_root())):
+						log("Multiple edges detected")
 						return False!
 					edge_element = elem
 
 		if (bool_or(element_eq(node_element, read_root()), element_eq(edge_element, read_root()))):
+			log("Not both node and edge detected")
 			return False!
 
 		// Now we have bot an edge_element and node_element of the metamodel

+ 23 - 13
bootstrap/core_algorithm.alc

@@ -357,9 +357,7 @@ String function create_folders(user_id : String, folder_name : String):
 
 String function store_entry(model_id : String, full_name : String, user_id : String):
 	String prev
-	log("Creating folders for " + full_name)
 	prev = create_folders(user_id, get_foldername(full_name))
-	log("Created folders up to: " + cast_v2s(read_attribute(core, prev, "name")))
 	instantiate_link(core, "contains", "", prev, model_id)
 	return full_name!
 
@@ -1122,12 +1120,18 @@ String function cmd_verify(user_id : String, model_name : String, metamodel_name
 	model_id = get_entry_id(model_name)
 	if (model_id != ""):
 		if (allow_read(user_id, model_id)):
-			Element m
-			m = get_full_model(get_entry_id(model_name), get_entry_id(metamodel_name))
-			if (element_eq(m, read_root())):
-				return "No conformance relation can be found between these models"!
-
-			return string_join("Success: ", conformance_scd(m))!
+			if (get_entry_id(metamodel_name) != ""):
+				if (allow_read(user_id, get_entry_id(metamodel_name))):
+					Element m
+					m = get_full_model(get_entry_id(model_name), get_entry_id(metamodel_name))
+					if (element_eq(m, read_root())):
+						return "No conformance relation can be found between these models"!
+
+					return string_join("Success: ", conformance_scd(m))!
+				else:
+					return "Permission denied to model: " + metamodel_name!
+			else:
+				return "Model not found: " + metamodel_name!
 		else:
 			return "Permission denied to model: " + model_name!
 	else:
@@ -1846,11 +1850,17 @@ String function cmd_transformation_signature(user_id : String, transformation_na
 String function cmd_element_list_nice(user_id : String, model_name : String, metamodel_name : String):
 	if (get_entry_id(model_name) != ""):
 		if (allow_read(user_id, get_entry_id(model_name))):
-			Element mm
-			mm = get_full_model(get_entry_id(model_name), get_entry_id(metamodel_name))
-			if (element_eq(mm, read_root())):
-				return "No conformance relation between these models"!
-			return "Success: " + JSON_print(mm)!
+			if (get_entry_id(metamodel_name) != ""):
+				if (allow_read(user_id, get_entry_id(metamodel_name))):
+					Element mm
+					mm = get_full_model(get_entry_id(model_name), get_entry_id(metamodel_name))
+					if (element_eq(mm, read_root())):
+						return "No conformance relation between these models"!
+					return "Success: " + JSON_print(mm)!
+				else:
+					return "Permission denied to model: " + metamodel_name!
+			else:
+				return "No such metamodel: " + metamodel_name!
 		else:
 			return "Permission denied to model: " + model_name!
 	else:

+ 32 - 0
integration/test_mvc.py

@@ -379,3 +379,35 @@ class TestModelverseCore(unittest.TestCase):
         transformation_add_MT({"abstract": "formalisms/CausalBlockDiagrams", "rendered": "formalisms/MM_rendered_graphical"}, {"abstract": "formalisms/CausalBlockDiagrams", "rendered": "formalisms/MM_rendered_graphical"}, "models/render_graphical_CBD", open("models/CBD_mapper.mvc", 'r').read(), add_tracability)
         result = model_render("models/my_CBD", "models/render_graphical_CBD")
         assert len(result) == 23
+
+    def test_switch_MM(self):
+        model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
+        model_add("models/my_pn", "formalisms/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
+
+        alter_context("formalisms/PetriNet", "formalisms/SimpleClassDiagrams")
+        alter_context("models/my_pn", "formalisms/PetriNet")
+        print(element_list_nice("formalisms/PetriNet"))
+        print(element_list_nice("models/my_pn"))
+
+        alter_context("formalisms/PetriNet", "formalisms/Bottom")
+        alter_context("models/my_pn", "formalisms/Bottom")
+        print(element_list_nice("formalisms/PetriNet"))
+        print(element_list_nice("models/my_pn"))
+
+        alter_context("formalisms/PetriNet", "formalisms/SimpleClassDiagrams")
+        alter_context("models/my_pn", "formalisms/PetriNet")
+        print(element_list_nice("formalisms/PetriNet"))
+        print(element_list_nice("models/my_pn"))
+
+        alter_context("formalisms/PetriNet", "formalisms/PetriNet")
+        alter_context("models/my_pn", "formalisms/SimpleClassDiagrams")
+        try:
+            print(element_list_nice("formalisms/PetriNet"))
+            self.fail()
+        except:
+            pass
+        try:
+            print(element_list_nice("models/my_pn"))
+            self.fail()
+        except:
+            pass