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 <gtest/gtest.h>
17 #include <cstddef>
18 #include <string>
19 #include <vector>
20 #include "lsp_api_test.h"
21 #include "lsp/include/internal_api.h"
22 #include "lsp/include/api.h"
23 #include "public/es2panda_lib.h"
24
25 namespace {
26 using ark::es2panda::lsp::Initializer;
27
28 class LspGetSafeDeleteInfoTest : public LSPAPITests {};
29
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase1)30 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase1)
31 {
32 std::vector<std::string> files = {"get-safe-delete-info-case1.ets"};
33 std::vector<std::string> texts = {R"(function a(): Number { return 1; } a())"};
34 auto filePaths = CreateTempFile(files, texts);
35
36 Initializer initializer;
37 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
38 LSPAPI const *lspApi = GetImpl();
39
40 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
41 constexpr size_t offset = 16;
42 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
43 ASSERT_EQ(result, false);
44
45 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
46 constexpr size_t offsetT2 = 35;
47 result = lspApi->getSafeDeleteInfo(ctx, offsetT2);
48 ASSERT_EQ(result, true);
49
50 initializer.DestroyContext(ctx);
51 }
52
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase2)53 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase2)
54 {
55 std::vector<std::string> files = {"get-safe-delete-info-case2.ets"};
56 std::vector<std::string> texts = {R"(export const PI = 3.1415926;)"};
57 auto filePaths = CreateTempFile(files, texts);
58
59 Initializer initializer;
60 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
61 LSPAPI const *lspApi = GetImpl();
62
63 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
64 constexpr size_t offset = 14;
65 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
66 ASSERT_EQ(result, true);
67
68 initializer.DestroyContext(ctx);
69 }
70
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase3)71 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase3)
72 {
73 std::vector<std::string> files = {"get-safe-delete-info-case3.ets"};
74 std::vector<std::string> texts = {R"(
75 function setAlarmDefaultTime(alarmItem?: AlarmItem) {
76 let hour;
77 let minute;
78 })"};
79 auto filePaths = CreateTempFile(files, texts);
80
81 Initializer initializer;
82 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
83 LSPAPI const *lspApi = GetImpl();
84
85 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
86 constexpr size_t offset = 71;
87 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
88 ASSERT_EQ(result, true);
89
90 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
91 constexpr size_t offsetT2 = 89;
92 result = lspApi->getSafeDeleteInfo(ctx, offsetT2);
93 ASSERT_EQ(result, true);
94
95 initializer.DestroyContext(ctx);
96 }
97
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase4)98 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase4)
99 {
100 std::vector<std::string> files = {"get-safe-delete-info-namespace.ets"};
101 std::vector<std::string> texts = {R"(
102 namespace Foo {}
103 class Foo2 {}
104 )"};
105 auto filePaths = CreateTempFile(files, texts);
106
107 Initializer initializer;
108 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
109 LSPAPI const *lspApi = GetImpl();
110
111 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
112 constexpr size_t offset = 14;
113 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
114 ASSERT_EQ(result, false);
115
116 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
117 constexpr size_t offsetT2 = 31;
118 result = lspApi->getSafeDeleteInfo(ctx, offsetT2);
119 ASSERT_EQ(result, true);
120
121 initializer.DestroyContext(ctx);
122 }
123
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase5)124 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase5)
125 {
126 std::vector<std::string> files = {"get-safe-delete-info-typeparam.ets"};
127 std::vector<std::string> texts = {R"(
128 function foo<T>(a: T) { return a; }
129 )"};
130 auto filePaths = CreateTempFile(files, texts);
131
132 Initializer initializer;
133 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
134 LSPAPI const *lspApi = GetImpl();
135
136 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
137 constexpr size_t offset = 17;
138 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
139 ASSERT_EQ(result, false);
140
141 initializer.DestroyContext(ctx);
142 }
143
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase6)144 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase6)
145 {
146 std::vector<std::string> files = {"get-safe-delete-info-import.ets"};
147 std::vector<std::string> texts = {R"(import { foo } from "./mod";)"};
148 auto filePaths = CreateTempFile(files, texts);
149
150 Initializer initializer;
151 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
152 LSPAPI const *lspApi = GetImpl();
153
154 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
155 constexpr size_t offset = 9;
156 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
157 ASSERT_EQ(result, true);
158
159 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
160 constexpr size_t offsetT2 = 23;
161 result = lspApi->getSafeDeleteInfo(ctx, offsetT2);
162 ASSERT_EQ(result, true);
163
164 initializer.DestroyContext(ctx);
165 }
166
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase7)167 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase7)
168 {
169 std::vector<std::string> files = {"get-safe-delete-info-arrow.ets"};
170 std::vector<std::string> texts = {R"(
171 export const calcDistance = (time: number) => {
172 const ret = 0.5 * time * time;
173 return ret;
174 };
175 )"};
176 auto filePaths = CreateTempFile(files, texts);
177
178 Initializer initializer;
179 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
180 LSPAPI const *lspApi = GetImpl();
181
182 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
183 constexpr size_t offset = 28;
184 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
185 ASSERT_EQ(result, true);
186
187 initializer.DestroyContext(ctx);
188 }
189
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase8)190 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase8)
191 {
192 std::vector<std::string> files = {"get-safe-delete-info-interface.ets"};
193 std::vector<std::string> texts = {R"(
194 export interface VideoPlayer {
195 prepare(): Promise<void>;
196 }
197
198 function bar(parameter: VideoPlayer) {
199 parameter.prepare();
200 }
201 )"};
202 auto filePaths = CreateTempFile(files, texts);
203
204 Initializer initializer;
205 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
206 LSPAPI const *lspApi = GetImpl();
207
208 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
209 constexpr size_t offset = 31;
210 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
211 ASSERT_EQ(result, true);
212
213 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
214 constexpr size_t offsetT2 = 143;
215 result = lspApi->getSafeDeleteInfo(ctx, offsetT2);
216 ASSERT_EQ(result, true);
217
218 initializer.DestroyContext(ctx);
219 }
220
TEST_F(LspGetSafeDeleteInfoTest,GetSafeDeleteInfoCase9)221 TEST_F(LspGetSafeDeleteInfoTest, GetSafeDeleteInfoCase9)
222 {
223 std::vector<std::string> files = {"get-safe-delete-info-importdefault.ets"};
224 std::vector<std::string> texts = {R"(
225 import BuildProfile from 'BuildProfile';
226 BuildProfile.bundleName
227 )"};
228 auto filePaths = CreateTempFile(files, texts);
229
230 Initializer initializer;
231 es2panda_Context *ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED);
232 LSPAPI const *lspApi = GetImpl();
233
234 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
235 constexpr size_t offset = 15;
236 bool result = lspApi->getSafeDeleteInfo(ctx, offset);
237 ASSERT_EQ(result, true);
238
239 // NOLINTNEXTLINE(readability-identifier-naming,-warnings-as-errors)
240 constexpr size_t offsetT2 = 52;
241 result = lspApi->getSafeDeleteInfo(ctx, offsetT2);
242 ASSERT_EQ(result, true);
243
244 initializer.DestroyContext(ctx);
245 }
246 } // namespace
247