import unittest

from utils import *

model_list = set(["  SimpleClassDiagrams : SimpleClassDiagrams",
                  "  CoreFormalism : SimpleClassDiagrams",
                  "  ManualOperation : SimpleClassDiagrams",
                  "  ActionLanguage : SimpleClassDiagrams",
                  "  ProcessModel : SimpleClassDiagrams",
                  "  core : CoreFormalism"])

model_full_list = set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                       "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                       "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                       "  221  root admin   ManualOperation : SimpleClassDiagrams",
                       "  221  root admin   ProcessModel : SimpleClassDiagrams",
                       "  200  root admin   core : CoreFormalism"])

all_files = [   "core/mini_modify.alc",
                "core/core_formalism.mvc",
                "core/core_algorithm.alc",
                "core/pm.mvc",
                "primitives.alc",
                "object_operations.alc",
                "conformance_scd.alc",
                "library.alc",
                "transform.alc",
                "model_management.alc",
                "ramify.alc",
                "metamodels.alc",
                "random.alc",
                "constructors.alc",
                "modelling.alc",
                "compilation_manager.alc",
            ]

class TestModelverseCore(unittest.TestCase):
    def test_list(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_list",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                model_list,
            ]))

    def test_list_full(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                model_full_list,
            ]))

    def test_model_add_empty(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "Empty",
                "exit",
                "model_list",
                "model_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_list | 
                set(["  Empty : SimpleClassDiagrams",]),
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   Empty : SimpleClassDiagrams",]),
            ]))

    def test_model_empty_modify(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "Empty",
                "exit",
                "model_list",
                "model_list_full",
                "model_modify",
                "Empty",
                "instantiate",
                "Class",
                "A",
                "exit",
                "model_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_list |
                set(["  Empty : SimpleClassDiagrams",]),
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   Empty : SimpleClassDiagrams",]),
                "Ready for command...",
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                "Type to instantiate?",
                "Name of new element?",
                "Instantiation successful!",
                "Please give your command.",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   Empty : SimpleClassDiagrams",]),
                "Ready for command...",
            ]))

    def test_model_overwrite(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "Empty",
                "exit",
                "model_list_full",
                "model_modify",
                "Empty",
                "instantiate",
                "Class",
                "A",
                "exit",
                "model_list_full",
                "model_overwrite",
                "Empty",
                "instantiate_node",
                "",
                "Class",
                "B",
                "instantiate_node",
                "",
                "Class",
                "C",
                "exit",
                "model_list_full",
                "model_modify",
                "Empty",
                "list",
                "exit",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   Empty : SimpleClassDiagrams",]),
                "Ready for command...",
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                "Type to instantiate?",
                "Name of new element?",
                "Instantiation successful!",
                "Please give your command.",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   Empty : SimpleClassDiagrams",]),
                "Ready for command...",
                "Which model to overwrite?",
                "Waiting for model constructors...",
                "Model overwrite success!",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   Empty : SimpleClassDiagrams",]),
                "Ready for command...",
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                "List of all elements:",
                set(["  B : Class",
                     "  C : Class"]),
                "Please give your command.",
                "Ready for command...",
            ]))

    def test_transform_add_MT_language(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "PetriNets",
                ] + get_model_constructor(open("integration/code/petrinets.mvc", "r").read()) + [
                "model_list_full",
                "transformation_add_MT_language",
                "PetriNets",
                "",
                "PetriNets_RAM",
                "model_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",]),
                "Ready for command...",
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",
                     "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",]),
                "Ready for command...",
            ]))

    def test_transform_add_MT_instance(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "PetriNets",
                ] + get_model_constructor(open("integration/code/petrinets.mvc", "r").read()) + [
                "model_list_full",
                "transformation_add_MT_language",
                "PetriNets",
                "",
                "PetriNets_RAM",
                "model_list_full",
                "transformation_add_MT",
                "PetriNets_RAM",
                "PetriNets",
                "",
                "",
                "PetriNets_Print",
                "exit",
                "model_list_full",
                "transformation_list",
                "transformation_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",]),
                "Ready for command...",
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",
                     "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",]),
                "Ready for command...",
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",
                     "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   PetriNets_Print : PetriNets_RAM",]),
                "Ready for command...",
                set(["[ModelTransformation] PetriNets_Print : PetriNets_RAM",
                    ]),
                "Ready for command...",
                set(["  200  root nobody   [ModelTransformation] PetriNets_Print : PetriNets_RAM"
                    ]),
                "Ready for command...",
            ]))

    def test_transform_add_MT_pn_print_upload(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "PetriNets",
                ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
                "model_list_full",
                "transformation_add_MT_language",
                "PetriNets",
                "",
                "PetriNets_RAM",
                "model_list_full",
                "transformation_add_MT",
                "PetriNets_RAM",
                "PetriNets",
                "",
                "",
                "PetriNets_Print",
                ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
                "transformation_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",]),
                "Ready for command...",
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",
                     "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",]),
                "Ready for command...",
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                set(["  200  root nobody   [ModelTransformation] PetriNets_Print : PetriNets_RAM"
                    ]),
                "Ready for command...",
            ]))

    def test_transform_add_MT_pn_print_exec(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                "SimpleClassDiagrams",
                "PetriNets",
                ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
                "model_add",
                "PetriNets",
                "my_pn",
                ] + get_model_constructor(open("integration/code/pn_runtime_model.mvc", "r").read()) + [
                "model_list_full",
                "transformation_add_MT_language",
                "PetriNets",
                "",
                "PetriNets_RAM",
                "model_list_full",
                "transformation_add_MT",
                "PetriNets_RAM",
                "PetriNets",
                "",
                "",
                "PetriNets_Print",
                ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
                "transformation_list_full",
                "transformation_execute",
                "PetriNets_Print",
                "my_pn",
                "transformation_list_full",
            ],
            [   "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",
                     "  200  root nobody   my_pn : PetriNets",]),
                "Ready for command...",
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                model_full_list |
                set(["  200  root nobody   PetriNets : SimpleClassDiagrams",
                     "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",
                     "  200  root nobody   my_pn : PetriNets",]),
                "Ready for command...",
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                set(["  200  root nobody   [ModelTransformation] PetriNets_Print : PetriNets_RAM"
                    ]),
                "Ready for command...",
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 1',
                     '"p2" --> 2',
                     '"p3" --> 3',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
            ]))

    def test_transform_add_MT_pn_simulate(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets",
                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets_Runtime",
                    ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
                "model_add",
                    "PetriNets",
                    "my_pn",
                    ] + get_model_constructor(open("integration/code/pn_design_model.mvc", "r").read()) + [
                "model_list",
                "transformation_add_MT_language",
                    "PetriNets_Runtime",
                    "PetriNets",
                    "",
                    "PetriNets_RAM",
                "model_list",
                "model_modify",
                    "__merged_PetriNets_RAM",
                        "instantiate",
                            "Association",
                            "D2R_PlaceLink",
                            "PetriNets/Place",
                            "PetriNets_Runtime/Place",
                        "instantiate",
                            "Association",
                            "D2R_TransitionLink",
                            "PetriNets/Transition",
                            "PetriNets_Runtime/Transition",
                        "instantiate",
                            "Association",
                            "R2D_PlaceLink",
                            "PetriNets_Runtime/Place",
                            "PetriNets/Place",
                        "instantiate",
                            "Association",
                            "R2D_TransitionLink",
                            "PetriNets_Runtime/Transition",
                            "PetriNets/Transition",
                        "exit",
                "transformation_RAMify",
                    "__merged_PetriNets_RAM",
                    "PetriNets_RAM",
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_design_to_runtime",
                    ] + get_model_constructor(open("integration/code/pn_design_to_runtime.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets",
                    "",
                    "pn_runtime_to_design",
                    ] + get_model_constructor(open("integration/code/pn_runtime_to_design.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_step",
                    ] + get_model_constructor(open("integration/code/pn_simulate.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "",
                    "pn_print",
                    ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
                "model_list",
                "transformation_list",
                "transformation_execute",
                "pn_print",
                "my_pn",
                "transformation_execute",
                "pn_design_to_runtime",
                "my_pn",
                "my_pn_runtime",
                "transformation_execute",
                "pn_step",
                "my_pn_runtime",
                "my_pn_runtime",
                "transformation_execute",
                "pn_runtime_to_design",
                "my_pn_runtime",
                "my_pn",
                "transformation_execute",
                "pn_print",
                "my_pn",
            ],
            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # model_modify
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                # instantiate 1
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 2
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 3
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 4
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                "Ready for command...",
                # transformation_RAMify
                "Which metamodel do you want to RAMify?",
                "Where do you want to store the RAMified metamodel?",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  pn_print : PetriNets_RAM",
                     "  pn_design_to_runtime : PetriNets_RAM",
                     "  pn_runtime_to_design : PetriNets_RAM",
                     "  pn_step : PetriNets_RAM",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_list
                set(["[ModelTransformation] pn_print : PetriNets_RAM",
                     "[ModelTransformation] pn_design_to_runtime : PetriNets_RAM",
                     "[ModelTransformation] pn_runtime_to_design : PetriNets_RAM",
                     "[ModelTransformation] pn_step : PetriNets_RAM"]),
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 1',
                     '"p2" --> 2',
                     '"p3" --> 3',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_design_to_runtime)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                "Which model to create for target element PetriNets_Runtime",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_step)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets_Runtime",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_runtime_to_design)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 0',
                     '"p2" --> 1',
                     '"p3" --> 5',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
            ]))

    @slow
    def test_transform_add_MT_pn_simulate_larger(self):
        def step_and_print():
            return [ \
                # transformation_execute (pn_step)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets_Runtime",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_runtime_to_design)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                None,
                None,
                None,
                "Transformation executed with result: True",
                "Ready for command...",
                ]

        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets",
                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets_Runtime",
                    ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
                "model_add",
                    "PetriNets",
                    "my_pn",
                    ] + get_model_constructor(open("integration/code/pn_design_model_larger.mvc", "r").read()) + [
                "model_list",
                "transformation_add_MT_language",
                    "PetriNets_Runtime",
                    "PetriNets",
                    "",
                    "PetriNets_RAM",
                "model_list",
                "model_modify",
                    "__merged_PetriNets_RAM",
                        "instantiate",
                            "Association",
                            "D2R_PlaceLink",
                            "PetriNets/Place",
                            "PetriNets_Runtime/Place",
                        "instantiate",
                            "Association",
                            "D2R_TransitionLink",
                            "PetriNets/Transition",
                            "PetriNets_Runtime/Transition",
                        "instantiate",
                            "Association",
                            "R2D_PlaceLink",
                            "PetriNets_Runtime/Place",
                            "PetriNets/Place",
                        "instantiate",
                            "Association",
                            "R2D_TransitionLink",
                            "PetriNets_Runtime/Transition",
                            "PetriNets/Transition",
                        "exit",
                "transformation_RAMify",
                    "__merged_PetriNets_RAM",
                    "PetriNets_RAM",
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_design_to_runtime",
                    ] + get_model_constructor(open("integration/code/pn_design_to_runtime.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets",
                    "",
                    "pn_runtime_to_design",
                    ] + get_model_constructor(open("integration/code/pn_runtime_to_design.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_step",
                    ] + get_model_constructor(open("integration/code/pn_simulate.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "",
                    "pn_print",
                    ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
                "model_list",
                "transformation_list",
                "transformation_execute",
                "pn_print",
                "my_pn",
                "transformation_execute",
                "pn_design_to_runtime",
                "my_pn",
                "my_pn_runtime", ] + [
                    "transformation_execute",
                    "pn_step",
                    "my_pn_runtime",
                    "my_pn_runtime",
                    "transformation_execute",
                    "pn_runtime_to_design",
                    "my_pn_runtime",
                    "my_pn",
                    "transformation_execute",
                    "pn_print",
                    "my_pn",
                    ] * 10 + [
            ],
            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # model_modify
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                # instantiate 1
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 2
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 3
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 4
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                "Ready for command...",
                # transformation_RAMify
                "Which metamodel do you want to RAMify?",
                "Where do you want to store the RAMified metamodel?",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  pn_print : PetriNets_RAM",
                     "  pn_design_to_runtime : PetriNets_RAM",
                     "  pn_runtime_to_design : PetriNets_RAM",
                     "  pn_step : PetriNets_RAM",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_list
                set(["[ModelTransformation] pn_print : PetriNets_RAM",
                     "[ModelTransformation] pn_design_to_runtime : PetriNets_RAM",
                     "[ModelTransformation] pn_runtime_to_design : PetriNets_RAM",
                     "[ModelTransformation] pn_step : PetriNets_RAM"]),
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"lock_available" --> 1',
                     '"critical_section_1" --> 0',
                     '"critical_section_2" --> 0',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_design_to_runtime)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                "Which model to create for target element PetriNets_Runtime",
                "Transformation executed with result: True",
                "Ready for command...",
                ] + \
                    step_and_print() * 10 +
                []))

    def test_transform_add_AL_pn_simulate(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets",
                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets_Runtime",
                    ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
                "model_add",
                    "PetriNets",
                    "my_pn",
                    ] + get_model_constructor(open("integration/code/pn_design_model.mvc", "r").read()) + [
                "model_list",
                "transformation_add_MT_language",
                    "PetriNets_Runtime",
                    "PetriNets",
                    "",
                    "PetriNets_RAM",
                "model_list",
                "model_modify",
                    "__merged_PetriNets_RAM",
                        "instantiate",
                            "Association",
                            "D2R_PlaceLink",
                            "PetriNets/Place",
                            "PetriNets_Runtime/Place",
                        "instantiate",
                            "Association",
                            "D2R_TransitionLink",
                            "PetriNets/Transition",
                            "PetriNets_Runtime/Transition",
                        "instantiate",
                            "Association",
                            "R2D_PlaceLink",
                            "PetriNets_Runtime/Place",
                            "PetriNets/Place",
                        "instantiate",
                            "Association",
                            "R2D_TransitionLink",
                            "PetriNets_Runtime/Transition",
                            "PetriNets/Transition",
                        "exit",
                "transformation_RAMify",
                    "__merged_PetriNets_RAM",
                    "PetriNets_RAM",
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_design_to_runtime",
                    ] + get_model_constructor(open("integration/code/pn_design_to_runtime.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets",
                    "",
                    "pn_runtime_to_design",
                    ] + get_model_constructor(open("integration/code/pn_runtime_to_design.mvc", "r").read()) + [
                "transformation_add_AL",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_step",
                    ] + get_constructor(open("integration/code/pn_simulate.alc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "",
                    "pn_print",
                    ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
                "model_list",
                "transformation_list",
                "transformation_execute",
                "pn_print",
                "my_pn",
                "transformation_execute",
                "pn_design_to_runtime",
                "my_pn",
                "my_pn_runtime",
                "transformation_execute",
                "pn_step",
                "my_pn_runtime",
                "my_pn_runtime",
                "transformation_execute",
                "pn_runtime_to_design",
                "my_pn_runtime",
                "my_pn",
                "transformation_execute",
                "pn_print",
                "my_pn",
            ],
            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set(["  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets_Runtime : SimpleClassDiagrams",
                     "  PetriNets : SimpleClassDiagrams",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  my_pn : PetriNets",]),
                "Ready for command...",
                # model_modify
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                # instantiate 1
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 2
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 3
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 4
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                "Ready for command...",
                # transformation_RAMify
                "Which metamodel do you want to RAMify?",
                "Where do you want to store the RAMified metamodel?",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_AL
                "Which metamodels do you want to use as source for the action code (empty string to finish)?",
                "Model added as source",
                "Which metamodels do you want to use as target for the action code (empty string to finish)?",
                "Model added as target",
                "Name of Action Language model?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets_Runtime : SimpleClassDiagrams",
                     "  PetriNets : SimpleClassDiagrams",
                     "  pn_print : PetriNets_RAM",
                     "  pn_design_to_runtime : PetriNets_RAM",
                     "  pn_runtime_to_design : PetriNets_RAM",
                     "  pn_step : ActionLanguage",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  my_pn : PetriNets",]),
                "Ready for command...",
                # transformation_list
                set(["[ModelTransformation] pn_print : PetriNets_RAM",
                     "[ModelTransformation] pn_design_to_runtime : PetriNets_RAM",
                     "[ModelTransformation] pn_runtime_to_design : PetriNets_RAM",
                     "[ActionLanguage] pn_step : ActionLanguage"]),
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 1',
                     '"p2" --> 2',
                     '"p3" --> 3',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_design_to_runtime)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                "Which model to create for target element PetriNets_Runtime",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_step)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets_Runtime",
                "Ready for command...",
                # transformation_execute (pn_runtime_to_design)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 0',
                     '"p2" --> 1',
                     '"p3" --> 5',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
            ]))

    def test_transform_add_MANUAL_pn_simulate(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets",
                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNets_Runtime",
                    ] + get_model_constructor(open("integration/code/pn_runtime.mvc", "r").read()) + [
                "model_add",
                    "PetriNets",
                    "my_pn",
                    ] + get_model_constructor(open("integration/code/pn_design_model.mvc", "r").read()) + [
                "model_list",
                "transformation_add_MT_language",
                    "PetriNets_Runtime",
                    "PetriNets",
                    "",
                    "PetriNets_RAM",
                "model_list",
                "model_modify",
                    "__merged_PetriNets_RAM",
                        "instantiate",
                            "Association",
                            "D2R_PlaceLink",
                            "PetriNets/Place",
                            "PetriNets_Runtime/Place",
                        "instantiate",
                            "Association",
                            "D2R_TransitionLink",
                            "PetriNets/Transition",
                            "PetriNets_Runtime/Transition",
                        "instantiate",
                            "Association",
                            "R2D_PlaceLink",
                            "PetriNets_Runtime/Place",
                            "PetriNets/Place",
                        "instantiate",
                            "Association",
                            "R2D_TransitionLink",
                            "PetriNets_Runtime/Transition",
                            "PetriNets/Transition",
                        "exit",
                "transformation_RAMify",
                    "__merged_PetriNets_RAM",
                    "PetriNets_RAM",
                "transformation_add_MANUAL",
                    "PetriNets",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_design_to_runtime",
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets",
                    "",
                    "pn_runtime_to_design",
                    ] + get_model_constructor(open("integration/code/pn_runtime_to_design.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets_Runtime",
                    "",
                    "PetriNets_Runtime",
                    "",
                    "pn_step",
                    ] + get_model_constructor(open("integration/code/pn_simulate.mvc", "r").read()) + [
                "transformation_add_MT",
                    "PetriNets_RAM",
                    "PetriNets",
                    "",
                    "",
                    "pn_print",
                    ] + get_model_constructor(open("integration/code/pn_print.mvc", "r").read()) + [
                "model_list",
                "transformation_list",
                "transformation_execute",
                "pn_print",
                "my_pn",
                "transformation_execute",
                "pn_design_to_runtime",
                "my_pn",
                "my_pn_runtime",
                "instantiate", "PetriNets_Runtime/Place", "p1",
                "attr_add", "p1", "tokens", 1,
                "attr_add", "p1", "name", "p1",
                "instantiate", "PetriNets_Runtime/Place", "p2",
                "attr_add", "p2", "tokens", 2,
                "attr_add", "p2", "name", "p2",
                "instantiate", "PetriNets_Runtime/Place", "p3",
                "attr_add", "p3", "tokens", 3,
                "attr_add", "p3", "name", "p3",
                "instantiate", "PetriNets_Runtime/Transition", "t1",
                "attr_add", "t1", "name", "t1",
                "instantiate", "PetriNets_Runtime/P2T", "p2t1", "p1", "t1",
                "attr_add", "p2t1", "weight", 1,
                "instantiate", "PetriNets_Runtime/P2T", "p2t2", "p2", "t1",
                "attr_add", "p2t2", "weight", 1,
                "instantiate", "PetriNets_Runtime/T2P", "t2p", "t1", "p3",
                "attr_add", "t2p", "weight", 2,
                "exit",
                "transformation_execute",
                "pn_step",
                "my_pn_runtime",
                "my_pn_runtime",
                "transformation_execute",
                "pn_runtime_to_design",
                "my_pn_runtime",
                "my_pn",
                "transformation_execute",
                "pn_print",
                "my_pn",
            ],

            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets : SimpleClassDiagrams",
                     "  my_pn : PetriNets",
                     "  PetriNets_Runtime : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets_Runtime : SimpleClassDiagrams",
                     "  PetriNets : SimpleClassDiagrams",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  my_pn : PetriNets",]),
                "Ready for command...",
                # model_modify
                "Which model do you want to modify?",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                # instantiate 1
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 2
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 3
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                # instantiate 4
                "Type to instantiate?",
                "Name of new element?",
                "Source name?",
                "Destination name?",
                "Instantiation successful!",
                "Please give your command.",
                "Ready for command...",
                # transformation_RAMify
                "Which metamodel do you want to RAMify?",
                "Where do you want to store the RAMified metamodel?",
                "Ready for command...",
                # transformation_add_MANUAL
                "Which metamodels do you want to use as source for the manual operation (empty string to finish)?",
                "Model added as source",
                "Which metamodels do you want to use as target for the manual operation (empty string to finish)?",
                "Model added as target",
                "Name of Manual operation model?",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNets",
                     "  PetriNets_Runtime",
                    ]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNets_Runtime : SimpleClassDiagrams",
                     "  PetriNets : SimpleClassDiagrams",
                     "  pn_print : PetriNets_RAM",
                     "  pn_design_to_runtime : ManualOperation",
                     "  pn_runtime_to_design : PetriNets_RAM",
                     "  pn_step : PetriNets_RAM",
                     "  __merged_pn_design_to_runtime : SimpleClassDiagrams",
                     "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                     "  PetriNets_RAM : SimpleClassDiagrams",
                     "  my_pn : PetriNets",]),
                "Ready for command...",
                # transformation_list
                set(["[ModelTransformation] pn_print : PetriNets_RAM",
                     "[ManualOperation] pn_design_to_runtime : ManualOperation",
                     "[ModelTransformation] pn_runtime_to_design : PetriNets_RAM",
                     "[ModelTransformation] pn_step : PetriNets_RAM"]),
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 1',
                     '"p2" --> 2',
                     '"p3" --> 3',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_design_to_runtime)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                "Which model to create for target element PetriNets_Runtime",
                "Model loaded, ready for commands!",
                "Use 'help' command for a list of possible commands",
                "Please give your command.",
                # instantiate p1
                    "Type to instantiate?",
                    "Name of new element?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                # instantiate p2
                    "Type to instantiate?",
                    "Name of new element?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                # instantiate p3
                    "Type to instantiate?",
                    "Name of new element?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                # instantiate t1
                    "Type to instantiate?",
                    "Name of new element?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                # instantiate p2t1
                    "Type to instantiate?",
                    "Name of new element?",
                    "Source name?",
                    "Destination name?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                # instantiate p2t2
                    "Type to instantiate?",
                    "Name of new element?",
                    "Source name?",
                    "Destination name?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                # instantiate t2p1
                    "Type to instantiate?",
                    "Name of new element?",
                    "Source name?",
                    "Destination name?",
                    "Instantiation successful!",
                    "Please give your command.",
                    "Which model do you want to assign an attribute to?",
                    "Which attribute do you wish to assign?",
                    "Value of attribute?",
                    "Added attribute!",
                    "Please give your command.",
                "Ready for command...",
                # transformation_execute (pn_step)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets_Runtime",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_runtime_to_design)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets_Runtime",
                "Which model to create for target element PetriNets",
                "Transformation executed with result: True",
                "Ready for command...",
                # transformation_execute (pn_print)
                "Which transformation do you want to execute?",
                "Which model to bind for source element PetriNets",
                set(['"p1" --> 0',
                     '"p2" --> 1',
                     '"p3" --> 5',
                    ]),
                "Transformation executed with result: True",
                "Ready for command...",
            ]))
    """
    def test_powerwindow(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "Control_PW",
                    ] + get_model_constructor(open("models/control_PW.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "Environment_PW",
                    ] + get_model_constructor(open("models/environment_PW.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "Description_PW",
                    ] + get_model_constructor(open("models/description_PW.mvc", "r").read()) + [
                "model_add",
                    "Control_PW",
                    "control_model",
                    ] + get_model_constructor(open("models/control_model.mvc", "r").read()) + [
                "model_add",
                    "Environment_PW",
                    "environment_model",
                    ] + get_model_constructor(open("models/environment_model.mvc", "r").read()) + [
                "model_add",
                    "Description_PW",
                    "description_model",
                    ] + get_model_constructor(open("models/description_model.mvc", "r").read()) + [
                "model_list",
                "verify",
                "Control_PW"
            ],
            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  Control_PW : SimpleClassDiagrams",
                     "  Environment_PW : SimpleClassDiagrams",
                     "  Description_PW : SimpleClassDiagrams",
                     "  control_model : Control_PW",
                     "  environment_model : Environment_PW",
                     "  description_model : Description_PW",]),
                "Ready for command...",
                # verify
                "Which model to verify?",
                "OK",
                "Ready for command...",
            ]))
    """

    def test_process_model_trivial_pn(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNet",
                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "ReachabilityGraph",
                    ] + get_model_constructor(open("integration/code/reachability_graph.mvc", "r").read()) + [
                "model_list",
                "transformation_add_MT_language",
                "PetriNet",
                "",
                "PetriNet_RAM",
                "transformation_add_MT_language",
                "ReachabilityGraph",
                "",
                "ReachabilityGraph_RAM",
                "transformation_add_MT",
                    "PetriNet_RAM",
                    "",
                    "PetriNet",
                    "",
                    "initialize_PN",
                    ] + get_model_constructor(open("integration/code/initialize_PN.mvc", "r").read()) + [
                "transformation_add_MANUAL",
                    "PetriNet",
                    "",
                    "PetriNet",
                    "",
                    "refine_PN",
                "transformation_add_AL",
                    "PetriNet",
                    "",
                    "ReachabilityGraph",
                    "",
                    "reachability",
                    ] + get_constructor(open("integration/code/reachability.alc", "r").read()) + [
                "transformation_add_MT",
                    "ReachabilityGraph_RAM",
                    "ReachabilityGraph",
                    "",
                    "",
                    "reachability_print",
                    ] + get_model_constructor(open("integration/code/reachabilitygraph_print.mvc", "r").read()) + [
                "model_add",
                    "ProcessModel",
                    "pn_reachability",
                    ] + get_model_constructor(open("integration/code/pm_pn_reachability.mvc", "r").read()) + [
                "model_list",
                "process_execute",
                "pn_reachability",
                "my_",
                    "instantiate",
                        "PetriNet/Place",
                        "p1",
                    "attr_add",
                        "p1",
                        "name",
                        "p1",
                    "attr_add",
                        "p1",
                        "tokens",
                        1,
                    "instantiate",
                        "PetriNet/Transition",
                        "t1",
                    "attr_add",
                        "t1",
                        "name",
                        "t1",
                    "instantiate",
                        "PetriNet/P2T",
                        "p2t",
                        "p1",
                        "t1",
                    "attr_add",
                        "p2t",
                        "weight",
                        1,
                    "exit",
                "model_list",
            ],
            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNet : SimpleClassDiagrams",
                     "  ReachabilityGraph : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  PetriNet",]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Which ones do you want to use as target (empty string to finish)?",
                "Model added as target",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MANUAL
                "Which metamodels do you want to use as source for the manual operation (empty string to finish)?",
                "Model added as source",
                "Which metamodels do you want to use as target for the manual operation (empty string to finish)?",
                "Model added as target",
                "Name of Manual operation model?",
                "Ready for command...",
                # transformation_add_AL
                "Which metamodels do you want to use as source for the action code (empty string to finish)?",
                "Model added as source",
                "Which metamodels do you want to use as target for the action code (empty string to finish)?",
                "Model added as target",
                "Name of Action Language model?",
                "Waiting for model constructors...",
                "Ready for command...",
                # transformation_add_MT
                "RAMified metamodel to use?",
                "Supported metamodels:",
                set(["  ReachabilityGraph",]),
                "",
                "Which ones do you want to use as source (empty string to finish)?",
                "Model added as source",
                "Which ones do you want to use as target (empty string to finish)?",
                "Name of new transformation?",
                "Waiting for model constructors...",
                "Ready for command...",
                # model_add
                "Creating new model!",
                "Model type?",
                "Model name?",
                "Waiting for model constructors...",
                "Model upload success!",
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNet : SimpleClassDiagrams",
                     "  ReachabilityGraph : SimpleClassDiagrams",
                     "  initialize_PN : PetriNet_RAM",
                     "  refine_PN : ManualOperation",
                     "  reachability : ActionLanguage",
                     "  reachability_print : ReachabilityGraph_RAM",
                     "  pn_reachability : ProcessModel",
                     "  PetriNet_RAM : SimpleClassDiagrams",
                     "  ReachabilityGraph_RAM : SimpleClassDiagrams",
                     "  __merged_PetriNet_RAM : SimpleClassDiagrams",
                     "  __merged_ReachabilityGraph_RAM : SimpleClassDiagrams",
                     "  __merged_refine_PN : SimpleClassDiagrams",
                     ]),
                "Ready for command...",
                # process_execute
                "Which process model do you want to execute?",
                "Model prefix to use?",
                    "Model loaded, ready for commands!",
                    "Use 'help' command for a list of possible commands",
                    "Please give your command.",
                    # instantiate p1
                        "Type to instantiate?",
                        "Name of new element?",
                        "Instantiation successful!",
                        "Please give your command.",
                        "Which model do you want to assign an attribute to?",
                        "Which attribute do you wish to assign?",
                        "Value of attribute?",
                        "Added attribute!",
                        "Please give your command.",
                        "Which model do you want to assign an attribute to?",
                        "Which attribute do you wish to assign?",
                        "Value of attribute?",
                        "Added attribute!",
                        "Please give your command.",
                    # instantiate t1
                        "Type to instantiate?",
                        "Name of new element?",
                        "Instantiation successful!",
                        "Please give your command.",
                        "Which model do you want to assign an attribute to?",
                        "Which attribute do you wish to assign?",
                        "Value of attribute?",
                        "Added attribute!",
                        "Please give your command.",
                    # instantiate p2t
                        "Type to instantiate?",
                        "Name of new element?",
                        "Source name?",
                        "Destination name?",
                        "Instantiation successful!",
                        "Please give your command.",
                        "Which model do you want to assign an attribute to?",
                        "Which attribute do you wish to assign?",
                        "Value of attribute?",
                        "Added attribute!",
                        "Please give your command.",
                set(['"0": {"p1": 1, }',
                     '"1": {"p1": 0, }',
                    ]),
                set(['"0" --["t1"]--> "1"',
                    ]),
                "Ready for command...",
                # model_list
                model_list |
                set([
                     "  PetriNet : SimpleClassDiagrams",
                     "  ReachabilityGraph : SimpleClassDiagrams",
                     "  initialize_PN : PetriNet_RAM",
                     "  refine_PN : ManualOperation",
                     "  reachability : ActionLanguage",
                     "  reachability_print : ReachabilityGraph_RAM",
                     "  pn_reachability : ProcessModel",
                     "  PetriNet_RAM : SimpleClassDiagrams",
                     "  ReachabilityGraph_RAM : SimpleClassDiagrams",
                     "  my_pn : PetriNet",
                     "  my_reachability : ReachabilityGraph",
                     "  __merged_PetriNet_RAM : SimpleClassDiagrams",
                     "  __merged_ReachabilityGraph_RAM : SimpleClassDiagrams",
                     "  __merged_refine_PN : SimpleClassDiagrams",
                     ]),
                "Ready for command...",
            ]))

    def test_process_powerwindow(self):
        self.assertTrue(run_file(all_files,
            [ "root", "root", "root", 
                "model_add",
                    "SimpleClassDiagrams",
                    "ReachabilityGraph",
                    ] + get_model_constructor(open("integration/code/reachability_graph.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PetriNet",
                    ] + get_model_constructor(open("integration/code/pn_design.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "Encapsulated_PetriNet",
                    ] + get_model_constructor(open("models/petrinet_ports.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "Requirement",
                    ] + get_model_constructor(open("models/requirements.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PW_Plant",
                    ] + get_model_constructor(open("models/plant_PW.mvc", "r").read()) + [
                "model_add",
                    "PW_Plant",
                    "plant_model",
                    ] + get_model_constructor(open("models/plant_model.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PW_Environment",
                    ] + get_model_constructor(open("models/environment_PW.mvc", "r").read()) + [
                "model_add",
                    "PW_Plant",
                    "environment_model",
                    ] + get_model_constructor(open("models/environment_model.mvc", "r").read()) + [
                "model_add",
                    "SimpleClassDiagrams",
                    "PW_Control",
                    ] + get_model_constructor(open("models/control_PW.mvc", "r").read()) + [
                "model_add",
                    "PW_Plant",
                    "control_model",
                    ] + get_model_constructor(open("models/control_model.mvc", "r").read()) + [
                "model_list",
                "transformation_add_MT_language",
                "PetriNet",
                "Encapsulated_PetriNet",
                "PW_Plant",
                "PW_Environment",
                "PW_Control",
                "ReachabilityGraph",
                "",
                "All_RAM",
                "transformation_add_MT",
                    "All_RAM",
                    "",
                    "PW_Plant",
                    "PW_Control",
                    "PW_Environment",
                    "",
                    "initialize_PN",
                    ] + get_model_constructor(open("models/initialize_all.mvc", "r").read()) + [
                "transformation_add_MANUAL",
                    "Requirement",
                    "PW_Plant",
                    "",
                    "PW_Plant",
                    "",
                    "refine_Plant",
                "transformation_add_MT",
                    "All_RAM",
                    "PW_Plant",
                    "",
                    "Encapsulated_PetriNet",
                    "",
                    "Plant2EPN",
                    ] + get_model_constructor(open("models/plant_to_EPN", "r").read()) + [
                "transformation_add_AL",
                    "PetriNet",
                    "",
                    "ReachabilityGraph",
                    "",
                    "reachability_analyse",
                    ] + get_constructor(open("integration/code/reachability.alc", "r").read()) + [
                "transformation_add_MT",
                    "All_RAM",
                    "ReachabilityGraph",
                    "",
                    "",
                    "reachability_print",
                    ] + get_model_constructor(open("integration/code/reachabilitygraph_print.mvc", "r").read()) + [
                "model_list",
            ],
            [   # bootup phase
                "Desired username for admin user?",
                "Desired password for admin user?",
                "Please repeat the password",
                "Passwords match!",
                "Welcome to the Model Management Interface v2.0!",
                "Use the 'help' command for a list of possible commands",
                "Ready for command...",
                # model_add * 10
                ] + [   "Creating new model!",
                        "Model type?",
                        "Model name?",
                        "Waiting for model constructors...",
                        "Model upload success!",
                        "Ready for command...", ] * 10 + [
                # model_list
                model_list |
                set([
                     "  PetriNet : SimpleClassDiagrams",
                     "  Encapsulated_PetriNet : SimpleClassDiagrams",
                     "  PW_Plant : SimpleClassDiagrams",
                     "  PW_Environment : SimpleClassDiagrams",
                     "  PW_Control : SimpleClassDiagrams",
                     "  plant_model : PW_Plant",
                     "  control_model : PW_Control",
                     "  environment_model : PW_Environment",
                     "  Requirement : SimpleClassDiagrams",
                     "  ReachabilityGraph : SimpleClassDiagrams",]),
                "Ready for command...",
                # transformation_add_MT_language
                "Formalisms to include (terminate with empty string)?",
                "Name of the RAMified transformation metamodel?",
                "Ready for command...",
            ]))
