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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 9
0
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