• 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 "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)