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
16 #include "lsp/include/suggestion_diagnostics.h"
17 #include <gtest/gtest.h>
18 #include "lsp/include/internal_api.h"
19 #include "lsp_api_test.h"
20 #include "public/es2panda_lib.h"
21 namespace {
22 using ark::es2panda::lsp::Initializer;
23
24 class LspSuggestionTests : public LSPAPITests {};
25
TEST_F(LspSuggestionTests,isFixablePromiseHandler)26 TEST_F(LspSuggestionTests, isFixablePromiseHandler)
27 {
28 const char *source =
29 "function fetchData():Promise<string>{\nreturn Promise.resolve(\"Success\");\n}"
30 "\nfetchData().then();";
31 Initializer initializer = Initializer();
32 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
33 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
34 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
35 EXPECT_TRUE(ark::es2panda::lsp::IsFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
36 initializer.DestroyContext(ctx);
37 }
38
TEST_F(LspSuggestionTests,isFixablePromiseHandler2)39 TEST_F(LspSuggestionTests, isFixablePromiseHandler2)
40 {
41 const char *source =
42 "function fetchData(name:string):Promise<string>{\nreturn Promise.resolve(\"Success\");\n}"
43 "\nfetchData(\"test\").finally();";
44 Initializer initializer = Initializer();
45 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
46 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
47 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
48 EXPECT_TRUE(ark::es2panda::lsp::IsFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
49 initializer.DestroyContext(ctx);
50 }
51
TEST_F(LspSuggestionTests,isFixablePromiseHandler3)52 TEST_F(LspSuggestionTests, isFixablePromiseHandler3)
53 {
54 const char *source =
55 "function fetchData():Promise<string>{\n"
56 "return Promise.reject(\"Error\");\n}"
57 "\nfetchData().catch();";
58 Initializer initializer = Initializer();
59 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
60 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
61 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
62 EXPECT_TRUE(ark::es2panda::lsp::IsFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
63 initializer.DestroyContext(ctx);
64 }
65
TEST_F(LspSuggestionTests,isFixablePromiseHandler4)66 TEST_F(LspSuggestionTests, isFixablePromiseHandler4)
67 {
68 const char *source =
69 "function fetchData(name: string,name2:string):Promise<string>{\n"
70 "\nreturn Promise.resolve(\"Success\");"
71 "\n}\nfetchData(\"test\",\"test2\").finally();";
72 Initializer initializer = Initializer();
73 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
74 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
75 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
76 EXPECT_TRUE(ark::es2panda::lsp::IsFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
77 initializer.DestroyContext(ctx);
78 }
79
TEST_F(LspSuggestionTests,isReturnStatementWithFixablePromiseHandler)80 TEST_F(LspSuggestionTests, isReturnStatementWithFixablePromiseHandler)
81 {
82 const char *source =
83 "function fetchData(){\nreturn Promise.resolve(\"h\")\n;}\nfunction processData()"
84 "{\nreturn fetchData().then();\n};\nprocessData();\n";
85 Initializer initializer = Initializer();
86 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
87 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
88 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
89 EXPECT_TRUE(ark::es2panda::lsp::IsReturnStatementWithFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
90 initializer.DestroyContext(ctx);
91 }
92
TEST_F(LspSuggestionTests,isReturnStatementWithFixablePromiseHandler2)93 TEST_F(LspSuggestionTests, isReturnStatementWithFixablePromiseHandler2)
94 {
95 const char *source =
96 "function fetchData(){\nreturn Promise.resolve(\"h\")\n;}\n"
97 "\nfunction processData(){\nreturn fetchData().finally();\n};\nprocessData();\n";
98 Initializer initializer = Initializer();
99 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
100 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
101 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
102 EXPECT_TRUE(ark::es2panda::lsp::IsReturnStatementWithFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
103 initializer.DestroyContext(ctx);
104 }
105
TEST_F(LspSuggestionTests,isReturnStatementWithFixablePromiseHandler3)106 TEST_F(LspSuggestionTests, isReturnStatementWithFixablePromiseHandler3)
107 {
108 const char *source =
109 "function fetchData(){\nreturn Promise.reject(\"h\")\n;}\nfunction processData(){\n"
110 "\nreturn fetchData().catch();\n};\nprocessData();\n";
111 Initializer initializer = Initializer();
112 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
113 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
114 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
115 EXPECT_TRUE(ark::es2panda::lsp::IsReturnStatementWithFixablePromiseHandler(ast, visitedNestedConvertibleFunctions));
116 initializer.DestroyContext(ctx);
117 }
118
TEST_F(LspSuggestionTests,hasReturnStatementWithPromiseHandler)119 TEST_F(LspSuggestionTests, hasReturnStatementWithPromiseHandler)
120 {
121 const char *source =
122 "function fetchData(){\nreturn Promise.reject(\"h\")\n;}\nfunction processData()"
123 "{\nreturn fetchData().catch();\n};\nprocessData();\n";
124 Initializer initializer = Initializer();
125 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
126 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
127 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
128 EXPECT_TRUE(ark::es2panda::lsp::HasReturnStatementWithPromiseHandler(ast, visitedNestedConvertibleFunctions));
129 initializer.DestroyContext(ctx);
130 }
131
TEST_F(LspSuggestionTests,hasReturnStatementWithPromiseHandler2)132 TEST_F(LspSuggestionTests, hasReturnStatementWithPromiseHandler2)
133 {
134 const char *source =
135 "function fetchData(){\nreturn Promise.resolve(\"h\")\n;}\nfunction processData(){\n"
136 "\nreturn fetchData().finally();\n};\nprocessData();\n";
137 Initializer initializer = Initializer();
138 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
139 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
140 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
141 EXPECT_TRUE(ark::es2panda::lsp::HasReturnStatementWithPromiseHandler(ast, visitedNestedConvertibleFunctions));
142 initializer.DestroyContext(ctx);
143 }
144
TEST_F(LspSuggestionTests,isConvertibleFunction)145 TEST_F(LspSuggestionTests, isConvertibleFunction)
146 {
147 const char *source =
148 "function fetchData(){\nreturn Promise.resolve(\"h\")\n;}\nfunction processData()"
149 "{\nreturn fetchData().finally();\n};\nprocessData();\n";
150 Initializer initializer = Initializer();
151 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
152 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
153 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
154 EXPECT_TRUE(ark::es2panda::lsp::IsConvertibleFunction(ast, visitedNestedConvertibleFunctions));
155 initializer.DestroyContext(ctx);
156 }
157
TEST_F(LspSuggestionTests,isFixablePromiseArgument2)158 TEST_F(LspSuggestionTests, isFixablePromiseArgument2)
159 {
160 const char *source = "function myFun(x: string): string\n {return x;}\nconsole.log(\"add(1+2)\");";
161 Initializer initializer = Initializer();
162 es2panda_Context *ctx = initializer.CreateContext("sug-diag.ets", ES2PANDA_STATE_CHECKED, source);
163 std::unordered_map<std::string, bool> visitedNestedConvertibleFunctions;
164 auto ast = GetAstFromContext<ark::es2panda::ir::AstNode>(ctx);
165 auto node = ast->FindChild([](ark::es2panda::ir::AstNode *childNode) {
166 return (childNode->Type() == ark::es2panda::ir::AstNodeType::FUNCTION_EXPRESSION);
167 });
168 EXPECT_TRUE(ark::es2panda::lsp::IsFixablePromiseArgument(node, visitedNestedConvertibleFunctions));
169 initializer.DestroyContext(ctx);
170 }
171 } // namespace