1 /**
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <gtest/gtest.h>
16 #include <cstdio>
17 #include <optional>
18 #include <string>
19 #include "lsp_api_test.h"
20 #include "public/es2panda_lib.h"
21 #include "lsp/include/internal_api.h"
22 #include "ir/astNode.h"
23 #include "lsp/include/completions.h"
24
25 using ark::es2panda::lsp::Initializer;
26
27 class LSPAICTests : public LSPAPITests {};
28
TEST_F(LSPAICTests,GetAutoImportCompletionEntryUnresolved1)29 TEST_F(LSPAICTests, GetAutoImportCompletionEntryUnresolved1)
30 {
31 Initializer initializer = Initializer();
32
33 const char *fileName = "file.ets";
34 const char *fileSource = "import { PI } from \"std/math\"";
35 auto ctx = initializer.CreateContext(fileName, ES2PANDA_STATE_CHECKED, fileSource);
36 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
37 auto targetImportSpecifier =
38 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsImportSpecifier(); });
39 auto targetImportDeclaration =
40 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsETSImportDeclaration(); });
41
42 auto importDecl = targetImportDeclaration->AsETSImportDeclaration()->Source()->ToString();
43 auto importSpec = targetImportSpecifier->AsImportSpecifier()->Imported()->ToString();
44 auto config = reinterpret_cast<ark::es2panda::public_lib::Context *>(ctx)->config->options->ArkTSConfig();
45 initializer.DestroyContext(ctx);
46
47 auto data = ark::es2panda::lsp::CompletionEntryData(fileName, importSpec, importDecl, "");
48 auto result = ark::es2panda::lsp::GetAutoImportCompletionEntry(&data, config, "");
49 ASSERT_EQ(ark::es2panda::lsp::ResolutionStatus::UNRESOLVED, result->GetStatus());
50 }
51
TEST_F(LSPAICTests,GetAutoImportCompletionEntryNotExistInConfigPath)52 TEST_F(LSPAICTests, GetAutoImportCompletionEntryNotExistInConfigPath)
53 {
54 Initializer initializer = Initializer();
55
56 const char *fileName = "file.ets";
57 const char *fileSource = "import { COLLATION } from \"native/core\"";
58 auto ctx = initializer.CreateContext(fileName, ES2PANDA_STATE_CHECKED, fileSource);
59 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
60 auto targetImportSpecifier =
61 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsImportSpecifier(); });
62 auto targetImportDeclaration =
63 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsETSImportDeclaration(); });
64
65 auto importDecl = targetImportDeclaration->AsETSImportDeclaration()->Source()->ToString();
66 auto importSpec = targetImportSpecifier->AsImportSpecifier()->Imported()->ToString();
67 auto config = reinterpret_cast<ark::es2panda::public_lib::Context *>(ctx)->config->options->ArkTSConfig();
68 initializer.DestroyContext(ctx);
69
70 auto data = ark::es2panda::lsp::CompletionEntryData(fileName, importSpec, importDecl, "");
71 auto result = ark::es2panda::lsp::GetAutoImportCompletionEntry(&data, config, "");
72 ASSERT_EQ(std::nullopt, result);
73 }
74
TEST_F(LSPAICTests,GetAutoImportCompletionEntryResolved)75 TEST_F(LSPAICTests, GetAutoImportCompletionEntryResolved)
76 {
77 Initializer initializer = Initializer();
78
79 std::vector<std::string> files = {"get_auto_completion_test_main.ets", "get_auto_completion_test_helper.ets"};
80 std::vector<std::string> texts = {
81 R"(
82 import { helper } from "./get_auto_completion_test_helper.ets";
83 function main() {
84 helper();
85 }
86 )",
87 R"(
88 export function helper() {
89 return 2 * 2;
90 }
91 )"};
92 auto filePaths = CreateTempFile(files, texts);
93 size_t const expectedFileCount = 2;
94 ASSERT_EQ(filePaths.size(), expectedFileCount);
95
96 char const *fileName = filePaths[0].c_str();
97 auto ctx = initializer.CreateContext(fileName, ES2PANDA_STATE_CHECKED);
98 ASSERT_EQ(ContextState(ctx), ES2PANDA_STATE_CHECKED);
99
100 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
101 auto targetImportSpecifier =
102 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsImportSpecifier(); });
103 auto targetImportDeclaration =
104 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsETSImportDeclaration(); });
105
106 auto importDecl = targetImportDeclaration->AsETSImportDeclaration()->Source()->ToString();
107 auto importSpec = targetImportSpecifier->AsImportSpecifier()->Imported()->ToString();
108 auto config = reinterpret_cast<ark::es2panda::public_lib::Context *>(ctx)->config->options->ArkTSConfig();
109 initializer.DestroyContext(ctx);
110
111 auto data = ark::es2panda::lsp::CompletionEntryData(fileName, importSpec, importDecl, "");
112 auto result = ark::es2panda::lsp::GetAutoImportCompletionEntry(&data, config, "");
113 ASSERT_EQ(ark::es2panda::lsp::ResolutionStatus::RESOLVED, result->GetStatus());
114 }
115
TEST_F(LSPAICTests,GetAutoImportCompletionEntryEmptyFile)116 TEST_F(LSPAICTests, GetAutoImportCompletionEntryEmptyFile)
117 {
118 auto data = ark::es2panda::lsp::CompletionEntryData("", "", "", "");
119 auto result = ark::es2panda::lsp::GetAutoImportCompletionEntry(&data, nullptr, "");
120 ASSERT_EQ(std::nullopt, result);
121 }
122
TEST_F(LSPAICTests,GetAutoImportCompletionEntryNullConfigNonEmptyFile)123 TEST_F(LSPAICTests, GetAutoImportCompletionEntryNullConfigNonEmptyFile)
124 {
125 Initializer initializer = Initializer();
126
127 const char *fileName = "file.ets";
128 const char *fileSource = "import { PI } from \"std/math\"";
129 auto ctx = initializer.CreateContext(fileName, ES2PANDA_STATE_CHECKED, fileSource);
130 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
131 auto targetImportSpecifier =
132 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsImportSpecifier(); });
133 auto targetImportDeclaration =
134 ast->FindChild([](ark::es2panda::ir::AstNode *node) { return node->IsETSImportDeclaration(); });
135
136 auto importDecl = targetImportDeclaration->AsETSImportDeclaration()->Source()->ToString();
137 auto importSpec = targetImportSpecifier->AsImportSpecifier()->Imported()->ToString();
138 initializer.DestroyContext(ctx);
139
140 auto data = ark::es2panda::lsp::CompletionEntryData(fileName, importSpec, importDecl, "");
141 auto result = ark::es2panda::lsp::GetAutoImportCompletionEntry(&data, nullptr, "");
142 ASSERT_EQ(std::nullopt, result);
143 }
144
TEST_F(LSPAICTests,GetAutoImportCompletionEntryEmptyImportDeclaration)145 TEST_F(LSPAICTests, GetAutoImportCompletionEntryEmptyImportDeclaration)
146 {
147 Initializer initializer = Initializer();
148
149 const char *fileName = "file.ets";
150 auto ctx = initializer.CreateContext(fileName, ES2PANDA_STATE_CHECKED, "");
151 auto config = reinterpret_cast<ark::es2panda::public_lib::Context *>(ctx)->config->options->ArkTSConfig();
152 initializer.DestroyContext(ctx);
153
154 auto data = ark::es2panda::lsp::CompletionEntryData(fileName, "", "", "");
155 auto result = ark::es2panda::lsp::GetAutoImportCompletionEntry(&data, config, "");
156 ASSERT_EQ(std::nullopt, result);
157 }
158