• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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