def test_inheritance_processor(): """ Basic test for ExtRelativeName (using an inheritance example) """ ################################# # META MODEL DEF ################################# my_meta_model = metamodel_from_file( abspath(dirname(__file__)) + '/components_model1/Components.tx') my_meta_model.register_scope_providers({ "*.*": scoping_providers.FQN(), "Connection.from_port": scoping_providers.ExtRelativeName("from_inst.component", "slots", "extends"), "Connection.to_port": scoping_providers.ExtRelativeName("to_inst.component", "slots", "extends"), }) ################################# # MODEL PARSING ################################# my_model = my_meta_model.model_from_file( abspath(dirname(__file__)) + "/components_model1/example_inherit3.components") ################################# # TEST MODEL ################################# components = get_children_of_type("Component", my_model) expected = """ Start BaseProc ExtProc(BaseProc) Plus ExtProc2(Plus,ExtProc(BaseProc)) End End2 """ def myformatter(compo): if len(compo.extends) == 0: return compo.name else: return compo.name + "(" + ",".join(map(lambda x: myformatter(x), compo.extends)) + ")" res = "\n\n" # possibly in future version, the order need to be normalized... for c in components: res += myformatter(c) + "\n" print(res) assert re.sub(r'\s*', "", expected) == re.sub(r'\s*', "", res)
def test_resolve_model_path_with_lists(): ################################# # META MODEL DEF ################################# my_meta_model = metamodel_from_file( join(abspath(dirname(__file__)), 'components_model1', 'Components.tx')) my_meta_model.register_scope_providers({ "*.*": scoping_providers.FQN(), "Connection.from_port": scoping_providers.ExtRelativeName("from_inst.component", "slots", "extends"), "Connection.to_port": scoping_providers.ExtRelativeName("to_inst.component", "slots", "extends"), }) ################################# # MODEL PARSING ################################# my_model = my_meta_model.model_from_file( join(abspath(dirname(__file__)), "components_model1", "example_inherit2.components")) ################################# # TEST MODEL ################################# action2a = resolve_model_path(my_model, "packages.usage.instances.action2", True) action2b = get_unique_named_object(my_model, "action2") assert action2a is action2b middle_a = resolve_model_path(my_model, "packages.base.components.Middle", True) middle_b = get_unique_named_object(my_model, "Middle") assert middle_a is middle_b # test parent(...) with lists action2a_with_parent = resolve_model_path( action2a, "parent(Model).packages.usage.instances.action2", True) assert action2a_with_parent == action2a # test "normal" parent with lists action2a_with_parent2 = resolve_model_path( action2a, "parent.instances.action2", True) assert action2a_with_parent2 == action2a with raises(Exception, match=r'.*unexpected: got list in path for ' r'get_referenced_object.*'): resolve_model_path(my_model, "packages.usage.instances.action2", False)
def test_get_list_of_concatenated_objects(): ################################# # META MODEL DEF ################################# my_meta_model = metamodel_from_file( join(abspath(dirname(__file__)), 'components_model1', 'Components.tx')) my_meta_model.register_scope_providers({ "*.*": scoping_providers.FQN(), "Connection.from_port": scoping_providers.ExtRelativeName("from_inst.component", "slots", "extends"), "Connection.to_port": scoping_providers.ExtRelativeName("to_inst.component", "slots", "extends"), }) ################################# # MODEL PARSING ################################# my_model1 = my_meta_model.model_from_file( join(abspath(dirname(__file__)), "components_model1", "example_inherit1.components")) my_model2 = my_meta_model.model_from_file( join(abspath(dirname(__file__)), "components_model1", "example_inherit2.components")) ################################# # TEST MODEL ################################# # test extends A,B start = get_unique_named_object(my_model1, "Start") middle = get_unique_named_object(my_model1, "Middle") end = get_unique_named_object(my_model1, "End") inherited_classes = get_list_of_concatenated_objects(middle, "extends") assert len(inherited_classes) == 3 assert inherited_classes[0] is middle assert inherited_classes[1] is start assert inherited_classes[2] is end # test extends A extends B start = get_unique_named_object(my_model2, "Start") middle = get_unique_named_object(my_model2, "Middle") end = get_unique_named_object(my_model2, "End") inherited_classes = get_list_of_concatenated_objects(middle, "extends") assert len(inherited_classes) == 3 assert inherited_classes[0] is middle assert inherited_classes[1] is start assert inherited_classes[2] is end
def get_meta_model(provider, grammar_file_name): mm = metamodel_from_file(join(this_folder, grammar_file_name), debug=False) mm.register_scope_providers({ "*.*": provider, "Call.method": scoping_providers.ExtRelativeName("obj.ref", "methods", "extends") }) return mm
def get_meta_model(global_repo, grammar_file_name): mm = metamodel_from_file(join(this_folder, grammar_file_name), debug=False) mm.register_scope_providers({ "*.*": global_repo, "Ingredient.unit": scoping_providers.ExtRelativeName("type", "units", "extends") }) return mm
def test_get_referenced_object(): ################################# # META MODEL DEF ################################# my_meta_model = metamodel_from_file( abspath(dirname(__file__)) + '/components_model1/Components.tx') my_meta_model.register_scope_providers({ "*.*": scoping_providers.FQN(), "Connection.from_port": scoping_providers.ExtRelativeName("from_inst.component", "slots", "extends"), "Connection.to_port": scoping_providers.ExtRelativeName("to_inst.component", "slots", "extends"), }) ################################# # MODEL PARSING ################################# my_model = my_meta_model.model_from_file( abspath(dirname(__file__)) + "/components_model1/example_inherit2.components") ################################# # TEST MODEL ################################# action2a = get_referenced_object( None, my_model, "packages.usage.instances.action2") action2b = get_unique_named_object(my_model, "action2") assert action2a is action2b middle_a = get_referenced_object( None, my_model, "packages.base.components.Middle") middle_b = get_unique_named_object(my_model, "Middle") assert middle_a is middle_b
def recipe_lang(): this_folder = dirname(abspath(__file__)) mm = metamodel_from_file(join(this_folder, "grammar", "Recipe.tx"), classes=[Ingredient]) config_provider = scoping_providers.PlainNameGlobalRepo( "**/*.config", glob_args={"recursive": True}) ingredient_type_provider = scoping_providers.PlainNameGlobalRepo( "**/*.ingredient", glob_args={"recursive": True}) mm.register_scope_providers({ "Recipe.persons": config_provider, "Ingredient.type": ingredient_type_provider, "Ingredient.unit": scoping_providers.ExtRelativeName("type", "units", "extends"), }) return mm
def get_meta_model(provider, grammar_file_name): mm = metamodel_from_file(join(this_folder, grammar_file_name), debug=False) mm.register_scope_providers({ "*.*": provider, "Call.method": scoping_providers.ExtRelativeName("obj.ref", "methods", "extends") }) def my_processor(m): from textx.exceptions import TextXSemanticError if m.name == "d1": raise TextXSemanticError("d1 triggers artifical error", **get_location(m)) mm.register_obj_processors({"Method": my_processor}) return mm
def test_model_with_local_scope_and_inheritance2(): """ This is a more complicated test for the local scope provider. """ ################################# # META MODEL DEF ################################# my_meta_model = metamodel_from_file( abspath(dirname(__file__)) + '/components_model1/Components.tx') my_meta_model.register_scope_providers({ "*.*": scoping_providers.FQN(), "Connection.from_port": scoping_providers.ExtRelativeName("from_inst.component", "slots", "extends"), "Connection.to_port": scoping_providers.ExtRelativeName("to_inst.component", "slots", "extends"), }) ################################# # MODEL PARSING ################################# my_model = my_meta_model.model_from_file( abspath(dirname(__file__)) + "/components_model1/example_inherit1.components") ################################# # TEST MODEL ################################# # test inherited ports are same (direct inheritance) action1 = get_unique_named_object(my_model, "action1") action2 = get_unique_named_object(my_model, "action2") action3 = get_unique_named_object(my_model, "action3") end = get_unique_named_object(my_model, "end") connections = get_children_of_type("Connection", my_model) selected_connections_12 = list( filter(lambda x: x.from_inst == action1 and x.to_inst == action2, connections)) selected_connections_3e = list( filter(lambda x: x.from_inst == action3 and x.to_inst == end, connections)) assert len(selected_connections_12) == 1 assert len(selected_connections_3e) == 1 assert selected_connections_12[0].to_port is selected_connections_3e[0].\ to_port # output3 is same ################################# # MODEL PARSING ################################# my_model = my_meta_model.model_from_file( abspath(dirname(__file__)) + "/components_model1/example_inherit2.components") ################################# # TEST MODEL ################################# # test inherited ports are same # (indirect inheritance: Middle -> Start -> End) action1 = get_unique_named_object(my_model, "action1") action2 = get_unique_named_object(my_model, "action2") action3 = get_unique_named_object(my_model, "action3") end = get_unique_named_object(my_model, "end") connections = get_children_of_type("Connection", my_model) selected_connections_12 = list( filter(lambda x: x.from_inst == action1 and x.to_inst == action2, connections)) selected_connections_3e = list( filter(lambda x: x.from_inst == action3 and x.to_inst == end, connections)) assert len(selected_connections_12) == 1 assert len(selected_connections_3e) == 1 assert selected_connections_12[0].to_port is selected_connections_3e[0].\ to_port # output3 is same