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 "ani_gtest.h"
17
18 // NOLINTBEGIN(cppcoreguidelines-pro-type-vararg)
19 namespace ark::ets::ani::testing {
20
21 class ReferenceEqualsTest : public AniTest {
22 public:
GetMethodData(ani_ref * objectRef,ani_ref * methodRef,const char * className,const char * newClassName,const char * signature)23 void GetMethodData(ani_ref *objectRef, ani_ref *methodRef, const char *className, const char *newClassName,
24 const char *signature)
25 {
26 ani_class cls {};
27 // Locate the class in the environment.
28 ASSERT_EQ(env_->FindClass(className, &cls), ANI_OK);
29 ASSERT_NE(cls, nullptr);
30
31 // Emulate allocation an instance of class.
32 ani_static_method newMethod {};
33 ASSERT_EQ(env_->Class_FindStaticMethod(cls, newClassName, signature, &newMethod), ANI_OK);
34 ASSERT_EQ(env_->Class_CallStaticMethod_Ref(cls, newMethod, objectRef), ANI_OK);
35
36 const char *methodSignature = "Lstd/core/String;Lstd/core/String;:Lstd/core/String;";
37 ani_method concat {};
38 ASSERT_EQ(env_->Class_FindMethod(cls, "concat", methodSignature, &concat), ANI_OK);
39 ASSERT_NE(concat, nullptr);
40
41 ani_string s0 {};
42 ASSERT_EQ(env_->String_NewUTF8("abc", 3U, &s0), ANI_OK);
43 ani_string s1 {};
44 ASSERT_EQ(env_->String_NewUTF8("def", 3U, &s1), ANI_OK);
45
46 ASSERT_EQ(env_->Object_CallMethod_Ref(static_cast<ani_object>(*objectRef), concat, methodRef, s0, s1), ANI_OK);
47 }
48
49 static constexpr int32_t LOOP_COUNT = 3;
50 };
51
TEST_F(ReferenceEqualsTest,check_null_and_null)52 TEST_F(ReferenceEqualsTest, check_null_and_null)
53 {
54 auto nullRef1 = CallEtsFunction<ani_ref>("reference_equals_test", "GetNull");
55 auto nullRef2 = CallEtsFunction<ani_ref>("reference_equals_test", "GetNull");
56 ani_boolean isEquals = ANI_FALSE;
57 ASSERT_EQ(env_->Reference_Equals(nullRef1, nullRef2, &isEquals), ANI_OK);
58 ASSERT_EQ(isEquals, ANI_TRUE);
59 }
60
TEST_F(ReferenceEqualsTest,check_null_and_undefined)61 TEST_F(ReferenceEqualsTest, check_null_and_undefined)
62 {
63 auto nullRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetNull");
64 auto undefinedRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetUndefined");
65 ani_boolean isEquals = ANI_FALSE;
66 ASSERT_EQ(env_->Reference_Equals(nullRef, undefinedRef, &isEquals), ANI_OK);
67 ASSERT_EQ(isEquals, ANI_TRUE);
68 }
69
TEST_F(ReferenceEqualsTest,check_null_and_object)70 TEST_F(ReferenceEqualsTest, check_null_and_object)
71 {
72 auto nullRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetNull");
73 auto objectRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
74 ani_boolean isEquals = ANI_TRUE;
75 ASSERT_EQ(env_->Reference_Equals(nullRef, objectRef, &isEquals), ANI_OK);
76 ASSERT_EQ(isEquals, ANI_FALSE);
77 }
78
TEST_F(ReferenceEqualsTest,check_undefined_and_undefined)79 TEST_F(ReferenceEqualsTest, check_undefined_and_undefined)
80 {
81 auto undefinedRef1 = CallEtsFunction<ani_ref>("reference_equals_test", "GetUndefined");
82 auto undefinedRef2 = CallEtsFunction<ani_ref>("reference_equals_test", "GetUndefined");
83 ani_boolean isEquals = ANI_FALSE;
84 ASSERT_EQ(env_->Reference_Equals(undefinedRef1, undefinedRef2, &isEquals), ANI_OK);
85 ASSERT_EQ(isEquals, ANI_TRUE);
86 }
87
TEST_F(ReferenceEqualsTest,check_undefined_and_object)88 TEST_F(ReferenceEqualsTest, check_undefined_and_object)
89 {
90 auto undefinedRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetUndefined");
91 auto objectRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
92 ani_boolean isEquals = ANI_TRUE;
93 ASSERT_EQ(env_->Reference_Equals(undefinedRef, objectRef, &isEquals), ANI_OK);
94 ASSERT_EQ(isEquals, ANI_FALSE);
95 }
96
TEST_F(ReferenceEqualsTest,check_object_and_object)97 TEST_F(ReferenceEqualsTest, check_object_and_object)
98 {
99 auto objectRef1 = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
100 auto objectRef2 = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
101 ani_boolean isEquals = ANI_FALSE;
102 ASSERT_EQ(env_->Reference_Equals(objectRef1, objectRef2, &isEquals), ANI_OK);
103 ASSERT_EQ(isEquals, ANI_TRUE);
104 }
105
TEST_F(ReferenceEqualsTest,invalid_argument)106 TEST_F(ReferenceEqualsTest, invalid_argument)
107 {
108 auto ref = CallEtsFunction<ani_ref>("reference_equals_test", "GetNull");
109 ASSERT_EQ(env_->Reference_Equals(ref, ref, nullptr), ANI_INVALID_ARGS);
110 ani_boolean isEquals = ANI_FALSE;
111 ASSERT_EQ(env_->c_api->Reference_Equals(nullptr, ref, ref, &isEquals), ANI_INVALID_ARGS);
112 }
113
TEST_F(ReferenceEqualsTest,check_custom_object)114 TEST_F(ReferenceEqualsTest, check_custom_object)
115 {
116 auto packRef1 = CallEtsFunction<ani_ref>("reference_equals_test", "newPackObject");
117 auto packRef2 = CallEtsFunction<ani_ref>("reference_equals_test", "newPackObject");
118 ani_boolean isEquals = ANI_TRUE;
119 ASSERT_EQ(env_->Reference_Equals(packRef1, packRef2, &isEquals), ANI_OK);
120 ASSERT_EQ(isEquals, ANI_FALSE);
121 }
122
TEST_F(ReferenceEqualsTest,check_custom_and_string)123 TEST_F(ReferenceEqualsTest, check_custom_and_string)
124 {
125 auto packRef = CallEtsFunction<ani_ref>("reference_equals_test", "newPackObject");
126 auto objectRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
127 ani_boolean isEquals = ANI_TRUE;
128 ASSERT_EQ(env_->Reference_Equals(packRef, objectRef, &isEquals), ANI_OK);
129 ASSERT_EQ(isEquals, ANI_FALSE);
130 }
131
TEST_F(ReferenceEqualsTest,check_reference_equals_loop)132 TEST_F(ReferenceEqualsTest, check_reference_equals_loop)
133 {
134 for (int32_t i = 0; i < LOOP_COUNT; i++) {
135 auto objectRef1 = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
136 auto objectRef2 = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
137 ani_boolean isEquals = ANI_FALSE;
138 ASSERT_EQ(env_->Reference_Equals(objectRef1, objectRef2, &isEquals), ANI_OK);
139 ASSERT_EQ(isEquals, ANI_TRUE);
140
141 auto packRef = CallEtsFunction<ani_ref>("reference_equals_test", "newPackObject");
142 auto objectRef = CallEtsFunction<ani_ref>("reference_equals_test", "GetObject");
143 ASSERT_EQ(env_->Reference_Equals(packRef, objectRef, &isEquals), ANI_OK);
144 ASSERT_EQ(isEquals, ANI_FALSE);
145 }
146 }
147
TEST_F(ReferenceEqualsTest,check_object_and_method)148 TEST_F(ReferenceEqualsTest, check_object_and_method)
149 {
150 ani_ref objectARef = nullptr;
151 ani_ref methodARef = nullptr;
152 GetMethodData(&objectARef, &methodARef, "Lreference_equals_test/A;", "new_A", ":Lreference_equals_test/A;");
153
154 ani_ref objectBRef = nullptr;
155 ani_ref methodBRef = nullptr;
156 GetMethodData(&objectBRef, &methodBRef, "Lreference_equals_test/B;", "new_B", ":Lreference_equals_test/B;");
157
158 ani_boolean isEquals = ANI_TRUE;
159 ASSERT_EQ(env_->Reference_Equals(objectARef, objectBRef, &isEquals), ANI_OK);
160 ASSERT_EQ(isEquals, ANI_FALSE);
161
162 ASSERT_EQ(env_->Reference_Equals(methodARef, methodBRef, &isEquals), ANI_OK);
163 ASSERT_EQ(isEquals, ANI_FALSE);
164 }
165
TEST_F(ReferenceEqualsTest,check_nullptr)166 TEST_F(ReferenceEqualsTest, check_nullptr)
167 {
168 ani_boolean isEquals = ANI_FALSE;
169 ani_ref undefinedRef1;
170 ASSERT_EQ(env_->GetUndefined(&undefinedRef1), ANI_OK);
171
172 ani_ref undefinedRef2;
173 ASSERT_EQ(env_->GetUndefined(&undefinedRef2), ANI_OK);
174
175 ASSERT_EQ(env_->Reference_Equals(undefinedRef1, undefinedRef2, &isEquals), ANI_OK);
176 ASSERT_EQ(isEquals, ANI_TRUE);
177
178 auto ref = CallEtsFunction<ani_ref>("reference_equals_test", "GetNull");
179 ASSERT_EQ(env_->Reference_Equals(ref, undefinedRef2, &isEquals), ANI_OK);
180 ASSERT_EQ(isEquals, ANI_TRUE);
181
182 ASSERT_EQ(env_->Reference_Equals(undefinedRef1, ref, &isEquals), ANI_OK);
183 ASSERT_EQ(isEquals, ANI_TRUE);
184 }
185 } // namespace ark::ets::ani::testing
186
187 // NOLINTEND(cppcoreguidelines-pro-type-vararg)