Ejemplo n.º 1
0
def test_hover():
    def check_return(result_array, checks):
        assert len(result_array) == len(checks)
        for (i, check) in enumerate(checks):
            assert result_array[i]['contents'][0]['value'] == check

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "subdir", "test_abstract.f90")
    string += write_rpc_request(
        2, "textDocument/hover", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 7,
                "character": 30
            }
        })
    errcode, results = run_request(string)
    assert errcode == 0
    #
    check_return(results[1:], ("""SUBROUTINE test(a, b)
 INTEGER(4), DIMENSION(3,6), INTENT(IN) :: a
 REAL(8), DIMENSION(4), INTENT(OUT) :: b""", ))
def test_change():
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "subdir", "test_free.f90")
    string += write_rpc_notification("textDocument/didChange", {
        "textDocument": {"uri": file_path},
        "contentChanges": [{
            "text": "",
            "range": {
                "start": {"line": 6, "character": 0},
                "end": {"line": 29, "character": 0}
            }
        },
        {
            "text": "",
            "range": {
                "start": {"line": 7, "character": 0},
                "end": {"line": 34, "character": 0}
            }
        }]
    })
    string += write_rpc_request(2, "textDocument/documentSymbol", {
        "textDocument": {"uri": file_path}
    })
    errcode, results = run_request(string)
    #
    assert errcode == 0
    assert len(results) == 2
    assert len(results[1]) == 4
Ejemplo n.º 3
0
def test_refs():
    def check_return(result_array, checks):
        assert len(result_array) == len(checks)
        for (i, check) in enumerate(checks):
            assert result_array[i]["uri"] == path_to_uri(check[2])
            assert result_array[i]["range"]["start"]["character"] == check[0]
            assert result_array[i]["range"]["end"]["character"] == check[1]

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += write_rpc_request(
        2, "textDocument/references", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 9,
                "character": 8
            }
        })
    errcode, results = run_request(string)
    assert errcode == 0
    #
    free_path = os.path.join(test_dir, "subdir", "test_free.f90")
    check_return(results[1],
                 ([8, 14, free_path], [9, 15, free_path], [14, 20, free_path],
                  [6, 12, free_path], [6, 12, free_path], [6, 12, free_path], [
                      6, 12, free_path
                  ], [21, 27, os.path.join(test_dir, "test_prog.f08")],
                  [5, 11, os.path.join(test_dir, "test_prog.f08")]))
Ejemplo n.º 4
0
def test_symbols():
    def check_return(result_arrary):
        # Expected objects
        objs = [["test_free", 2, 0, 57], ["scale_type", 5, 4, 6],
                ["val", 13, 5, 5], ["vector", 5, 8, 14], ["n", 13, 9, 9],
                ["v", 13, 10, 10], ["create", 6, 12, 12], ["norm", 12, 13, 13],
                ["scaled_vector", 5, 16, 21], ["scale", 13, 17, 17],
                ["set_scale", 6, 19, 19], ["norm", 12, 20, 20],
                ["vector_create", 6, 26, 32], ["vector_norm", 12, 34, 38],
                ["scaled_vector_set", 6, 40, 44],
                ["scaled_vector_norm", 12, 46, 50],
                ["unscaled_norm", 12, 52, 56]]
        assert len(result_arrary) == len(objs)
        for i, obj in enumerate(objs):
            assert result_arrary[i]["name"] == obj[0]
            assert result_arrary[i]["kind"] == obj[1]
            assert result_arrary[i]["location"]["range"]["start"][
                "line"] == obj[2]
            assert result_arrary[i]["location"]["range"]["end"]["line"] == obj[
                3]

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "subdir", "test_free.f90")
    string += write_rpc_request(2, "textDocument/documentSymbol",
                                {"textDocument": {
                                    "uri": file_path
                                }})
    errcode, results = run_request(string)
    #
    assert errcode == 0
    check_return(results[1])
Ejemplo n.º 5
0
def test_workspace_symbols():
    def check_return(result_array):
        # Expected objects
        objs = (["test", 6, 7], ["test_abstract", 2,
                                 0], ["test_free", 2,
                                      0], ["test_gen_type", 5,
                                           1], ["test_generic", 2,
                                                0], ["test_inherit", 2,
                                                     0], ["test_mod", 2, 0],
                ["test_program", 2,
                 0], ["test_rename_sub", 6,
                      9], ["test_select", 2,
                           0], ["test_select_sub", 6,
                                16], ["test_sig_Sub", 6,
                                      67], ["test_str1", 13,
                                            5], ["test_str2", 13,
                                                 5], ["test_sub", 6, 8])
        assert len(result_array) == len(objs)
        for i, obj in enumerate(objs):
            assert result_array[i]["name"] == obj[0]
            assert result_array[i]["kind"] == obj[1]
            assert result_array[i]["location"]["range"]["start"][
                "line"] == obj[2]

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    string += write_rpc_request(2, "workspace/symbol", {"query": "test"})
    errcode, results = run_request(string)
    #
    assert errcode == 0
    check_return(results[1])
def test_def():
    def check_return(result_array, checks):
        assert result_array["uri"] == checks[2]
        assert result_array["range"]["start"]["line"] == checks[0]
        assert result_array["range"]["start"]["line"] == checks[1]
    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += write_rpc_request(2, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 12, "character": 6}
    })
    string += write_rpc_request(3, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 13, "character": 6}
    })
    string += write_rpc_request(4, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 18, "character": 7}
    })
    string += write_rpc_request(5, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 19, "character": 20}
    })
    string += write_rpc_request(6, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 19, "character": 42}
    })
    string += write_rpc_request(7, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 21, "character": 26}
    })
    file_path = os.path.join(test_dir, "subdir", "test_submod.F90")
    string += write_rpc_request(8, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 16, "character": 12}
    })
    file_path = os.path.join(test_dir, "test_inc.f90")
    string += write_rpc_request(9, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 10, "character": 2}
    })
    file_path = os.path.join(test_dir, "subdir", "test_inc2.f90")
    string += write_rpc_request(10, "textDocument/definition", {
        "textDocument": {"uri": file_path},
        "position": {"line": 3, "character": 2}
    })
    errcode, results = run_request(string)
    #
    assert errcode == 0
    check_return(results[1], [0, 0, path_to_uri(os.path.join(test_dir, "subdir", "test_fixed.f"))])
    check_return(results[2], [20, 20, path_to_uri(os.path.join(test_dir, "subdir", "test_fixed.f"))])
    check_return(results[3], [10, 10, path_to_uri(os.path.join(test_dir, "test_prog.f08"))])
    check_return(results[4], [19, 19, path_to_uri(os.path.join(test_dir, "subdir", "test_free.f90"))])
    check_return(results[5], [13, 13, path_to_uri(os.path.join(test_dir, "subdir", "test_free.f90"))])
    check_return(results[6], [5, 5, path_to_uri(os.path.join(test_dir, "subdir", "test_free.f90"))])
    check_return(results[7], [1, 1, path_to_uri(os.path.join(test_dir, "subdir", "test_submod.F90"))])
    check_return(results[8], [0, 0, path_to_uri(os.path.join(test_dir, "subdir", "test_inc2.f90"))])
    check_return(results[9], [4, 4, path_to_uri(os.path.join(test_dir, "test_inc.f90"))])
Ejemplo n.º 7
0
def test_sig():
    def check_return(results, checks):
        assert results.get('activeParameter', -1) == checks[0]
        signatures = results.get('signatures')
        assert signatures[0].get('label') == checks[2]
        assert len(signatures[0].get('parameters')) == checks[1]

    def sig_request(file_path, line, char):
        return write_rpc_request(1, "textDocument/signatureHelp", {
            "textDocument": {"uri": file_path},
            "position": {"line": line, "character": char}
        })
    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += sig_request(file_path, 25, 18)
    string += sig_request(file_path, 25, 20)
    string += sig_request(file_path, 25, 22)
    string += sig_request(file_path, 25, 27)
    string += sig_request(file_path, 25, 29)
    errcode, results = run_request(string)
    assert errcode == 0
    #
    sub_sig = "test_sig_Sub(arg1, arg2, opt1=opt1, opt2=opt2, opt3=opt3)"
    exp_results = (
        [0, 5, sub_sig],
        [1, 5, sub_sig],
        [2, 5, sub_sig],
        [3, 5, sub_sig],
        [4, 5, sub_sig]
    )
    assert len(exp_results)+1 == len(results)
    for i in range(len(exp_results)):
        check_return(results[i+1], exp_results[i])
Ejemplo n.º 8
0
def test_init():
    def check_return(result_dict):
        # Expected capabilities
        # {
        #     "completionProvider": {
        #         "resolveProvider": false,
        #         "triggerCharacters": ["."]
        #     },
        #     "definitionProvider": true,
        #     "documentSymbolProvider": true,
        #     "hoverProvider": true,
        #     "textDocumentSync": 1
        # }
        #
        assert "capabilities" in result_dict
        assert result_dict["capabilities"]["textDocumentSync"] == 2
        assert result_dict["capabilities"]["definitionProvider"] is True
        assert result_dict["capabilities"]["documentSymbolProvider"] is True
        assert result_dict["capabilities"]["hoverProvider"] is True
        assert result_dict["capabilities"]["hoverProvider"] == 1
        assert result_dict["capabilities"]["completionProvider"][
            "resolveProvider"] is False
        assert result_dict["capabilities"]["completionProvider"][
            "triggerCharacters"][0] == "."

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    errcode, results = run_request(string)
    #
    assert errcode == 0
    check_return(results[0])
Ejemplo n.º 9
0
def test_symbols():
    def check_return(result_array):
        # Expected objects
        objs = (["test_free", 2, 0,
                 79], ["scale_type", 5, 4,
                       6], ["val", 13, 5,
                            5], ["vector", 5, 8,
                                 16], ["n", 13, 9,
                                       9], ["v", 13, 10,
                                            10], ["bound_nopass", 6, 11,
                                                  11], ["create", 6, 13, 13],
                ["norm", 12, 14,
                 14], ["bound_pass", 6, 15,
                       15], ["scaled_vector", 5, 18,
                             23], ["scale", 13, 19,
                                   19], ["set_scale", 6, 21,
                                         21], ["norm", 12, 22,
                                               22], ["fort_wrap", 11, 26, 29],
                ["vector_create", 6, 35,
                 41], ["vector_norm", 12, 43,
                       47], ["scaled_vector_set", 6, 49,
                             53], ["scaled_vector_norm", 12, 55,
                                   59], ["unscaled_norm", 12, 61,
                                         65], ["test_sig_Sub", 6, 67,
                                               70], ["bound_pass", 6, 72, 78])
        assert len(result_array) == len(objs)
        for i, obj in enumerate(objs):
            assert result_array[i]["name"] == obj[0]
            assert result_array[i]["kind"] == obj[1]
            assert result_array[i]["location"]["range"]["start"][
                "line"] == obj[2]
            assert result_array[i]["location"]["range"]["end"]["line"] == obj[
                3]

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "subdir", "test_free.f90")
    string += write_rpc_request(2, "textDocument/documentSymbol",
                                {"textDocument": {
                                    "uri": file_path
                                }})
    errcode, results = run_request(string)
    #
    assert errcode == 0
    check_return(results[1])
Ejemplo n.º 10
0
def test_def():
    def check_return(result_array, checks):
        assert result_array["uri"] == path_to_uri(checks[2])
        assert result_array["range"]["start"]["line"] == checks[0]
        assert result_array["range"]["start"]["line"] == checks[1]

    def def_request(file_path, line, char):
        return write_rpc_request(
            1, "textDocument/definition", {
                "textDocument": {
                    "uri": file_path
                },
                "position": {
                    "line": line,
                    "character": char
                }
            })

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += def_request(file_path, 12, 6)
    string += def_request(file_path, 13, 6)
    string += def_request(file_path, 20, 7)
    string += def_request(file_path, 21, 20)
    string += def_request(file_path, 21, 42)
    string += def_request(file_path, 23, 26)
    file_path = os.path.join(test_dir, "subdir", "test_submod.F90")
    string += def_request(file_path, 25, 12)
    string += def_request(file_path, 30, 12)
    file_path = os.path.join(test_dir, "test_inc.f90")
    string += def_request(file_path, 10, 2)
    file_path = os.path.join(test_dir, "subdir", "test_inc2.f90")
    string += def_request(file_path, 3, 2)
    errcode, results = run_request(string)
    assert errcode == 0
    #
    fixed_path = os.path.join(test_dir, "subdir", "test_fixed.f")
    free_path = os.path.join(test_dir, "subdir", "test_free.f90")
    exp_results = (
        # test_prog.f08
        [0, 0, fixed_path],
        [19, 19, fixed_path],
        [10, 10, os.path.join(test_dir, "test_prog.f08")],
        [21, 21, free_path],
        [14, 14, free_path],
        [5, 5, free_path],
        # subdir/test_submod.F90
        [1, 1, os.path.join(test_dir, "subdir", "test_submod.F90")],
        [1, 1, os.path.join(test_dir, "subdir", "test_submod.F90")],
        # test_inc.f90
        [0, 0, os.path.join(test_dir, "subdir", "test_inc2.f90")],
        # subdir/test_inc2.f90
        [4, 4, os.path.join(test_dir, "test_inc.f90")])
    assert len(exp_results) + 1 == len(results)
    for i in range(len(exp_results)):
        check_return(results[i + 1], exp_results[i])
Ejemplo n.º 11
0
def test_open():
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "subdir", "test_free.f90")
    string += write_rpc_notification("textDocument/didOpen", {
        "textDocument": {"uri": file_path}
    })
    errcode, results = run_request(string)
    #
    assert errcode == 0
    assert len(results) == 1
Ejemplo n.º 12
0
 def hover_request(file_path, line, char):
     return write_rpc_request(
         1, "textDocument/hover", {
             "textDocument": {
                 "uri": file_path
             },
             "position": {
                 "line": line,
                 "character": char
             }
         })
Ejemplo n.º 13
0
 def sig_request(file_path, line, char):
     return write_rpc_request(
         1, "textDocument/signatureHelp", {
             "textDocument": {
                 "uri": file_path
             },
             "position": {
                 "line": line,
                 "character": char
             }
         })
Ejemplo n.º 14
0
def test_refs():
    def check_return(result_array, checks):
        def find_in_results(uri, sline):
            for (i, result) in enumerate(result_array):
                if (result["uri"] == uri) and (result["range"]["start"]["line"]
                                               == sline):
                    del result_array[i]
                    return result
            return None

        assert len(result_array) == len(checks)
        for check in checks:
            result = find_in_results(path_to_uri(check[0]), check[1])
            assert (result is not None)
            assert result["range"]["start"]["character"] == check[2]
            assert result["range"]["end"]["character"] == check[3]

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += write_rpc_request(
        2, "textDocument/references", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 9,
                "character": 8
            }
        })
    errcode, results = run_request(string)
    assert errcode == 0
    #
    free_path = os.path.join(test_dir, "subdir", "test_free.f90")
    check_return(results[1],
                 ([os.path.join(test_dir, "test_prog.f08"), 2, 21, 27], [
                     os.path.join(test_dir, "test_prog.f08"), 9, 5, 11
                 ], [free_path, 8, 8, 14], [free_path, 16, 9, 15], [
                     free_path, 18, 14, 20
                 ], [free_path, 36, 6, 12], [free_path, 44, 6, 12],
                  [free_path, 50, 6, 12], [free_path, 76, 6, 12]))
Ejemplo n.º 15
0
def test_docs():
    def check_return(result_array, checks):
        comm_lines = []
        for (i, hover_line) in enumerate(
                result_array['contents'][0]['value'].splitlines()):
            if hover_line.count('!!') > 0:
                comm_lines.append((i, hover_line))
        assert len(comm_lines) == len(checks)
        for i in range(len(checks)):
            assert comm_lines[i][0] == checks[i][0]
            assert comm_lines[i][1] == checks[i][1]

    def hover_request(file_path, line, char):
        return write_rpc_request(
            1, "textDocument/hover", {
                "textDocument": {
                    "uri": file_path
                },
                "position": {
                    "line": line,
                    "character": char
                }
            })

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "subdir", "test_free.f90")
    string += hover_request(file_path, 13, 19)
    string += hover_request(file_path, 13, 31)
    string += hover_request(file_path, 14, 17)
    string += hover_request(file_path, 14, 28)
    string += hover_request(file_path, 21, 18)
    string += hover_request(file_path, 21, 37)
    string += hover_request(file_path, 22, 17)
    string += hover_request(file_path, 22, 32)
    string += hover_request(file_path, 15, 32)
    string += hover_request(file_path, 15, 47)
    errcode, results = run_request(string)
    assert errcode == 0
    #
    check_return(results[1], ((1, '!! Doc 1'), (3, ' !! Doc 5')))
    check_return(results[2], ((1, '!! Doc 4'), (4, ' !! Doc 5')))
    check_return(results[3], ((1, '!! Doc 2'), ))
    check_return(results[4], ((1, '!! Doc 6'), ))
    check_return(results[5], ((1, '!! Doc 7'), (3, ' !! Doc 8')))
    check_return(results[6], ((1, '!! Doc 7'), (4, ' !! Doc 8')))
    check_return(results[7], ((1, '!! Doc 3'), ))
    check_return(results[8], ())
    check_return(results[9], ())
    check_return(results[10], ((3, ' !! Doc 9'), (4, ' !! Doc 10')))
Ejemplo n.º 16
0
def test_comp():
    def check_return(result_array, checks):
        assert len(result_array) == checks[0]
        if checks[0] > 0:
            assert result_array[0]["label"] == checks[1]
            assert result_array[0]["detail"] == checks[2]

    def comp_request(file_path, line, char):
        return write_rpc_request(
            1, "textDocument/completion", {
                "textDocument": {
                    "uri": file_path
                },
                "position": {
                    "line": line,
                    "character": char
                }
            })

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += comp_request(file_path, 12, 6)
    string += comp_request(file_path, 13, 6)
    string += comp_request(file_path, 17, 24)
    string += comp_request(file_path, 18, 23)
    string += comp_request(file_path, 20, 7)
    string += comp_request(file_path, 21, 20)
    string += comp_request(file_path, 21, 42)
    string += comp_request(file_path, 23, 26)
    file_path = os.path.join(test_dir, "subdir", "test_submod.F90")
    string += comp_request(file_path, 25, 12)
    string += comp_request(file_path, 26, 8)
    string += comp_request(file_path, 26, 23)
    string += comp_request(file_path, 30, 12)
    string += comp_request(file_path, 31, 46)
    file_path = os.path.join(test_dir, "test_inc.f90")
    string += comp_request(file_path, 10, 2)
    file_path = os.path.join(test_dir, "subdir", "test_inc2.f90")
    string += comp_request(file_path, 3, 2)
    file_path = os.path.join(test_dir, "subdir", "test_abstract.f90")
    string += comp_request(file_path, 7, 12)
    file_path = os.path.join(test_dir, "subdir", "test_free.f90")
    string += comp_request(file_path, 10, 22)
    string += comp_request(file_path, 28, 14)
    file_path = os.path.join(test_dir, "subdir", "test_select.f90")
    string += comp_request(file_path, 21, 7)
    string += comp_request(file_path, 23, 7)
    string += comp_request(file_path, 25, 7)
    string += comp_request(file_path, 30, 7)
    file_path = os.path.join(test_dir, "test_block.f08")
    string += comp_request(file_path, 2, 2)
    string += comp_request(file_path, 5, 4)
    string += comp_request(file_path, 8, 6)
    file_path = os.path.join(test_dir, "subdir", "test_generic.f90")
    string += comp_request(file_path, 13, 10)
    file_path = os.path.join(test_dir, "subdir", "test_inherit.f90")
    string += comp_request(file_path, 10, 11)
    file_path = os.path.join(test_dir, "subdir", "test_rename.F90")
    string += comp_request(file_path, 13, 5)
    string += comp_request(file_path, 14, 5)
    errcode, results = run_request(string)
    assert errcode == 0
    #
    exp_results = (
        # test_prog.f08
        [1, "myfun", "DOUBLE PRECISION FUNCTION myfun(n, xval)"],
        [4, "glob_sub", "SUBROUTINE glob_sub(n, xval, yval)"],
        [1, "bound_nopass", "SUBROUTINE bound_nopass(a, b)"],
        [1, "bound_pass", "SUBROUTINE bound_pass(arg1)"],
        [1, "stretch_vector", "TYPE(scaled_vector)"],
        [6, "scale", "TYPE(scale_type)"],
        [2, "n", "INTEGER(4)"],
        [1, "val", "REAL(8)"],
        # subdir/test_submod.F90
        [1, "point", "TYPE"],
        [1, "distance", "REAL"],
        [2, "x", "REAL"],
        [1, "point", "TYPE"],
        [2, "x", "REAL"],
        # test_inc.f90
        [2, "val1", "REAL(8)"],
        # subdir/test_inc2.f90
        [2, "val1", "REAL(8)"],
        # subdir/test_abstract.f90
        [1, "abs_interface", "SUBROUTINE"],
        # subdir/test_free.f90
        [1, "DIMENSION(:)", "KEYWORD"],
        [3, "INTENT(IN)", "KEYWORD"],
        # subdir/test_select.f90
        [2, "a", "REAL(8)"],
        [2, "a", "COMPLEX(8)"],
        [1, "n", "INTEGER(4)"],
        [2, "a", "REAL(8)"],
        # test_block.f08
        [7, "READ", "STATEMENT"],
        [8, "READ", "STATEMENT"],
        [9, "READ", "STATEMENT"],
        # subdir/test_generic.f90
        [2, "my_gen", "SUBROUTINE my_gen(self, a, b)"],
        # subdir/test_inherit.f90
        [1, "val", "REAL(8)"],
        # subdir/test_rename.F90
        [1, "localname", "INTEGER"],
        [1, "renamed_var2", "REAL(8)"])
    assert len(exp_results) + 1 == len(results)
    for i in range(len(exp_results)):
        check_return(results[i + 1], exp_results[i])
Ejemplo n.º 17
0
def test_comp():
    def check_return(result_arrary, checks):
        assert len(result_arrary["items"]) == checks[0]
        if checks[0] > 0:
            assert result_arrary["items"][0]["label"] == checks[1]

    #
    string = write_rpc_request(1, "initialize", {"rootPath": test_dir})
    file_path = os.path.join(test_dir, "test_prog.f08")
    string += write_rpc_request(
        2, "textDocument/completion", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 12,
                "character": 6
            }
        })
    string += write_rpc_request(
        3, "textDocument/completion", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 13,
                "character": 6
            }
        })
    string += write_rpc_request(
        4, "textDocument/completion", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 18,
                "character": 7
            }
        })
    string += write_rpc_request(
        5, "textDocument/completion", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 19,
                "character": 20
            }
        })
    string += write_rpc_request(
        6, "textDocument/completion", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 19,
                "character": 42
            }
        })
    string += write_rpc_request(
        7, "textDocument/completion", {
            "textDocument": {
                "uri": file_path
            },
            "position": {
                "line": 21,
                "character": 26
            }
        })
    errcode, results = run_request(string)
    #
    assert errcode == 0
    check_return(results[1], [1, "myfun(n,xval)"])
    check_return(results[2], [1, "glob_sub(n,xval,yval)"])
    check_return(results[3], [1, "stretch_vector"])
    check_return(results[4], [6, "scale"])
    check_return(results[5], [2, "n"])
    check_return(results[6], [1, "val"])