Browse Source

Added test for SCCD execution

Yentl Van Tendeloo 8 years ago
parent
commit
176d1abbf2
3 changed files with 697 additions and 3 deletions
  1. 677 0
      integration/code/SCCD_all.mvc
  2. 5 3
      models/SCCD_execute.alc
  3. 15 0
      unit/test_all.py

+ 677 - 0
integration/code/SCCD_all.mvc

@@ -0,0 +1,677 @@
+include "primitives.alh"
+
+Diagram dynamic_trafficlight {
+    name = "Dynamic Traffic Light"
+    author = "Yentl Van Tendeloo"
+}
+
+Class manager {
+    name = "Manager"
+    default = True
+    constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "trafficlights", list_create())
+                return !
+        $
+
+    {behaviour} CompositeState manager_main {
+        name = "main"
+        isInitial = True
+        {composite_children} ParallelState manager_main_parallel {
+            name = "parallel"
+            isInitial = True
+
+            {parallel_children} CompositeState manager_main_parallel_core {
+                name = "core"
+                isInitial = True
+
+                {composite_children} BasicState manager_main_parallel_core_start {
+                    name = "start"
+                    isInitial = True
+                }
+            }
+
+            {parallel_children} CompositeState manager_main_parallel_input {
+                name = "input"
+                isInitial = True
+
+                {composite_children} BasicState manager_main_parallel_input_1 {
+                    name = "1"
+                    isInitial = True
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_2 {
+                    name = "2"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_3 {
+                    name = "3"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_4 {
+                    name = "4"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_5 {
+                    name = "5"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_6 {
+                    name = "6"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_7 {
+                    name = "7"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_8 {
+                    name = "8"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_9 {
+                    name = "9"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_10 {
+                    name = "10"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_11 {
+                    name = "11"
+                    isInitial = False
+                }
+
+                {composite_children} BasicState manager_main_parallel_input_12 {
+                    name = "12"
+                    isInitial = False
+                }
+            }
+        }
+    }
+}
+
+transition (manager_main_parallel_input_1, manager_main_parallel_input_2) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 1.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "create"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_2, manager_main_parallel_input_3) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 4.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "toggle"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_3, manager_main_parallel_input_4) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 10.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "create"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_4, manager_main_parallel_input_5) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 5.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "police_interrupt"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_5, manager_main_parallel_input_6) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 10.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "toggle"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_6, manager_main_parallel_input_7) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 100.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "toggle"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_7, manager_main_parallel_input_8) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 10.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "police_interrupt"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_8, manager_main_parallel_input_9) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 5.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "delete"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_9, manager_main_parallel_input_10) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 5.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "delete"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_input_10, manager_main_parallel_input_11) {
+    name = ""
+    after = $
+                Element function after(attributes : Element):
+                    return 5.0!
+            $
+
+    {transition_raises} Raise {
+        scope = "broad"
+        event = "exit"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    return list_create()!
+            $
+    }
+}
+
+transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
+    name = "create"
+    event = "create"
+
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "create_instance"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    Element result
+                    result = list_create()
+                    list_append(result, "trafficlights")
+                    list_append(result, "TrafficLight")
+                    list_append(result, read_root())
+                    return result!
+            $
+    }
+}
+
+transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
+    name = "created"
+    event = "instance_created"
+
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                list_append(attributes["trafficlights"], parameters[0])
+                return!
+        $
+}
+
+transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
+    name = "exit"
+    event = "exit"
+
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    Element result
+                    result = list_create()
+                    list_append(result, "0")
+                    return result!
+            $
+    }
+}
+
+transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
+    name = "delete"
+    event = "delete"
+
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameter = $
+                Element function raise(attributes : Element, parameters : Element):
+                    Element result
+                    result = list_create()
+                    list_append(result, list_pop_final(attributes["trafficlights"]))
+                    return result!
+            $
+    }
+}
+
+Class trafficlight {
+    name = "TrafficLight"
+    default = False
+    constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "counter", 0)
+                dict_add(attributes, "colour", "")
+                return!
+        $
+
+    {behaviour} CompositeState trafficlight_main {
+        name = "main"
+        isInitial = True
+        {composite_children} BasicState trafficlight_main_off {
+            name = "off"
+            isInitial = True
+        }
+
+        {composite_children} ParallelState trafficlight_main_main {
+            name = "main"
+            isInitial = False
+
+            {onExitRaise} Raise {
+                event = "displayNone"
+            }
+
+            {parallel_children} CompositeState trafficlight_main_main_trafficlight {
+                name = "trafficlight"
+                isInitial = False
+
+                {composite_children} CompositeState trafficlight_main_main_trafficlight_normal {
+                    name = "normal"
+                    isInitial = True
+
+                    onExitScript = $
+                            Void function onexit(attributes : Element):
+                                dict_overwrite(attributes, "colour", "")
+                                return!
+                        $
+
+                    {composite_children} BasicState trafficlight_main_main_trafficlight_normal_red {
+                        name = "red"
+                        isInitial = True
+
+                        onEntryScript = $
+                                Void function onentry(attributes : Element):
+                                    dict_overwrite(attributes, "counter", 60)
+                                    dict_overwrite(attributes, "colour", "red")
+                                    return!
+                            $
+
+                        {onEntryRaise} Raise {
+                            event = "displayRed"
+                        }
+                        {onEntryRaise} Raise {
+                            event = "resetTimer"
+                        }
+                    }
+
+                    {composite_children} BasicState trafficlight_main_main_trafficlight_normal_green {
+                        name = "green"
+                        isInitial = False
+
+                        onEntryScript = $
+                                Void function onentry(attributes : Element):
+                                    dict_overwrite(attributes, "counter", 55)
+                                    dict_overwrite(attributes, "colour", "green")
+                                    return!
+                            $
+
+                        {onEntryRaise} Raise {
+                            event = "displayGreen"
+                        }
+                        {onEntryRaise} Raise {
+                            event = "resetTimer"
+                        }
+                    }
+
+                    {composite_children} BasicState trafficlight_main_main_trafficlight_normal_yellow {
+                        name = "yellow"
+                        isInitial = False
+
+                        onEntryScript = $
+                                Void function onentry(attributes : Element):
+                                    dict_overwrite(attributes, "colour", "")
+                                    return!
+                            $
+
+                        {onEntryRaise} Raise {
+                            event = "displayYellow"
+                        }
+                        {onEntryRaise} Raise {
+                            event = "disableTimer"
+                        }
+                    }
+
+                    {composite_children} HistoryState trafficlight_main_main_trafficlight_normal_hist {
+                        name = "hist"
+                    }
+                }
+
+                {composite_children} CompositeState trafficlight_main_main_trafficlight_interrupted {
+                    {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_yellow {
+                        name = "yellow"
+                        isInitial = True
+
+                        {onEntryRaise} Raise {
+                            event = "displayYellow"
+                        }
+                    }
+
+                    {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_black {
+                        name = "black"
+                        isInitial = False
+
+                        {onEntryRaise} Raise {
+                            event = "displayNone"
+                        }
+                    }
+                }
+            }
+
+            {parallel_children} CompositeState trafficlight_main_main_timer {
+                name = "timer"
+                isInitial = False
+
+                {composite_children} BasicState trafficlight_main_main_timer_disabled {
+                    name = "disabled"
+                    isInitial = False
+                }
+
+                {composite_children} CompositeState trafficlight_main_main_timer_running {
+                    name = "running"
+                    isInitial = True
+
+                    {onExitRaise} Raise {
+                        event = "updateTimerValue"
+                        parameter = $
+                                Element function parameter(attributes : Element):
+                                    return -1!
+                            $
+                    }
+
+                    {composite_children} BasicState trafficlight_main_main_timer_running_decidingcolor {
+                        name = "decidingcolor"
+                        isInitial = True
+                    }
+
+                    {composite_children} BasicState trafficlight_main_main_timer_running_green {
+                        name = "green"
+                        isInitial = False
+
+                        {onEntryRaise} Raise {
+                            event = "updateTimerValue"
+                            parameter = $
+                                    Element function raise(attributes : Element):
+                                        return attributes["counter"]!
+                                $
+                        }
+                    }
+
+                    {composite_children} BasicState trafficlight_main_main_timer_running_red {
+                        name = "red"
+                        isInitial = False
+
+                        {onEntryRaise} Raise {
+                            event = "updateTimerValue"
+                            parameter = $
+                                    Element function raise(attributes : Element):
+                                        return attributes["counter"]!
+                                $
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+transition (trafficlight_main_off, trafficlight_main_main) {
+    name = "toggle"
+    event = "toggle"
+}
+
+transition (trafficlight_main_main, trafficlight_main_off) {
+    name = "toggle"
+    event = "toggle"
+}
+
+transition (trafficlight_main_main_trafficlight_normal, trafficlight_main_main_trafficlight_interrupted) {
+    name = "police_interrupt / disableTimer"
+    event = "police_interrupt"
+
+    {transition_raises} Raise {
+        event = "disableTimer"
+    }
+}
+
+transition (trafficlight_main_main_trafficlight_interrupted, trafficlight_main_main_trafficlight_normal_hist) {
+    name = "police_interrupt / enableTimer"
+    event = "police_interrupt"
+
+    {transition_raises} Raise {
+        event = "enableTimer"
+    }
+}
+
+transition (trafficlight_main_main_trafficlight_normal_red, trafficlight_main_main_trafficlight_normal_green) {
+    name = "after 60s"
+    after = $
+            Float function after(attributes : Element):
+                return 60.0!
+        $
+}
+
+transition (trafficlight_main_main_trafficlight_normal_green, trafficlight_main_main_trafficlight_normal_yellow) {
+    name = "after 55s"
+    after = $
+            Float function after(attributes : Element):
+                return 55.0!
+        $
+}
+
+transition (trafficlight_main_main_trafficlight_normal_yellow, trafficlight_main_main_trafficlight_normal_red) {
+    name = "after 5s"
+    after = $
+            Float function after(attributes : Element):
+                return 5.0!
+        $
+
+    {transition_raises} Raise {
+        event = "enableTimer"
+    }
+}
+
+transition (trafficlight_main_main_trafficlight_interrupted_yellow, trafficlight_main_main_trafficlight_interrupted_black) {
+    name = "after 500ms"
+    after = $
+            Float function after(attributes : Element):
+                return 0.5!
+        $
+}
+
+transition (trafficlight_main_main_trafficlight_interrupted_black, trafficlight_main_main_trafficlight_interrupted_yellow) {
+    name = "after 500ms"
+    after = $
+            Float function after(attributes : Element):
+                return 0.5!
+        $
+}
+
+transition (trafficlight_main_main_timer_disabled, trafficlight_main_main_timer_running) {
+    name = "enableTimer"
+    event = "enableTimer"
+}
+
+transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_disabled) {
+    name = "disableTimer"
+    event = "disableTimer"
+}
+
+transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_running) {
+    name = "resetTimer"
+    event = "resetTimer"
+}
+
+transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_green) {
+    name = "[green] / updateTimerColour"
+    cond = $
+            Boolean function cond(attributes : Element, parameters : Element):
+                return value_eq(attributes["colour"], "green")!
+        $
+
+    {transition_raises} Raise {
+        event = "updateTimerColour"
+        scope = "output"
+        parameter = $
+                Element function param(attributes : Element, parameters : Element):
+                    return "green"!
+            $
+    }
+}
+
+transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_red) {
+    name = "[red] / updateTimerColour"
+    cond = $
+            Boolean function cond(attributes : Element, parameters : Element):
+                return value_eq(attributes["colour"], "red")!
+        $
+
+    {transition_raises} Raise {
+        event = "updateTimerColour"
+        scope = "output"
+        parameter = $
+                Element function param(attributes : Element, parameters : Element):
+                    return "red"!
+            $
+    }
+}
+
+transition (trafficlight_main_main_timer_running_red, trafficlight_main_main_timer_running_red) {
+    name = "after 1s / counter -= 1"
+    after = $
+            Float function after(attributes : Element):
+                return 1.0!
+        $
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
+                return!
+        $
+
+    {transition_raises} Raise {
+        event = "updateTimer"
+        scope = "output"
+        parameter = $
+                Element function param(attributes : Element, parameters : Element):
+                    return attributes["counter"]!
+            $
+    }
+}
+
+transition (trafficlight_main_main_timer_running_green, trafficlight_main_main_timer_running_green) {
+    name = "after 1s / counter -= 1"
+    after = $
+            Float function after(attributes : Element):
+                return 1.0!
+        $
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
+                return!
+        $
+    {transition_raises} Raise {
+        event = "updateTimer"
+        scope = "output"
+        parameter = $
+                Element function param(attributes : Element, parameters : Element):
+                    return attributes["counter"]!
+            $
+    }
+}

+ 5 - 3
models/SCCD_execute.alc

@@ -336,10 +336,12 @@ Void function process_raised_event(model : Element, event : Element, parameter_a
 
 	elif (scope == "output"):
 		// Store it in the output event model
+		String evt
 		evt = instantiate_node(model, "trace/Event", "")
 		instantiate_attribute(model, evt, "timestamp", data["time_sim"])
 		instantiate_attribute(model, evt, "name", read_attribute(model, event, "event"))
-		instantiate_attribute(model, evt, "parameter", dict_to_string(parameter_action))
+		instantiate_attribute(model, evt, "parameter", cast_v2s(parameter_action))
+		log("Generated output event: " + cast_v2s(evt))
 
 	else:
 		// Same as local
@@ -795,5 +797,5 @@ Boolean function main(model : Element):
 		timeout = time_sim - time_wallclock
 		log("Pause for: " + cast_v2s(timeout))
 
-	// We should never get here!
-	return False!
+	// We have finished without error
+	return True!

+ 15 - 0
unit/test_all.py

@@ -286,6 +286,21 @@ class TestModelverse(unittest.TestCase):
         model_delete("type mappings/rendered")
         model_delete("type mappings/tracability")
 
+    def test_SCCD_basic(self):
+        model_add("test/SCCD", "formalisms/SimpleClassDiagrams", open("models/SCCD.mvc", 'r').read())
+        model_add("test/SCCD_Trace", "formalisms/SimpleClassDiagrams", open("models/SCCD_Trace.mvc", 'r').read())
+
+        model_add("test/my_SCCD", "test/SCCD", open("integration/code/SCCD_all.mvc", 'r').read())
+
+        transformation_add_AL({"SCCD": "test/SCCD"}, {"trace": "test/SCCD_Trace"}, "test/SCCD_execute_afap", open("models/SCCD_execute.alc", 'r').read().replace("afap = False", "afap = True"))
+        transformation_execute_AL("test/SCCD_execute_afap", {"SCCD": "test/my_SCCD"}, {"trace": "test/my_SCCD_trace"})
+
+        alter_context("test/my_SCCD_trace", "test/SCCD_Trace")
+        lst = element_list_nice("test/my_SCCD_trace")
+
+        # TODO check if the structure of this list is OK
+        print(lst)
+
     def test_switch_MM(self):
         model_add("test/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
         model_add("test/my_pn", "test/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())