1 /**
2 * Copyright (c) 2024-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 "libabckit/include/c/isa/isa_static.h"
17 #include "libabckit/include/c/metadata_core.h"
18 #include "libabckit/include/c/ir_core.h"
19 #include "libabckit/include/c/isa/isa_dynamic.h"
20 #include "libabckit/include/c/abckit.h"
21
22 #include "helpers/helpers.h"
23 #include "helpers/helpers_runtime.h"
24 #include "libabckit/include/c/statuses.h"
25
26 #include <gtest/gtest.h>
27
28 // NOLINTBEGIN(readability-magic-numbers)
29 namespace libabckit::test {
30
31 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33 static auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
34 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
35 static auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
36
37 class LibAbcKitCreateDynDefineFieldRuntime : public ::testing::Test {};
38
39 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeDefinefieldbyvalue, abc-kind=ArkTS1, category=positive,
40 // extension=c
TEST_F(LibAbcKitCreateDynDefineFieldRuntime,IcreateCallruntimeDefinefieldbyvalue_1)41 TEST_F(LibAbcKitCreateDynDefineFieldRuntime, IcreateCallruntimeDefinefieldbyvalue_1)
42 {
43 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
44 "definefieldruntime_dynamic");
45 EXPECT_TRUE(helpers::Match(output, "undefined\nundefined\nundefined\nundefined\n"));
46
47 auto cb = [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
48 auto *obj = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER);
49
50 // CC-OFFNXT(G.FMT.02)
51 auto *keyStr = g_implM->createString(file, "key3", strlen("key3"));
52 auto *key = g_dynG->iCreateLoadString(graph, keyStr);
53
54 auto *valStr = g_implM->createString(file, "val3", strlen("val3"));
55 auto *val = g_dynG->iCreateLoadString(graph, valStr);
56
57 auto *field = g_dynG->iCreateCallruntimeDefinefieldbyvalue(graph, val, key, obj);
58
59 g_implG->iInsertAfter(field, obj);
60 g_implG->iInsertAfter(key, obj);
61 g_implG->iInsertAfter(val, obj);
62 };
63
64 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
65 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
66 "func_main_0", cb);
67
68 output =
69 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
70 "definefieldruntime_dynamic");
71 EXPECT_TRUE(helpers::Match(output, "val3\nundefined\nundefined\nundefined\n"));
72 }
73
74 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeDefinefieldbyvalue, abc-kind=ArkTS1, category=positive,
75 // extension=c
TEST_F(LibAbcKitCreateDynDefineFieldRuntime,IcreateCallruntimeDefinefieldbyvalue_2)76 TEST_F(LibAbcKitCreateDynDefineFieldRuntime, IcreateCallruntimeDefinefieldbyvalue_2)
77 {
78 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
79 "definefieldruntime_dynamic");
80 EXPECT_TRUE(helpers::Match(output, "undefined\nundefined\nundefined\nundefined\n"));
81
82 auto cb = [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
83 auto *obj = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEARRAYWITHBUFFER);
84 // CC-OFFNXT(G.FMT.02)
85 auto *keyStr = g_implM->createString(file, "key3", strlen("key3"));
86 auto *key = g_dynG->iCreateLoadString(graph, keyStr);
87
88 auto *valStr = g_implM->createString(file, "val3", strlen("val3"));
89 auto *val = g_dynG->iCreateLoadString(graph, valStr);
90
91 auto *field = g_dynG->iCreateCallruntimeDefinefieldbyvalue(graph, val, key, obj);
92
93 g_implG->iInsertAfter(field, obj);
94 g_implG->iInsertAfter(key, obj);
95 g_implG->iInsertAfter(val, obj);
96 };
97
98 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
99 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
100 "func_main_0", cb);
101
102 output =
103 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
104 "definefieldruntime_dynamic");
105 EXPECT_TRUE(helpers::Match(output, "undefined\nval3\nundefined\nundefined\n"));
106 }
107
108 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeDefinefieldbyindex, abc-kind=ArkTS1, category=positive,
109 // extension=c
TEST_F(LibAbcKitCreateDynDefineFieldRuntime,IcreateCallruntimeDefinefieldbyindex_1)110 TEST_F(LibAbcKitCreateDynDefineFieldRuntime, IcreateCallruntimeDefinefieldbyindex_1)
111 {
112 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
113 "definefieldruntime_dynamic");
114 EXPECT_TRUE(helpers::Match(output, "undefined\nundefined\nundefined\nundefined\n"));
115
116 auto cb = [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
117 auto *obj = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER);
118 // CC-OFFNXT(G.FMT.02)
119 auto *valStr = g_implM->createString(file, "val3", strlen("val3"));
120 auto *val = g_dynG->iCreateLoadString(graph, valStr);
121
122 auto *field = g_dynG->iCreateCallruntimeDefinefieldbyindex(graph, val, 0x4, obj);
123
124 g_implG->iInsertAfter(field, obj);
125 g_implG->iInsertAfter(val, obj);
126 };
127
128 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
129 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
130 "func_main_0", cb);
131
132 output =
133 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
134 "definefieldruntime_dynamic");
135 EXPECT_TRUE(helpers::Match(output, "undefined\nundefined\nval3\nundefined\n"));
136 }
137
138 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeDefinefieldbyindex, abc-kind=ArkTS1, category=positive,
139 // extension=c
TEST_F(LibAbcKitCreateDynDefineFieldRuntime,IcreateCallruntimeDefinefieldbyindex_2)140 TEST_F(LibAbcKitCreateDynDefineFieldRuntime, IcreateCallruntimeDefinefieldbyindex_2)
141 {
142 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
143 "definefieldruntime_dynamic");
144 EXPECT_TRUE(helpers::Match(output, "undefined\nundefined\nundefined\nundefined\n"));
145
146 auto cb = [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
147 auto *obj = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEARRAYWITHBUFFER);
148
149 auto *valStr = g_implM->createString(file, "val3", strlen("val3"));
150 auto *val = g_dynG->iCreateLoadString(graph, valStr);
151
152 auto *field = g_dynG->iCreateCallruntimeDefinefieldbyindex(graph, val, 0x4, obj);
153
154 g_implG->iInsertAfter(field, obj);
155 g_implG->iInsertAfter(val, obj);
156 };
157
158 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic.abc",
159 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
160 "func_main_0", cb);
161
162 output =
163 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/define/definefieldruntime_dynamic_modified.abc",
164 "definefieldruntime_dynamic");
165 EXPECT_TRUE(helpers::Match(output, "undefined\nundefined\nundefined\nval3\n"));
166 }
167
168 } // namespace libabckit::test
169 // NOLINTEND(readability-magic-numbers)
170