Browse Source

Fixed bugs in AL typer

Yentl Van Tendeloo 9 years ago
parent
commit
4f88612e6c
4 changed files with 130 additions and 115 deletions
  1. 5 0
      bootstrap/conformance_scd.alc
  2. 65 59
      bootstrap/modelling.alc
  3. 59 55
      integration/test_constructors_models.py
  4. 1 1
      integration/utils.py

+ 5 - 0
bootstrap/conformance_scd.alc

@@ -76,6 +76,7 @@ String function conformance_scd(model : Element):
 
 		while (0 < list_len(keys)):
 			key = set_pop(keys)
+			log("Cardinalities " + key)
 			if (is_nominal_instance(metamodel, key, "Association")):
 				tmp_dict = create_node()
 				slc = read_attribute(metamodel, key, "source_lower_cardinality")
@@ -100,6 +101,7 @@ String function conformance_scd(model : Element):
 		while (0 < list_len(keys)):
 			model_name = set_pop(keys)
 			element = model["model"][model_name]
+			log("Check " + model_name)
 
 			if (bool_not(dict_in_node(typing, element))):
 				return "Model has no type specified: " + model_name
@@ -169,11 +171,14 @@ String function conformance_scd(model : Element):
 								return "Upper cardinality violation for incoming edge at " + model_name
 
 			Element constraint_function
+			log("Constraint")
 			constraint_function = read_attribute(model, model_name, "constraint")
 			if (element_neq(constraint_function, read_root())):
 				String result
 				// TODO define the local_constraint execution function
+				log("Exec")
 				result = execute_local_constraint(model, model_name)
+				log("Result: " + result)
 				if (result != "OK"):
 					return result
 

+ 65 - 59
bootstrap/modelling.alc

@@ -51,10 +51,14 @@ String function model_add_edge(model : Element, name : String, source : String,
 	String actual_name
 	
 	if (bool_not(dict_in(model["model"], source))):
-		log("ERROR: source of link unknown")
+		log("In link " + name)
+		log("ERROR: source of link unknown: " + source)
+		log("Destination: " + destination)
 		return ""
 	if (bool_not(dict_in(model["model"], destination))):
-		log("ERROR: destination of link unknown")
+		log("In link " + name)
+		log("ERROR: destination of link unknown: " + destination)
+		log("Source: " + source)
 		return ""
 
 	new_edge = create_edge(model["model"][source], model["model"][destination])
@@ -251,8 +255,9 @@ Void function add_AL_links(model : Element, list : Element, element : Element, l
 
 	// The name node
 	link = read_edge_dst(link)
-	dict_add(model["model"], "__" + cast_id2s(link), link)
-	dict_add(model["type_mapping"], link, model["metamodel"]["model"]["String"])
+	if (bool_not(set_in_node(model["model"], link))):
+		dict_add(model["model"], "__" + cast_id2s(link), link)
+		dict_add(model["type_mapping"], link, model["metamodel"]["model"]["String"])
 
 	// Now add the destination to the worker list
 	Element node
@@ -273,7 +278,7 @@ String function add_AL(model : Element, element : Element):
 	todo = create_node()
 	node = create_node()
 	list_append(node, element)
-	list_append(node, "Funcdef")
+	list_append(node, "funcdef")
 	set_add(todo, node)
 
 	while (0 < dict_len(todo)):
@@ -281,59 +286,60 @@ String function add_AL(model : Element, element : Element):
 		elem = list_read(work_node, 0)
 		type = list_read(work_node, 1)
 
-		// Determine the type if we don't know it
-		if (type == ""):
-			if (is_physical_action(elem)):
-				type = cast_a2s(elem)
+		if (bool_not(set_in_node(model["model"], elem))):
+			// Determine the type if we don't know it
+			if (type == ""):
+				if (is_physical_action(elem)):
+					type = cast_a2s(elem)
+				else:
+					type = "Any"
+
+			// Add the node itself
+			dict_add(model["model"], "__" + cast_id2s(elem), elem)
+			dict_add(model["type_mapping"], elem, model["metamodel"]["model"][type])
+
+			// Now add its edges
+			if (type == "if"):
+				add_AL_links(model, todo, elem, "cond", "")
+				add_AL_links(model, todo, elem, "true", "")
+				add_AL_links(model, todo, elem, "false", "")
+				add_AL_links(model, todo, elem, "next", "")
+			elif (type == "while"):
+				add_AL_links(model, todo, elem, "cond", "")
+				add_AL_links(model, todo, elem, "body", "")
+				add_AL_links(model, todo, elem, "next", "")
+			elif (type == "assign"):
+				add_AL_links(model, todo, elem, "var", "")
+				add_AL_links(model, todo, elem, "value", "")
+				add_AL_links(model, todo, elem, "next", "")
+			elif (type == "break"):
+				add_AL_links(model, todo, elem, "while", "while")
+			elif (type == "continue"):
+				add_AL_links(model, todo, elem, "while", "while")
+			elif (type == "return"):
+				add_AL_links(model, todo, elem, "value", "")
+			elif (type == "resolve"):
+				add_AL_links(model, todo, elem, "var", "")
+			elif (type == "access"):
+				add_AL_links(model, todo, elem, "var", "")
+			elif (type == "constant"):
+				add_AL_links(model, todo, elem, "node", "")
+			elif (type == "output"):
+				add_AL_links(model, todo, elem, "node", "")
+			elif (type == "global"):
+				add_AL_links(model, todo, elem, "var", "String")
+			elif (type == "param"):
+				add_AL_links(model, todo, elem, "name", "String")
+				add_AL_links(model, todo, elem, "value", "")
+				add_AL_links(model, todo, elem, "next_param", "param")
+			elif (type == "funcdef"):
+				add_AL_links(model, todo, elem, "body", "")
+			elif (type == "call"):
+				add_AL_links(model, todo, elem, "func", "")
+				add_AL_links(model, todo, elem, "params", "param")
+				add_AL_links(model, todo, elem, "last_param", "param")
 			else:
-				type = "Any"
-
-		// Add the node itself
-		dict_add(model["model"], "__" + cast_id2s(elem), elem)
-		dict_add(model["type_mapping"], elem, model["metamodel"]["model"][type])
-
-		// Now add its edges
-		if (type == "if"):
-			add_AL_links(model, todo, elem, "cond", "")
-			add_AL_links(model, todo, elem, "true", "")
-			add_AL_links(model, todo, elem, "false", "")
-			add_AL_links(model, todo, elem, "next", "")
-		elif (type == "while"):
-			add_AL_links(model, todo, elem, "cond", "")
-			add_AL_links(model, todo, elem, "body", "")
-			add_AL_links(model, todo, elem, "next", "")
-		elif (type == "assign"):
-			add_AL_links(model, todo, elem, "var", "")
-			add_AL_links(model, todo, elem, "value", "")
-			add_AL_links(model, todo, elem, "next", "")
-		elif (type == "break"):
-			add_AL_links(model, todo, elem, "while", "While")
-		elif (type == "continue"):
-			add_AL_links(model, todo, elem, "while", "While")
-		elif (type == "return"):
-			add_AL_links(model, todo, elem, "value", "")
-		elif (type == "resolve"):
-			add_AL_links(model, todo, elem, "var", "")
-		elif (type == "access"):
-			add_AL_links(model, todo, elem, "var", "")
-		elif (type == "constant"):
-			add_AL_links(model, todo, elem, "node", "")
-		elif (type == "output"):
-			add_AL_links(model, todo, elem, "node", "")
-		elif (type == "global"):
-			add_AL_links(model, todo, elem, "var", "String")
-		elif (type == "param"):
-			add_AL_links(model, todo, elem, "name", "String")
-			add_AL_links(model, todo, elem, "value", "")
-			add_AL_links(model, todo, elem, "next_param", "Param")
-		elif (type == "funcdef"):
-			add_AL_links(model, todo, elem, "body", "")
-		elif (type == "call"):
-			add_AL_links(model, todo, elem, "func", "")
-			add_AL_links(model, todo, elem, "params", "Param")
-			add_AL_links(model, todo, elem, "last_param", "Param")
-		else:
-			log("Unknown type found in AL parser: " + type)
+				log("Unknown type found in AL parser: " + type)
 
 	return reverseKeyLookup(model["model"], element)
 
@@ -345,9 +351,9 @@ Void function add_constraint(model : Element, element : String):
 	String constraint_name
 
 	constraint = construct_function()
-	attr_type = find_attribute_type(model, element, "constraint")
 	constraint_name = add_AL(model, constraint)
-	link_name = instantiate_link(model, attr_type, "", model["model"][element], constraint_name)
+	attr_type = find_attribute_type(model, element, "constraint")
+	link_name = instantiate_link(model, reverseKeyLookup(model["model"], attr_type), "", element, constraint_name)
 
 	return
 

+ 59 - 55
integration/test_constructors_models.py

@@ -65,89 +65,89 @@ action_language = [
         '"instantiate_node"', 1, '"Class"', '"Action"',
         '"instantiate_node"', 1, '"Class"', '"Statement"',
         '"instantiate_node"', 1, '"Class"', '"Expression"',
-        '"instantiate_node"', 1, '"Class"', '"Funcdef"',
-        '"instantiate_node"', 1, '"Class"', '"Param"',
-        '"instantiate_node"', 1, '"Class"', '"If"',
-        '"instantiate_node"', 1, '"Class"', '"Break"',
-        '"instantiate_node"', 1, '"Class"', '"While"',
-        '"instantiate_node"', 1, '"Class"', '"Continue"',
-        '"instantiate_node"', 1, '"Class"', '"Assign"',
-        '"instantiate_node"', 1, '"Class"', '"Return"',
-        '"instantiate_node"', 1, '"Class"', '"Output"',
-        '"instantiate_node"', 1, '"Class"', '"Declare"',
-        '"instantiate_node"', 1, '"Class"', '"Global"',
-        '"instantiate_node"', 1, '"Class"', '"Access"',
-        '"instantiate_node"', 1, '"Class"', '"Constant"',
-        '"instantiate_node"', 1, '"Class"', '"Input"',
-        '"instantiate_node"', 1, '"Class"', '"Resolve"',
-        '"instantiate_node"', 1, '"Class"', '"Call"',
+        '"instantiate_node"', 1, '"Class"', '"funcdef"',
+        '"instantiate_node"', 1, '"Class"', '"param"',
+        '"instantiate_node"', 1, '"Class"', '"if"',
+        '"instantiate_node"', 1, '"Class"', '"break"',
+        '"instantiate_node"', 1, '"Class"', '"while"',
+        '"instantiate_node"', 1, '"Class"', '"continue"',
+        '"instantiate_node"', 1, '"Class"', '"assign"',
+        '"instantiate_node"', 1, '"Class"', '"return"',
+        '"instantiate_node"', 1, '"Class"', '"output"',
+        '"instantiate_node"', 1, '"Class"', '"declare"',
+        '"instantiate_node"', 1, '"Class"', '"global"',
+        '"instantiate_node"', 1, '"Class"', '"access"',
+        '"instantiate_node"', 1, '"Class"', '"constant"',
+        '"instantiate_node"', 1, '"Class"', '"input"',
+        '"instantiate_node"', 1, '"Class"', '"resolve"',
+        '"instantiate_node"', 1, '"Class"', '"call"',
         '"instantiate_link"', 1, '"Association"', '"dict_link"', '"Action"', '"Action"',
         '"instantiate_link"', 1, '"Association"', '"to_str"', '"dict_link"', '"String"',
         '"instantiate_attribute"', 1, '"to_str"', '"name"', '"name"',
         '"instantiate_link"', 1, '"Inheritance"', '""', '"Action"', '"Any"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Funcdef"', '"Action"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Param"', '"Action"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"funcdef"', '"Action"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"param"', '"Action"',
         '"instantiate_link"', 1, '"Inheritance"', '""', '"Statement"', '"Action"',
         '"instantiate_link"', 1, '"Inheritance"', '""', '"Expression"', '"Action"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Resolve"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"If"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Break"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Continue"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Global"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"While"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Assign"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Return"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Call"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Declare"', '"Statement"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Call"', '"Expression"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Access"', '"Expression"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Constant"', '"Expression"',
-        '"instantiate_link"', 1, '"Inheritance"', '""', '"Input"', '"Expression"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"resolve"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"if"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"break"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"continue"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"global"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"while"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"assign"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"return"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"call"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"declare"', '"Statement"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"call"', '"Expression"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"access"', '"Expression"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"constant"', '"Expression"',
+        '"instantiate_link"', 1, '"Inheritance"', '""', '"input"', '"Expression"',
         '"instantiate_link"', 1, '"Association"', '"statement_next"', '"Statement"', '"Statement"',
         '"instantiate_attribute"', 1, '"statement_next"', '"name"', '"next"',
-        '"instantiate_link"', 1, '"Association"', '"if_cond"', '"If"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"if_cond"', '"if"', '"Expression"',
         '"instantiate_attribute"', 1, '"if_cond"', '"name"', '"cond"',
-        '"instantiate_link"', 1, '"Association"', '"if_true"', '"If"', '"Statement"',
+        '"instantiate_link"', 1, '"Association"', '"if_true"', '"if"', '"Statement"',
         '"instantiate_attribute"', 1, '"if_true"', '"name"', '"true"',
-        '"instantiate_link"', 1, '"Association"', '"if_false"', '"If"', '"Statement"',
+        '"instantiate_link"', 1, '"Association"', '"if_false"', '"if"', '"Statement"',
         '"instantiate_attribute"', 1, '"if_false"', '"name"', '"false"',
-        '"instantiate_link"', 1, '"Association"', '"while_cond"', '"While"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"while_cond"', '"while"', '"Expression"',
         '"instantiate_attribute"', 1, '"while_cond"', '"name"', '"cond"',
-        '"instantiate_link"', 1, '"Association"', '"while_body"', '"While"', '"Statement"',
+        '"instantiate_link"', 1, '"Association"', '"while_body"', '"while"', '"Statement"',
         '"instantiate_attribute"', 1, '"while_body"', '"name"', '"body"',
-        '"instantiate_link"', 1, '"Association"', '"assign_var"', '"Assign"', '"Any"',
+        '"instantiate_link"', 1, '"Association"', '"assign_var"', '"assign"', '"Any"',
         '"instantiate_attribute"', 1, '"assign_var"', '"name"', '"var"',
-        '"instantiate_link"', 1, '"Association"', '"assign_value"', '"Assign"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"assign_value"', '"assign"', '"Expression"',
         '"instantiate_attribute"', 1, '"assign_value"', '"name"', '"value"',
-        '"instantiate_link"', 1, '"Association"', '"break_while"', '"Break"', '"While"',
+        '"instantiate_link"', 1, '"Association"', '"break_while"', '"break"', '"while"',
         '"instantiate_attribute"', 1, '"break_while"', '"name"', '"while"',
-        '"instantiate_link"', 1, '"Association"', '"continue_while"', '"Continue"', '"While"',
+        '"instantiate_link"', 1, '"Association"', '"continue_while"', '"continue"', '"while"',
         '"instantiate_attribute"', 1, '"continue_while"', '"name"', '"while"',
-        '"instantiate_link"', 1, '"Association"', '"return_value"', '"Return"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"return_value"', '"return"', '"Expression"',
         '"instantiate_attribute"', 1, '"return_value"', '"name"', '"value"',
-        '"instantiate_link"', 1, '"Association"', '"resolve_var"', '"Resolve"', '"Any"',
+        '"instantiate_link"', 1, '"Association"', '"resolve_var"', '"resolve"', '"Any"',
         '"instantiate_attribute"', 1, '"resolve_var"', '"name"', '"var"',
-        '"instantiate_link"', 1, '"Association"', '"access_var"', '"Access"', '"Any"',
+        '"instantiate_link"', 1, '"Association"', '"access_var"', '"access"', '"Any"',
         '"instantiate_attribute"', 1, '"access_var"', '"name"', '"var"',
-        '"instantiate_link"', 1, '"Association"', '"constant_node"', '"Constant"', '"Any"',
+        '"instantiate_link"', 1, '"Association"', '"constant_node"', '"constant"', '"Any"',
         '"instantiate_attribute"', 1, '"constant_node"', '"name"', '"node"',
-        '"instantiate_link"', 1, '"Association"', '"output_node"', '"Output"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"output_node"', '"output"', '"Expression"',
         '"instantiate_attribute"', 1, '"output_node"', '"name"', '"node"',
-        '"instantiate_link"', 1, '"Association"', '"global_var"', '"Global"', '"String"',
+        '"instantiate_link"', 1, '"Association"', '"global_var"', '"global"', '"String"',
         '"instantiate_attribute"', 1, '"global_var"', '"name"', '"var"',
-        '"instantiate_link"', 1, '"Association"', '"param_name"', '"Param"', '"String"',
+        '"instantiate_link"', 1, '"Association"', '"param_name"', '"param"', '"String"',
         '"instantiate_attribute"', 1, '"param_name"', '"name"', '"name"',
-        '"instantiate_link"', 1, '"Association"', '"param_value"', '"Param"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"param_value"', '"param"', '"Expression"',
         '"instantiate_attribute"', 1, '"param_value"', '"name"', '"value"',
-        '"instantiate_link"', 1, '"Association"', '"param_next_param"', '"Param"', '"Param"',
+        '"instantiate_link"', 1, '"Association"', '"param_next_param"', '"param"', '"param"',
         '"instantiate_attribute"', 1, '"param_next_param"', '"name"', '"next_param"',
-        '"instantiate_link"', 1, '"Association"', '"funcdef_body"', '"Funcdef"', '"Statement"',
+        '"instantiate_link"', 1, '"Association"', '"funcdef_body"', '"funcdef"', '"Statement"',
         '"instantiate_attribute"', 1, '"funcdef_body"', '"name"', '"body"',
-        '"instantiate_link"', 1, '"Association"', '"call_func"', '"Call"', '"Expression"',
+        '"instantiate_link"', 1, '"Association"', '"call_func"', '"call"', '"Expression"',
         '"instantiate_attribute"', 1, '"call_func"', '"name"', '"func"',
-        '"instantiate_link"', 1, '"Association"', '"call_params"', '"Call"', '"Param"',
+        '"instantiate_link"', 1, '"Association"', '"call_params"', '"call"', '"param"',
         '"instantiate_attribute"', 1, '"call_params"', '"name"', '"params"',
-        '"instantiate_link"', 1, '"Association"', '"call_last_param"', '"Call"', '"Param"',
+        '"instantiate_link"', 1, '"Association"', '"call_last_param"', '"call"', '"param"',
         '"instantiate_attribute"', 1, '"call_last_param"', '"name"', '"last_param"',
         '"exit"',
     ]
@@ -166,7 +166,7 @@ bottom_attributes = [
         '"instantiate_attribute"', 1, '"tlc"', '"name"', '"target_lower_cardinality"',
         '"instantiate_link"', 1, '"Association"', '"tuc"', '"Association"', '"Integer"',
         '"instantiate_attribute"', 1, '"tuc"', '"name"', '"target_upper_cardinality"',
-        '"instantiate_link"', 1, '"Association"', '"constraint"', '"Any"', '"Funcdef"',
+        '"instantiate_link"', 1, '"Association"', '"constraint"', '"Any"', '"funcdef"',
         '"instantiate_attribute"', 1, '"constraint"', '"name"', '"constraint"',
         '"exit"',
     ]
@@ -310,6 +310,10 @@ class TestConstructorsModels(unittest.TestCase):
         commands = bottom + retype + action_language + bottom_attributes + conformance_check(1) + ['"return"', 'false']
         self.assertTrue(run_barebone(commands, ["OK"], 1))
 
+    def test_constructors_constraints(self):
+        commands = bottom + retype + action_language + bottom_attributes + add_constraints + conformance_check(1) + ['"return"', 'false']
+        self.assertTrue(run_barebone(commands, ["OK"], 1))
+
     def test_constructors_instantiate_scd(self):
         commands = bottom + retype + bottom_attributes + instantiate_scd + conformance_check(2) + ['"return"', 'false']
         self.assertTrue(run_barebone(commands, ["OK"], 1))

+ 1 - 1
integration/utils.py

@@ -274,7 +274,7 @@ def run_barebone(parameters, expected, interface="0", timeout=False, wait=False,
                         # Modelverse has already terminated, which isn't a good sign!
                         return False
 
-                    val = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": username})), timeout=30).read()
+                    val = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": username})), timeout=120).read()
                 except:
                     if timeout:
                         return True