• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 #ifndef ABCKIT_CPP_HELPERS_MOCK
17 #define ABCKIT_CPP_HELPERS_MOCK
18 
19 #include <string>
20 #include "../../include/cpp/abckit_cpp.h"
21 #include "check_mock.h"
22 #include "include/cpp/headers/value.h"
23 #include "include/cpp/headers/arkts/annotation.h"
24 #include "include/cpp/headers/arkts/annotation_interface.h"
25 #include "include/cpp/headers/arkts/annotation_interface_field.h"
26 #include "include/cpp/headers/arkts/class.h"
27 #include "include/cpp/headers/arkts/function.h"
28 #include "include/cpp/headers/core/annotation_element.h"
29 #include "include/cpp/headers/core/annotation_interface_field.h"
30 #include "mock/mock_values.h"
31 
32 #include <gtest/gtest.h>
33 
34 namespace abckit::mock::helpers {
35 
36 // NOLINTBEGIN(performance-unnecessary-value-param)
37 
GetMockCoreModule(const abckit::File & file)38 inline abckit::core::Module GetMockCoreModule(const abckit::File &file)
39 {
40     std::vector<abckit::core::Module> modules;
41 
42     file.EnumerateModules([&modules](abckit::core::Module md) -> bool {
43         modules.push_back(md);
44         return true;
45     });
46 
47     EXPECT_TRUE(CheckMockedApi("FileEnumerateModules"));
48 
49     return modules.front();
50 }
51 
GetMockArktsModule(const abckit::File & file)52 inline abckit::arkts::Module GetMockArktsModule(const abckit::File &file)
53 {
54     auto m = abckit::arkts::Module(GetMockCoreModule(file));
55     EXPECT_TRUE(CheckMockedApi("CoreModuleToArktsModule"));
56     return m;
57 }
58 
GetMockCoreNamespace(const abckit::File & file)59 inline abckit::core::Namespace GetMockCoreNamespace(const abckit::File &file)
60 {
61     std::vector<abckit::core::Namespace> namespaces;
62     abckit::core::Module mod = GetMockCoreModule(file);
63 
64     mod.EnumerateNamespaces([&namespaces](abckit::core::Namespace n) -> bool {
65         namespaces.push_back(n);
66         return true;
67     });
68 
69     EXPECT_TRUE(CheckMockedApi("ModuleEnumerateNamespaces"));
70     return namespaces.front();
71 }
72 
GetMockArktsNamespace(const abckit::File & file)73 inline abckit::arkts::Namespace GetMockArktsNamespace(const abckit::File &file)
74 {
75     auto n = abckit::arkts::Namespace(GetMockCoreNamespace(file));
76     EXPECT_TRUE(CheckMockedApi("CoreNamespaceToArktsNamespace"));
77     return n;
78 }
79 
GetMockCoreClass(const abckit::File & file)80 inline abckit::core::Class GetMockCoreClass(const abckit::File &file)
81 {
82     abckit::core::Module cmd = GetMockCoreModule(file);
83 
84     std::vector<abckit::core::Class> classes;
85 
86     cmd.EnumerateClasses([&classes](abckit::core::Class cls) -> bool {
87         classes.push_back(cls);
88         return true;
89     });
90 
91     EXPECT_TRUE(CheckMockedApi("ModuleEnumerateClasses"));
92 
93     return classes.front();
94 }
95 
GetMockArktsClass(const abckit::File & file)96 inline abckit::arkts::Class GetMockArktsClass(const abckit::File &file)
97 {
98     auto c = abckit::arkts::Class(GetMockCoreClass(file));
99     EXPECT_TRUE(CheckMockedApi("CoreClassToArktsClass"));
100     return c;
101 }
102 
GetMockCoreFunction(const abckit::File & file)103 inline abckit::core::Function GetMockCoreFunction(const abckit::File &file)
104 {
105     abckit::core::Class cls = GetMockCoreClass(file);
106     std::vector<abckit::core::Function> funcs;
107 
108     cls.EnumerateMethods([&](abckit::core::Function md) -> bool {
109         funcs.push_back(md);
110         return true;
111     });
112 
113     EXPECT_TRUE(CheckMockedApi("ClassEnumerateMethods"));
114 
115     return funcs.front();
116 }
117 
GetMockArktsFunction(const abckit::File & file)118 inline abckit::arkts::Function GetMockArktsFunction(const abckit::File &file)
119 {
120     auto f = abckit::arkts::Function(GetMockCoreFunction(file));
121     EXPECT_TRUE(CheckMockedApi("CoreFunctionToArktsFunction"));
122     return f;
123 }
124 
GetMockCoreAnnotation(const abckit::File & file)125 inline abckit::core::Annotation GetMockCoreAnnotation(const abckit::File &file)
126 {
127     abckit::core::Function func = GetMockCoreFunction(file);
128     std::vector<abckit::core::Annotation> anns;
129 
130     func.EnumerateAnnotations([&](abckit::core::Annotation an) -> bool {
131         anns.push_back(an);
132         return true;
133     });
134 
135     EXPECT_TRUE(CheckMockedApi("FunctionEnumerateAnnotations"));
136 
137     return anns.front();
138 }
139 
GetMockArktsAnnotation(const abckit::File & file)140 inline abckit::arkts::Annotation GetMockArktsAnnotation(const abckit::File &file)
141 {
142     auto a = abckit::arkts::Annotation(GetMockCoreAnnotation(file));
143     EXPECT_TRUE(CheckMockedApi("CoreAnnotationToArktsAnnotation"));
144     return a;
145 }
146 
GetMockGraph(const abckit::File & file)147 inline abckit::Graph GetMockGraph(const abckit::File &file)
148 {
149     abckit::core::Function func = GetMockCoreFunction(file);
150     abckit::Graph graph = func.CreateGraph();
151     EXPECT_TRUE(CheckMockedApi("CreateGraphFromFunction"));
152     // Utilization of NRVO, no dtor
153     return graph;
154 }
155 
GetMockBasicBlock(const abckit::File & file)156 inline abckit::BasicBlock GetMockBasicBlock(const abckit::File &file)
157 {
158     abckit::BasicBlock bb = GetMockGraph(file).GetStartBb();
159     EXPECT_TRUE(CheckMockedApi("DestroyGraph"));
160     EXPECT_TRUE(CheckMockedApi("GgetStartBasicBlock"));
161     // NOLINTNEXTLINE(clang-analyzer-core.StackAddressEscape)
162     return bb;
163 }
164 
GetMockInstruction(const abckit::File & file)165 inline abckit::Instruction GetMockInstruction(const abckit::File &file)
166 {
167     abckit::BasicBlock bb = GetMockBasicBlock(file);
168     abckit::Instruction instr = bb.GetFirstInst();
169     EXPECT_TRUE(CheckMockedApi("BBGetFirstInst"));
170     return instr;
171 }
172 
GetMockCoreImportDescriptor(const abckit::File & file)173 inline abckit::core::ImportDescriptor GetMockCoreImportDescriptor(const abckit::File &file)
174 {
175     abckit::core::ImportDescriptor id = GetMockGraph(file).DynIsa().GetImportDescriptor(GetMockInstruction(file));
176     EXPECT_TRUE(CheckMockedApi("DestroyGraph"));
177     EXPECT_TRUE(CheckMockedApi("IgetImportDescriptor"));
178     return id;
179 }
180 
GetMockArktsImportDescriptor(const abckit::File & file)181 inline abckit::arkts::ImportDescriptor GetMockArktsImportDescriptor(const abckit::File &file)
182 {
183     auto id = abckit::arkts::ImportDescriptor(GetMockCoreImportDescriptor(file));
184     EXPECT_TRUE(CheckMockedApi("CoreImportDescriptorToArktsImportDescriptor"));
185     return id;
186 }
187 
GetMockCoreExportDescriptor(const abckit::File & file)188 inline abckit::core::ExportDescriptor GetMockCoreExportDescriptor(const abckit::File &file)
189 {
190     abckit::core::ExportDescriptor ed = GetMockGraph(file).DynIsa().GetExportDescriptor(GetMockInstruction(file));
191     EXPECT_TRUE(CheckMockedApi("DestroyGraph"));
192     EXPECT_TRUE(CheckMockedApi("IgetExportDescriptor"));
193     return ed;
194 }
195 
GetMockArktsExportDescriptor(const abckit::File & file)196 inline abckit::arkts::ExportDescriptor GetMockArktsExportDescriptor(const abckit::File &file)
197 {
198     auto ed = abckit::arkts::ExportDescriptor(GetMockCoreExportDescriptor(file));
199     EXPECT_TRUE(CheckMockedApi("CoreExportDescriptorToArktsExportDescriptor"));
200     return ed;
201 }
202 
GetMockLiteralArray(const abckit::File & file)203 inline abckit::LiteralArray GetMockLiteralArray(const abckit::File &file)
204 {
205     abckit::LiteralArray litarr = GetMockInstruction(file).GetLiteralArray();
206     EXPECT_TRUE(CheckMockedApi("IgetLiteralArray"));
207     return litarr;
208 }
209 
GetMockType(const abckit::File & file)210 inline abckit::Type GetMockType(const abckit::File &file)
211 {
212     abckit::Type t = file.CreateType(DEFAULT_TYPE_ID);
213     EXPECT_TRUE(CheckMockedApi("CreateType"));
214     return t;
215 }
216 
GetMockValueString(const abckit::File & file)217 inline abckit::Value GetMockValueString(const abckit::File &file)
218 {
219     abckit::Value val = file.CreateValueString(DEFAULT_CONST_CHAR);
220     EXPECT_TRUE(CheckMockedApi("CreateValueString"));
221     return val;
222 }
223 
GetMockValueDouble(const abckit::File & file)224 inline abckit::Value GetMockValueDouble(const abckit::File &file)
225 {
226     abckit::Value val = file.CreateValueDouble(DEFAULT_DOUBLE);
227     EXPECT_TRUE(CheckMockedApi("CreateValueDouble"));
228     return val;
229 }
230 
GetMockValueU1(const abckit::File & file)231 inline abckit::Value GetMockValueU1(const abckit::File &file)
232 {
233     abckit::Value val = file.CreateValueU1(DEFAULT_BOOL);
234     EXPECT_TRUE(CheckMockedApi("CreateValueU1"));
235     return val;
236 }
237 
GetMockValueLiteralArray(const abckit::File & file)238 inline abckit::Value GetMockValueLiteralArray(const abckit::File &file)
239 {
240     abckit::Value v = file.CreateValueU1(DEFAULT_BOOL);
241     std::vector<abckit::Value> arr = {v};
242     abckit::Value litArr = file.CreateLiteralArrayValue({arr}, 1);
243     EXPECT_TRUE(CheckMockedApi("CreateLiteralArrayValue"));
244     return litArr;
245 }
246 
GetMockLiteral(const abckit::File & file)247 inline abckit::Literal GetMockLiteral(const abckit::File &file)
248 {
249     abckit::Literal lit = file.CreateLiteralBool(DEFAULT_BOOL);
250     EXPECT_TRUE(CheckMockedApi("CreateLiteralBool"));
251     return lit;
252 }
253 
GetMockLiteralLiteralArray(const abckit::File & file)254 inline abckit::Literal GetMockLiteralLiteralArray(const abckit::File &file)
255 {
256     abckit::LiteralArray litArr = GetMockLiteralArray(file);
257     abckit::Literal arr = file.CreateLiteralLiteralArray(litArr);
258     EXPECT_TRUE(CheckMockedApi("CreateLiteralLiteralArray"));
259     return arr;
260 }
261 
GetMockLiteralBool(const abckit::File & file)262 inline abckit::Literal GetMockLiteralBool(const abckit::File &file)
263 {
264     abckit::Literal lit = file.CreateLiteralBool(DEFAULT_BOOL);
265     EXPECT_TRUE(CheckMockedApi("CreateLiteralBool"));
266     return lit;
267 }
268 
GetMockLiteralU8(const abckit::File & file)269 inline abckit::Literal GetMockLiteralU8(const abckit::File &file)
270 {
271     abckit::Literal lit = file.CreateLiteralU8(DEFAULT_U8);
272     EXPECT_TRUE(CheckMockedApi("CreateLiteralU8"));
273     return lit;
274 }
275 
GetMockLiteralU16(const abckit::File & file)276 inline abckit::Literal GetMockLiteralU16(const abckit::File &file)
277 {
278     abckit::Literal lit = file.CreateLiteralU16(DEFAULT_U16);
279     EXPECT_TRUE(CheckMockedApi("CreateLiteralU16"));
280     return lit;
281 }
282 
GetMockLiteralU32(const abckit::File & file)283 inline abckit::Literal GetMockLiteralU32(const abckit::File &file)
284 {
285     abckit::Literal lit = file.CreateLiteralU32(DEFAULT_U32);
286     EXPECT_TRUE(CheckMockedApi("CreateLiteralU32"));
287     return lit;
288 }
289 
GetMockLiteralU64(const abckit::File & file)290 inline abckit::Literal GetMockLiteralU64(const abckit::File &file)
291 {
292     abckit::Literal lit = file.CreateLiteralU64(DEFAULT_U64);
293     EXPECT_TRUE(CheckMockedApi("CreateLiteralU64"));
294     return lit;
295 }
296 
GetMockLiteralFloat(const abckit::File & file)297 inline abckit::Literal GetMockLiteralFloat(const abckit::File &file)
298 {
299     abckit::Literal lit = file.CreateLiteralFloat(DEFAULT_FLOAT);
300     EXPECT_TRUE(CheckMockedApi("CreateLiteralFloat"));
301     return lit;
302 }
303 
GetMockLiteralDouble(const abckit::File & file)304 inline abckit::Literal GetMockLiteralDouble(const abckit::File &file)
305 {
306     abckit::Literal lit = file.CreateLiteralDouble(DEFAULT_DOUBLE);
307     EXPECT_TRUE(CheckMockedApi("CreateLiteralDouble"));
308     return lit;
309 }
310 
GetMockLiteralString(const abckit::File & file)311 inline abckit::Literal GetMockLiteralString(const abckit::File &file)
312 {
313     abckit::Literal lit = file.CreateLiteralString(DEFAULT_CONST_CHAR);
314     EXPECT_TRUE(CheckMockedApi("CreateLiteralString"));
315     return lit;
316 }
317 
GetMockLiteralMethodAffiliate(const abckit::File & file)318 inline abckit::Literal GetMockLiteralMethodAffiliate(const abckit::File &file)
319 {
320     abckit::Literal lit = file.CreateLiteralMethodAffiliate(DEFAULT_U16);
321     EXPECT_TRUE(CheckMockedApi("CreateLiteralMethodAffiliate"));
322     return lit;
323 }
324 
GetMockCoreAnnotationElement(const abckit::File & file)325 inline abckit::core::AnnotationElement GetMockCoreAnnotationElement(const abckit::File &file)
326 {
327     abckit::core::Annotation ann = GetMockCoreAnnotation(file);
328     std::vector<abckit::core::AnnotationElement> annElems;
329 
330     ann.EnumerateElements([&](abckit::core::AnnotationElement elem) -> bool {
331         annElems.push_back(elem);
332         return true;
333     });
334 
335     EXPECT_TRUE(CheckMockedApi("AnnotationEnumerateElements"));
336 
337     return annElems.front();
338 }
339 
GetMockArktsAnnotationElement(const abckit::File & file)340 inline abckit::arkts::AnnotationElement GetMockArktsAnnotationElement(const abckit::File &file)
341 {
342     auto ae = abckit::arkts::AnnotationElement(GetMockCoreAnnotationElement(file));
343     EXPECT_TRUE(CheckMockedApi("CoreAnnotationElementToArktsAnnotationElement"));
344     return ae;
345 }
346 
GetMockCoreAnnotationInterface(const abckit::File & file)347 inline abckit::core::AnnotationInterface GetMockCoreAnnotationInterface(const abckit::File &file)
348 {
349     abckit::core::Annotation ann = GetMockCoreAnnotation(file);
350     abckit::core::AnnotationInterface ai = ann.GetInterface();
351     EXPECT_TRUE(CheckMockedApi("AnnotationGetInterface"));
352 
353     return ai;
354 }
355 
GetMockArktsAnnotationInterface(const abckit::File & file)356 inline abckit::arkts::AnnotationInterface GetMockArktsAnnotationInterface(const abckit::File &file)
357 {
358     auto ai = abckit::arkts::AnnotationInterface(GetMockCoreAnnotationInterface(file));
359     EXPECT_TRUE(CheckMockedApi("CoreAnnotationInterfaceToArktsAnnotationInterface"));
360     return ai;
361 }
362 
GetMockCoreAnnotationInterfaceField(const abckit::File & file)363 inline abckit::core::AnnotationInterfaceField GetMockCoreAnnotationInterfaceField(const abckit::File &file)
364 {
365     abckit::core::AnnotationInterface ai = GetMockCoreAnnotationInterface(file);
366     std::vector<abckit::core::AnnotationInterfaceField> fields;
367     ai.EnumerateFields([&](abckit::core::AnnotationInterfaceField field) -> bool {
368         fields.push_back(field);
369         return true;
370     });
371     EXPECT_TRUE(CheckMockedApi("AnnotationInterfaceEnumerateFields"));
372 
373     return fields.front();
374 }
375 
GetMockArktsAnnotationInterfaceField(const abckit::File & file)376 inline abckit::arkts::AnnotationInterfaceField GetMockArktsAnnotationInterfaceField(const abckit::File &file)
377 {
378     auto aif = abckit::arkts::AnnotationInterfaceField(GetMockCoreAnnotationInterfaceField(file));
379     EXPECT_TRUE(CheckMockedApi("CoreAnnotationInterfaceFieldToArktsAnnotationInterfaceField"));
380     return aif;
381 }
382 
383 // NOLINTEND(performance-unnecessary-value-param)
384 
385 }  // namespace abckit::mock::helpers
386 
387 #endif  // ABCKIT_CPP_HELPERS_MOCK
388