• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "test.h"
17 #include "gtest/gtest.h"
18 #include "napi/native_api.h"
19 #include "napi/native_node_api.h"
20 #include "securec.h"
21 #include "utils/log.h"
22 
23 class NapiBasicTest : public NativeEngineTest {
24 public:
SetUpTestCase()25     static void SetUpTestCase()
26     {
27         GTEST_LOG_(INFO) << "NapiBasicTest SetUpTestCase";
28     }
29 
TearDownTestCase()30     static void TearDownTestCase()
31     {
32         GTEST_LOG_(INFO) << "NapiBasicTest TearDownTestCase";
33     }
34 
SetUp()35     void SetUp() override {}
TearDown()36     void TearDown() override {}
37 };
38 
39 /**
40  * @tc.name: UndefinedTest001
41  * @tc.desc: Test undefined type.
42  * @tc.type: FUNC
43  */
44 HWTEST_F(NapiBasicTest, UndefinedTest001, testing::ext::TestSize.Level1)
45 {
46     napi_env env = (napi_env)engine_;
47     napi_value result = nullptr;
48     ASSERT_CHECK_CALL(napi_get_undefined(env, &result));
49     ASSERT_CHECK_VALUE_TYPE(env, result, napi_undefined);
50 }
51 
52 /**
53  * @tc.name: NullTest001
54  * @tc.desc: Test null type.
55  * @tc.type: FUNC
56  */
57 HWTEST_F(NapiBasicTest, NullTest001, testing::ext::TestSize.Level1)
58 {
59     napi_env env = (napi_env)engine_;
60     napi_value result = nullptr;
61     ASSERT_CHECK_CALL(napi_get_null(env, &result));
62     ASSERT_CHECK_VALUE_TYPE(env, result, napi_null);
63 }
64 
65 /**
66  * @tc.name: BooleanTest001
67  * @tc.desc: Test boolean type.
68  * @tc.type: FUNC
69  */
70 HWTEST_F(NapiBasicTest, BooleanTest001, testing::ext::TestSize.Level1)
71 {
72     napi_env env = (napi_env)engine_;
73     napi_value result = nullptr;
74     ASSERT_CHECK_CALL(napi_get_boolean(env, true, &result));
75     ASSERT_CHECK_VALUE_TYPE(env, result, napi_boolean);
76 
77     bool resultValue = false;
78     ASSERT_CHECK_CALL(napi_get_value_bool(env, result, &resultValue));
79     ASSERT_TRUE(resultValue);
80 }
81 
82 /**
83  * @tc.name: NumberTest001
84  * @tc.desc: Test number type.
85  * @tc.type: FUNC
86  */
87 HWTEST_F(NapiBasicTest, NumberTest001, testing::ext::TestSize.Level1)
88 {
89     napi_env env = (napi_env)engine_;
90     {
91         int32_t testValue = INT32_MAX;
92         napi_value result = nullptr;
93         ASSERT_CHECK_CALL(napi_create_int32(env, testValue, &result));
94         ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
95 
96         int32_t resultValue = 0;
97         ASSERT_CHECK_CALL(napi_get_value_int32(env, result, &resultValue));
98         ASSERT_EQ(resultValue, INT32_MAX);
99     }
100     {
101         uint32_t testValue = UINT32_MAX;
102         napi_value result = nullptr;
103         ASSERT_CHECK_CALL(napi_create_uint32(env, testValue, &result));
104         ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
105 
106         uint32_t resultValue = 0;
107         ASSERT_CHECK_CALL(napi_get_value_uint32(env, result, &resultValue));
108         ASSERT_EQ(resultValue, UINT32_MAX);
109     }
110     {
111         int64_t testValue = 9007199254740991;
112         napi_value result = nullptr;
113         ASSERT_CHECK_CALL(napi_create_int64(env, testValue, &result));
114         ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
115 
116         int64_t resultValue = 0;
117         ASSERT_CHECK_CALL(napi_get_value_int64(env, result, &resultValue));
118         ASSERT_EQ(resultValue, testValue);
119     }
120     {
121         double testValue = DBL_MAX;
122         napi_value result = nullptr;
123         ASSERT_CHECK_CALL(napi_create_double(env, testValue, &result));
124         ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
125 
126         double resultValue = 0;
127         ASSERT_CHECK_CALL(napi_get_value_double(env, result, &resultValue));
128         ASSERT_EQ(resultValue, DBL_MAX);
129     }
130 }
131 
132 /**
133  * @tc.name: StringTest001
134  * @tc.desc: Test string type.
135  * @tc.type: FUNC
136  */
137 HWTEST_F(NapiBasicTest, StringTest001, testing::ext::TestSize.Level1)
138 {
139     napi_env env = (napi_env)engine_;
140     const char testStr[] = "中文,English,123456,!@#$%$#^%&";
141     size_t testStrLength = strlen(testStr);
142     napi_value result = nullptr;
143     ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, testStrLength, &result));
144     ASSERT_CHECK_VALUE_TYPE(env, result, napi_string);
145 
146     char* buffer = nullptr;
147     size_t bufferSize = 0;
148     size_t strLength = 0;
149     ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, result, nullptr, 0, &bufferSize));
150     ASSERT_GT(bufferSize, (size_t)0);
__anon01784ab90102null151     buffer = new char[bufferSize + 1]{ 0 };
152     ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, result, buffer, bufferSize + 1, &strLength));
153     ASSERT_STREQ(testStr, buffer);
154     ASSERT_EQ(testStrLength, strLength);
155     delete []buffer;
156     buffer = nullptr;
157 }
158 
159 /**
160  * @tc.name: SymbolTest001
161  * @tc.desc: Test symbol type.
162  * @tc.type: FUNC
163  */
164 HWTEST_F(NapiBasicTest, SymbolTest001, testing::ext::TestSize.Level1)
165 {
166     napi_env env = (napi_env)engine_;
167 
168     const char testStr[] = "testSymbol";
169     napi_value result = nullptr;
170 
171     napi_create_string_latin1(env, testStr, strlen(testStr), &result);
172 
173     napi_value symbolVal = nullptr;
174     napi_create_symbol(env, result, &symbolVal);
175 
176     ASSERT_CHECK_VALUE_TYPE(env, symbolVal, napi_symbol);
177 }
178 
179 /**
180  * @tc.name: ExternalTest001
181  * @tc.desc: Test external type.
182  * @tc.type: FUNC
183  */
184 HWTEST_F(NapiBasicTest, ExternalTest001, testing::ext::TestSize.Level1)
185 {
186     napi_env env = (napi_env)engine_;
187     const char testStr[] = "test";
188     napi_value external = nullptr;
189     napi_create_external(
190         env, (void*)testStr,
__anon01784ab90202(napi_env env, void* data, void* hint) 191         [](napi_env env, void* data, void* hint) { ASSERT_STREQ((const char*)data, (const char*)hint); },
192         (void*)testStr, &external);
193 
194     ASSERT_CHECK_VALUE_TYPE(env, external, napi_external);
195     void* tmpExternal = nullptr;
196     napi_get_value_external(env, external, &tmpExternal);
197     ASSERT_TRUE(tmpExternal);
198     ASSERT_EQ(tmpExternal, testStr);
199 }
200 
201 /**
202  * @tc.name: ObjectTest001
203  * @tc.desc: Test object type.
204  * @tc.type: FUNC
205  */
206 HWTEST_F(NapiBasicTest, ObjectTest001, testing::ext::TestSize.Level1)
207 {
208     napi_env env = (napi_env)engine_;
209 
210     napi_value result = nullptr;
211     ASSERT_CHECK_CALL(napi_create_object(env, &result));
212     ASSERT_CHECK_VALUE_TYPE(env, result, napi_object);
213 
214     const char testStr[] = "1234567";
215     napi_value strAttribute = nullptr;
216     ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, strlen(testStr), &strAttribute));
217     ASSERT_CHECK_VALUE_TYPE(env, strAttribute, napi_string);
218     ASSERT_CHECK_CALL(napi_set_named_property(env, result, "strAttribute", strAttribute));
219 
220     napi_value retStrAttribute = nullptr;
221     ASSERT_CHECK_CALL(napi_get_named_property(env, result, "strAttribute", &retStrAttribute));
222     ASSERT_CHECK_VALUE_TYPE(env, retStrAttribute, napi_string);
223 
224     int32_t testNumber = 12345;
225     napi_value numberAttribute = nullptr;
226     ASSERT_CHECK_CALL(napi_create_int32(env, testNumber, &numberAttribute));
227     ASSERT_CHECK_VALUE_TYPE(env, numberAttribute, napi_number);
228     ASSERT_CHECK_CALL(napi_set_named_property(env, result, "numberAttribute", numberAttribute));
229 
230     napi_property_descriptor desc[] = {
__anon01784ab90302() 231         DECLARE_NAPI_FUNCTION("add", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon01784ab90402() 232         DECLARE_NAPI_FUNCTION("sub", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; })
233     };
234 
235     ASSERT_CHECK_CALL(napi_define_properties(env, result, sizeof(desc) / sizeof(desc[0]), desc));
236 
237     napi_value propNames = nullptr;
238     ASSERT_CHECK_CALL(napi_get_property_names(env, result, &propNames));
239     ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object);
240     bool isArray = false;
241     ASSERT_CHECK_CALL(napi_is_array(env, propNames, &isArray));
242     ASSERT_TRUE(isArray);
243     uint32_t arrayLength = 0;
244     ASSERT_CHECK_CALL(napi_get_array_length(env, propNames, &arrayLength));
245     ASSERT_EQ(arrayLength, (uint32_t)2);
246 
247     for (uint32_t i = 0; i < arrayLength; i++) {
248         bool hasElement = false;
249         ASSERT_CHECK_CALL(napi_has_element(env, propNames, i, &hasElement));
250 
251         napi_value propName = nullptr;
252         ASSERT_CHECK_CALL(napi_get_element(env, propNames, i, &propName));
253         ASSERT_CHECK_VALUE_TYPE(env, propName, napi_string);
254 
255         bool hasProperty = false;
256         napi_has_property(env, result, propName, &hasProperty);
257         ASSERT_TRUE(hasProperty);
258 
259         napi_value propValue = nullptr;
260         napi_get_property(env, result, propName, &propValue);
261         ASSERT_TRUE(propValue != nullptr);
262     }
263 }
264 
265 /**
266  * @tc.name: FunctionTest001
267  * @tc.desc: Test function type.
268  * @tc.type: FUNC
269  */
270 HWTEST_F(NapiBasicTest, FunctionTest001, testing::ext::TestSize.Level1)
271 {
272     napi_env env = (napi_env)engine_;
273 
__anon01784ab90502(napi_env env, napi_callback_info info) 274     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
275         napi_value thisVar;
276         napi_value* argv = nullptr;
277         size_t argc = 0;
278         void* data = nullptr;
279 
280         napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
281         if (argc > 0) {
282             argv = new napi_value[argc];
283         }
284         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
285 
286         napi_value result = nullptr;
287         napi_create_object(env, &result);
288 
289         napi_value messageKey = nullptr;
290         const char* messageKeyStr = "message";
291         napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey);
292         napi_value messageValue = nullptr;
293         const char* messageValueStr = "OK";
294         napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue);
295         napi_set_property(env, result, messageKey, messageValue);
296 
297         if (argv != nullptr) {
298             delete []argv;
299         }
300 
301         return result;
302     };
303 
304     napi_value recv = nullptr;
305     napi_value funcValue = nullptr;
306     napi_get_undefined(env, &recv);
307     ASSERT_NE(recv, nullptr);
308 
309     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
310     ASSERT_NE(funcValue, nullptr);
311 
312     napi_handle_scope parentScope = nullptr;
313     napi_open_handle_scope(env, &parentScope);
314     ASSERT_NE(parentScope, nullptr);
315 
316     napi_escapable_handle_scope childScope = nullptr;
317     napi_open_escapable_handle_scope(env, &childScope);
318     ASSERT_NE(childScope, nullptr);
319 
320     napi_value funcResultValue = nullptr;
321     napi_value newFuncResultValue = nullptr;
322     napi_call_function(env, recv, funcValue, 0, nullptr, &funcResultValue);
323     ASSERT_NE(funcResultValue, nullptr);
324 
325     napi_escape_handle(env, childScope, funcResultValue, &newFuncResultValue);
326     napi_close_escapable_handle_scope(env, childScope);
327     ASSERT_TRUE(newFuncResultValue != nullptr);
328     ASSERT_CHECK_VALUE_TYPE(env, newFuncResultValue, napi_object);
329     napi_close_handle_scope(env, parentScope);
330 }
331 
332 /**
333  * @tc.name: ArrayTest001
334  * @tc.desc: Test array type.
335  * @tc.type: FUNC
336  */
337 HWTEST_F(NapiBasicTest, ArrayTest001, testing::ext::TestSize.Level1) {
338     napi_env env = (napi_env) engine_;
339 
340     napi_value array = nullptr;
341     napi_create_array(env, &array);
342     ASSERT_NE(array, nullptr);
343     bool isArray = false;
344     napi_is_array(env, array, &isArray);
345     ASSERT_TRUE(isArray);
346 
347     for (size_t i = 0; i < 10; i++) {
348         napi_value num = nullptr;
349         napi_create_uint32(env, i, &num);
350         napi_set_element(env, array, i, num);
351     }
352 
353     uint32_t arrayLength = 0;
354     napi_get_array_length(env, array, &arrayLength);
355 
356     ASSERT_EQ(arrayLength, (uint32_t) 10);
357 
358     for (size_t i = 0; i < arrayLength; i++) {
359         bool hasIndex = false;
360         napi_has_element(env, array, i, &hasIndex);
361         ASSERT_TRUE(hasIndex);
362     }
363 
364     for (size_t i = 0; i < arrayLength; i++) {
365         bool isDelete = false;
366         napi_delete_element(env, array, i, &isDelete);
367         ASSERT_TRUE(isDelete);
368     }
369 }
370 
371 /**
372  * @tc.name: ArrayBufferTest001
373  * @tc.desc: Test array buffer type.
374  * @tc.type: FUNC
375  */
376 HWTEST_F(NapiBasicTest, ArrayBufferTest001, testing::ext::TestSize.Level1)
377 {
378     napi_env env = (napi_env)engine_;
379 
380     napi_value arrayBuffer = nullptr;
381     void* arrayBufferPtr = nullptr;
382     size_t arrayBufferSize = 1024;
383     napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
384 
385     void* tmpArrayBufferPtr = nullptr;
386     size_t arrayBufferLength = 0;
387     napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength);
388 
389     ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr);
390     ASSERT_EQ(arrayBufferSize, arrayBufferLength);
391 }
392 
393 /**
394  * @tc.name: TypedArrayTest001
395  * @tc.desc: Test typed array type.
396  * @tc.type: FUNC
397  */
398 HWTEST_F(NapiBasicTest, TypedArrayTest001, testing::ext::TestSize.Level1)
399 {
400     napi_env env = (napi_env)engine_;
401 
402     {
403         napi_value arrayBuffer = nullptr;
404         void* arrayBufferPtr = nullptr;
405         size_t arrayBufferSize = 1024;
406         napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
407 
408         void* tmpArrayBufferPtr = nullptr;
409         size_t arrayBufferLength = 0;
410         napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength);
411 
412         ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr);
413         ASSERT_EQ(arrayBufferSize, arrayBufferLength);
414 
415         napi_value typedarray = nullptr;
416         napi_create_typedarray(env, napi_int8_array, arrayBufferSize, arrayBuffer, 0, &typedarray);
417         ASSERT_NE(typedarray, nullptr);
418         bool isTypedArray = false;
419         napi_is_typedarray(env, typedarray, &isTypedArray);
420         ASSERT_TRUE(isTypedArray);
421 
422         napi_typedarray_type typedarrayType;
423         size_t typedarrayLength = 0;
424         void* typedarrayBufferPtr = nullptr;
425         napi_value tmpArrayBuffer = nullptr;
426         size_t byteOffset = 0;
427 
428         napi_get_typedarray_info(env, typedarray, &typedarrayType, &typedarrayLength, &typedarrayBufferPtr,
429                                  &tmpArrayBuffer, &byteOffset);
430 
431         ASSERT_EQ(typedarrayBufferPtr, arrayBufferPtr);
432         ASSERT_EQ(arrayBufferSize, typedarrayLength);
433     }
434 }
435 
436 /**
437  * @tc.name: DataViewTest001
438  * @tc.desc: Test data view type.
439  * @tc.type: FUNC
440  */
441 HWTEST_F(NapiBasicTest, DataViewTest001, testing::ext::TestSize.Level1)
442 {
443     napi_env env = (napi_env)engine_;
444 
445     napi_value arrayBuffer = nullptr;
446     void* arrayBufferPtr = nullptr;
447     size_t arrayBufferSize = 1024;
448     napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
449     ASSERT_NE(arrayBuffer, nullptr);
450     ASSERT_NE(arrayBufferPtr, nullptr);
451     bool isArrayBuffer = false;
452     napi_is_arraybuffer(env, arrayBuffer, &isArrayBuffer);
453     ASSERT_TRUE(isArrayBuffer);
454 
455     napi_value result = nullptr;
456     napi_create_dataview(env, arrayBufferSize, arrayBuffer, 0, &result);
457 
458     bool isDataView = false;
459     napi_is_dataview(env, result, &isDataView);
460 
461     napi_value retArrayBuffer = nullptr;
462     void* data = nullptr;
463     size_t byteLength = 0;
464     size_t byteOffset = 0;
465     napi_get_dataview_info(env, result, &byteLength, &data, &retArrayBuffer, &byteOffset);
466 
467     bool retIsArrayBuffer = false;
468     napi_is_arraybuffer(env, arrayBuffer, &retIsArrayBuffer);
469     ASSERT_TRUE(retIsArrayBuffer);
470     ASSERT_EQ(arrayBufferPtr, data);
471     ASSERT_EQ(arrayBufferSize, byteLength);
472     ASSERT_EQ((size_t)0, byteOffset);
473 }
474 
475 /**
476  * @tc.name: PromiseTest001
477  * @tc.desc: Test promise type.
478  * @tc.type: FUNC
479  */
480 HWTEST_F(NapiBasicTest, PromiseTest001, testing::ext::TestSize.Level1)
481 {
482     napi_env env = (napi_env)engine_;
483     {
484         napi_deferred deferred = nullptr;
485         napi_value promise = nullptr;
486         napi_create_promise(env, &deferred, &promise);
487         ASSERT_NE(deferred, nullptr);
488         ASSERT_NE(promise, nullptr);
489 
490         bool isPromise = false;
491         napi_is_promise(env, promise, &isPromise);
492         ASSERT_TRUE(isPromise);
493 
494         napi_value undefined = nullptr;
495         napi_get_undefined(env, &undefined);
496         napi_resolve_deferred(env, deferred, undefined);
497     }
498     {
499         napi_deferred deferred = nullptr;
500         napi_value promise = nullptr;
501         napi_create_promise(env, &deferred, &promise);
502         ASSERT_NE(deferred, nullptr);
503         ASSERT_NE(promise, nullptr);
504 
505         bool isPromise = false;
506         napi_is_promise(env, promise, &isPromise);
507         ASSERT_TRUE(isPromise);
508 
509         napi_value undefined = nullptr;
510         napi_get_undefined(env, &undefined);
511         napi_reject_deferred(env, deferred, undefined);
512     }
513 }
514 
515 /**
516  * @tc.name: ErrorTest001
517  * @tc.desc: Test error type.
518  * @tc.type: FUNC
519  */
520 HWTEST_F(NapiBasicTest, ErrorTest001, testing::ext::TestSize.Level1)
521 {
522     napi_env env = (napi_env)engine_;
523 
524     {
525         napi_value code = nullptr;
526         napi_value message = nullptr;
527 
528         napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code);
529         napi_create_string_latin1(env, "common error", NAPI_AUTO_LENGTH, &message);
530 
531         napi_value error = nullptr;
532         napi_create_error(env, code, message, &error);
533         ASSERT_TRUE(error != nullptr);
534         bool isError = false;
535         napi_is_error(env, error, &isError);
536         ASSERT_TRUE(isError);
537         napi_throw(env, error);
538     }
539 
540     {
541         napi_value code = nullptr;
542         napi_value message = nullptr;
543         napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code);
544         napi_create_string_latin1(env, "range error", NAPI_AUTO_LENGTH, &message);
545         napi_value error = nullptr;
546         napi_create_range_error(env, code, message, &error);
547         ASSERT_TRUE(error != nullptr);
548         bool isError = false;
549         napi_is_error(env, error, &isError);
550         ASSERT_TRUE(isError);
551     }
552 
553     {
554         napi_value code = nullptr;
555         napi_value message = nullptr;
556         napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code);
557         napi_create_string_latin1(env, "type error", NAPI_AUTO_LENGTH, &message);
558         napi_value error = nullptr;
559         napi_create_type_error(env, code, message, &error);
560         ASSERT_TRUE(error != nullptr);
561         bool isError = false;
562         napi_is_error(env, error, &isError);
563         ASSERT_TRUE(isError);
564     }
565 
566     napi_throw_error(env, "500", "Common error");
567     napi_throw_range_error(env, "500", "Range error");
568     napi_throw_type_error(env, "500", "Type error");
569     bool isExceptionPending = false;
570     napi_is_exception_pending(env, &isExceptionPending);
571     ASSERT_TRUE(isExceptionPending);
572 }
573 
574 /**
575  * @tc.name: ReferenceTest001
576  * @tc.desc: Test reference type.
577  * @tc.type: FUNC
578  */
579 HWTEST_F(NapiBasicTest, ReferenceTest001, testing::ext::TestSize.Level1)
580 {
581     napi_env env = (napi_env)engine_;
582 
583     napi_value result = nullptr;
584     napi_ref resultRef = nullptr;
585 
586     napi_create_object(env, &result);
587     napi_create_reference(env, result, 1, &resultRef);
588 
589     uint32_t resultRefCount = 0;
590 
591     napi_reference_ref(env, resultRef, &resultRefCount);
592     ASSERT_EQ(resultRefCount, (uint32_t)2);
593 
594     napi_reference_unref(env, resultRef, &resultRefCount);
595     ASSERT_EQ(resultRefCount, (uint32_t)1);
596 
597     napi_value refValue = nullptr;
598     napi_get_reference_value(env, resultRef, &refValue);
599 
600     ASSERT_NE(refValue, nullptr);
601 
602     napi_delete_reference(env, resultRef);
603 }
604 
605 /**
606  * @tc.name: CustomClassTest001
607  * @tc.desc: Test define class.
608  * @tc.type: FUNC
609  */
610 HWTEST_F(NapiBasicTest, CustomClassTest001, testing::ext::TestSize.Level1)
611 {
612     napi_env env = (napi_env)engine_;
613 
__anon01784ab90602(napi_env env, napi_callback_info info) 614     auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
615         napi_value thisVar = nullptr;
616         napi_value* argv = nullptr;
617         size_t argc = 0;
618         void* data = nullptr;
619         napi_value constructor = nullptr;
620         napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
621         if (argc > 0) {
622             argv = new napi_value[argc];
623         }
624         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
625         napi_get_new_target(env, info, &constructor);
626         if (constructor == nullptr) {
627             napi_throw_error(env, nullptr, "is not new instance");
628         }
629         if (argv != nullptr) {
630             delete []argv;
631         }
632         return thisVar;
633     };
634 
635     napi_value ln2 = nullptr;
636     napi_value e = nullptr;
637 
638     napi_create_double(env, 2.718281828459045, &e);
639     napi_create_double(env, 0.6931471805599453, &ln2);
640 
641     napi_property_descriptor desc[] = {
__anon01784ab90702() 642         DECLARE_NAPI_FUNCTION("add", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon01784ab90802() 643         DECLARE_NAPI_FUNCTION("sub", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon01784ab90902() 644         DECLARE_NAPI_FUNCTION("mul", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon01784ab90a02() 645         DECLARE_NAPI_FUNCTION("div", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
646         DECLARE_NAPI_STATIC_FUNCTION("getTime",
__anon01784ab90b02() 647                                      [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
648         DECLARE_NAPI_GETTER_SETTER(
__anon01784ab90c02() 649             "pi", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; },
__anon01784ab90d02() 650             [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
651 
652     };
653 
654     napi_value customClass = nullptr;
655 
656     ASSERT_CHECK_CALL(napi_define_class(env, "CustomClass", NAPI_AUTO_LENGTH, constructor, nullptr,
657                                         sizeof(desc) / sizeof(desc[0]), desc, &customClass));
658     ASSERT_CHECK_VALUE_TYPE(env, customClass, napi_function);
659     napi_value customClassPrototype = nullptr;
660     napi_get_prototype(env, customClass, &customClassPrototype);
661     ASSERT_CHECK_VALUE_TYPE(env, customClassPrototype, napi_function);
662 
663     napi_value customInstance = nullptr;
664     ASSERT_CHECK_CALL(napi_new_instance(env, customClass, 0, nullptr, &customInstance));
665 
666     bool isInstanceOf = false;
667     ASSERT_CHECK_CALL(napi_instanceof(env, customInstance, customClass, &isInstanceOf));
668     ASSERT_TRUE(isInstanceOf);
669 }
670 
671 /**
672  * @tc.name: AsyncWorkTest001
673  * @tc.desc: Test async work.
674  * @tc.type: FUNC
675  */
676 HWTEST_F(NapiBasicTest, AsyncWorkTest001, testing::ext::TestSize.Level1)
677 {
678     struct AsyncWorkContext {
679         napi_async_work work = nullptr;
680     };
681     napi_env env = (napi_env)engine_;
682     {
683         auto asyncWorkContext = new AsyncWorkContext();
684         napi_value resourceName = nullptr;
685         napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName);
686         napi_create_async_work(
__anon01784ab90e02(napi_env value, void* data) 687             env, nullptr, resourceName, [](napi_env value, void* data) {},
__anon01784ab90f02(napi_env env, napi_status status, void* data) 688             [](napi_env env, napi_status status, void* data) {
689                 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data;
690                 napi_delete_async_work(env, asyncWorkContext->work);
691                 delete asyncWorkContext;
692             },
693             asyncWorkContext, &asyncWorkContext->work);
694         napi_queue_async_work(env, asyncWorkContext->work);
695     }
696     {
697         auto asyncWorkContext = new AsyncWorkContext();
698         napi_value resourceName = nullptr;
699         napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName);
700         napi_create_async_work(
__anon01784ab91002(napi_env value, void* data) 701             env, nullptr, resourceName, [](napi_env value, void* data) {},
__anon01784ab91102(napi_env env, napi_status status, void* data) 702             [](napi_env env, napi_status status, void* data) {
703                 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data;
704                 napi_delete_async_work(env, asyncWorkContext->work);
705                 delete asyncWorkContext;
706             },
707             asyncWorkContext, &asyncWorkContext->work);
708         napi_queue_async_work(env, asyncWorkContext->work);
709         napi_cancel_async_work(env, asyncWorkContext->work);
710     }
711 }
712 
713 /**
714  * @tc.name: ObjectWrapperTest001
715  * @tc.desc: Test object wrapper.
716  * @tc.type: FUNC
717  */
718 HWTEST_F(NapiBasicTest, ObjectWrapperTest001, testing::ext::TestSize.Level1)
719 {
720     napi_env env = (napi_env)engine_;
721 
722     napi_value testClass = nullptr;
723     napi_define_class(
724         env, "TestClass", NAPI_AUTO_LENGTH,
__anon01784ab91202(napi_env env, napi_callback_info info) 725         [](napi_env env, napi_callback_info info) -> napi_value {
726             napi_value thisVar = nullptr;
727             napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
728 
729             return thisVar;
730         },
731         nullptr, 0, nullptr, &testClass);
732 
733     napi_value instanceValue = nullptr;
734     napi_new_instance(env, testClass, 0, nullptr, &instanceValue);
735 
736     const char* testStr = "test";
737     napi_wrap(
__anon01784ab91302(napi_env env, void* data, void* hint) 738         env, instanceValue, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr, nullptr);
739 
740     char* tmpTestStr = nullptr;
741     napi_unwrap(env, instanceValue, (void**)&tmpTestStr);
742     ASSERT_STREQ(testStr, tmpTestStr);
743 
744     char* tmpTestStr1 = nullptr;
745     napi_remove_wrap(env, instanceValue, (void**)&tmpTestStr1);
746     ASSERT_STREQ(testStr, tmpTestStr1);
747 }
748 
749 /**
750  * @tc.name: RunScriptTest001
751  * @tc.desc: Test script running.
752  * @tc.type: FUNC
753  */
754 HWTEST_F(NapiBasicTest, RunScriptTest001, testing::ext::TestSize.Level1)
755 {
756     napi_env env = (napi_env)engine_;
757 
758     const char* tetScriptStr = "1+1;";
759     napi_value testScript = nullptr;
760     napi_create_string_utf8(env, tetScriptStr, strlen(tetScriptStr), &testScript);
761     ASSERT_NE(testScript, nullptr);
762     napi_value result = nullptr;
763     napi_run_script(env, testScript, &result);
764     ASSERT_NE(result, nullptr);
765     ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
766 }
767 
768 /**
769  * @tc.name: DateTest
770  * @tc.desc: Test date type.
771  * @tc.type: FUNC
772  */
773 HWTEST_F(NapiBasicTest, DateTest001, testing::ext::TestSize.Level1)
774 {
775     napi_env env = (napi_env)engine_;
776 
777     const char* tetScriptStr = "new Date();";
778     napi_value testScript = nullptr;
779 
780     napi_create_string_utf8(env, tetScriptStr, strlen(tetScriptStr), &testScript);
781 
782     napi_value date = nullptr;
783     napi_run_script(env, testScript, &date);
784     ASSERT_CHECK_VALUE_TYPE(env, date, napi_object);
785 
786     napi_value getTimeFunc = nullptr;
787     napi_get_named_property(env, date, "getTime", &getTimeFunc);
788     ASSERT_CHECK_VALUE_TYPE(env, getTimeFunc, napi_function);
789 
790     napi_value getTimeResult = nullptr;
791     napi_call_function(env, date, getTimeFunc, 0, nullptr, &getTimeResult);
792     ASSERT_CHECK_VALUE_TYPE(env, getTimeResult, napi_number);
793 
794     int64_t value = 0;
795 
796     napi_get_value_int64(env, getTimeResult, &value);
797 }
798 
799 /**
800  * @tc.name: StrictEqualsTest001
801  * @tc.desc: Test date type.
802  * @tc.type: FUNC
803  */
804 HWTEST_F(NapiBasicTest, StrictEqualsTest001, testing::ext::TestSize.Level1)
805 {
806     napi_env env = (napi_env)engine_;
807 
808     const char* testStringStr = "test";
809     napi_value testString = nullptr;
810     napi_create_string_utf8(env, testStringStr, strlen(testStringStr), &testString);
811     bool isStrictEquals = false;
812     napi_strict_equals(env, testString, testString, &isStrictEquals);
813     ASSERT_TRUE(isStrictEquals);
814 
815     napi_value testObject = nullptr;
816     napi_create_object(env, &testObject);
817     isStrictEquals = false;
818     napi_strict_equals(env, testObject, testObject, &isStrictEquals);
819     ASSERT_TRUE(isStrictEquals);
820 }
821 
822 /**
823  * @tc.name: CreateRuntimeTest001
824  * @tc.desc: Test create runtime.
825  * @tc.type: FUNC
826  */
827 HWTEST_F(NapiBasicTest, CreateRuntimeTest001, testing::ext::TestSize.Level1)
828 {
829     napi_env env = (napi_env)engine_;
830 
831     napi_env newEnv = nullptr;
832     napi_create_runtime(env, &newEnv);
833 #ifdef USE_V8_ENGINE
834     ASSERT_NE(newEnv, nullptr);
835 #elif USE_QUICKJS_ENGINE
836     ASSERT_EQ(newEnv, nullptr);
837 #endif
838 }
839 
840 /**
841  * @tc.name: SerializeDeSerializeTest001
842  * @tc.desc: Test serialize & deserialize.
843  * @tc.type: FUNC
844  */
845 HWTEST_F(NapiBasicTest, SerializeDeSerializeTest001, testing::ext::TestSize.Level1)
846 {
847     napi_env env = (napi_env)engine_;
848 
849     napi_value undefined = nullptr;
850     napi_get_undefined(env, &undefined);
851 #ifdef USE_V8_ENGINE
852     napi_value num = nullptr;
853     uint32_t value = 1000;
854     napi_create_uint32(env, value, &num);
855     napi_value data = nullptr;
856     napi_serialize(env, num, undefined, &data);
857     ASSERT_NE(data, nullptr);
858 
859     napi_value result = nullptr;
860     napi_deserialize(env, data, &result);
861     ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
862     int32_t resultData = 0;
863     napi_get_value_int32(env, result, &resultData);
864     ASSERT_EQ(resultData, 1000);
865 
866     napi_delete_serialization_data(env, data);
867 #endif
868 }
869 
870 /**
871  * @tc.name: IsCallableTest001
872  * @tc.desc: Test is callable.
873  * @tc.type: FUNC
874  */
875 HWTEST_F(NapiBasicTest, IsCallableTest001, testing::ext::TestSize.Level1)
876 {
877     napi_env env = (napi_env)engine_;
878 
__anon01784ab91402(napi_env env, napi_callback_info info) 879     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
880         napi_value thisVar;
881         napi_value* argv = nullptr;
882         size_t argc = 0;
883         void* data = nullptr;
884 
885         napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
886         if (argc > 0) {
887             argv = new napi_value[argc];
888         }
889         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
890 
891         napi_value result = nullptr;
892         napi_create_object(env, &result);
893 
894         napi_value messageKey = nullptr;
895         const char* messageKeyStr = "message";
896         napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey);
897         napi_value messageValue = nullptr;
898         const char* messageValueStr = "OK";
899         napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue);
900         napi_set_property(env, result, messageKey, messageValue);
901 
902         if (argv != nullptr) {
903             delete []argv;
904         }
905         return result;
906     };
907 
908     napi_value funcValue = nullptr;
909     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
910     ASSERT_NE(funcValue, nullptr);
911 
912     bool result = false;
913     napi_is_callable(env, funcValue, &result);
914     ASSERT_TRUE(result);
915 }
916 
917 /**
918  * @tc.name: LoadModuleTest001
919  * @tc.desc: Test LoadModule Func.
920  * @tc.type: FUNC
921  */
922 HWTEST_F(NapiBasicTest, LoadModuleTest001, testing::ext::TestSize.Level1)
923 {
924     napi_env env = (napi_env)engine_;
925     std::string sourceText = "var a = 1; let b = 2;"
926                              "export function getA() {return a};"
927                              "export function getB() {return b};"
928                              "export default {'val': 4};";
929     auto sourceString = engine_->CreateString(sourceText.c_str(), sourceText.length());
930 
931     std::string file = "file.js";
932     NativeValue *moduleValue = engine_->LoadModule(sourceString, file);
933     ASSERT_TRUE(moduleValue != nullptr);
934     auto moduleObject = reinterpret_cast<NativeObject*>(moduleValue->GetInterface(NativeObject::INTERFACE_ID));
935 
936     std::string key = "val";
937     auto keyString = engine_->CreateString(key.c_str(), key.length());
938     auto resultValue = moduleObject->GetProperty(keyString);
939 
940     napi_value lvalue = reinterpret_cast<napi_value>(resultValue);
941     napi_value rvalue = nullptr;
942     napi_create_int32(env, 4, &rvalue);
943 
944     bool result = false;
945     napi_strict_equals(env, lvalue, rvalue, &result);
946     ASSERT_TRUE(result);
947 }
948 
949 /**
950  * @tc.name: EncodeToUtf8Test001
951  * @tc.desc: Test EncodeToUtf8 Func.
952  * @tc.type: FUNC
953  */
954 HWTEST_F(NapiBasicTest, EncodeToUtf8Test001, testing::ext::TestSize.Level1)
955 {
956     std::string str = "encode";
957     auto testStr = engine_->CreateString(str.c_str(), str.length());
958     char* buffer = new char[str.length()];
959     size_t bufferSize = str.length();
960     int32_t written = 0;
961     int32_t nchars = 0;
962     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
963     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
964     ASSERT_EQ(written, 6);
965     ASSERT_EQ(nchars, 6);
966     delete[] buffer;
967 
968     str = "encode\xc2\xab\xe2\x98\x80";
969     testStr = engine_->CreateString(str.c_str(), str.length());
970     buffer = new char[str.length()];
971     bufferSize = str.length();
972     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
973     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
974     ASSERT_EQ(written, 11);
975     ASSERT_EQ(nchars, 8);
976     delete[] buffer;
977 
978     buffer = new char[str.length()];
979     bufferSize = str.length();
980     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
981     bufferSize--;
982     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
983     ASSERT_EQ(written, 8);
984     ASSERT_EQ(nchars, 7);
985     delete[] buffer;
986 
987     buffer = new char[str.length()];
988     bufferSize = str.length();
989     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
990     bufferSize -= 4;
991     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
992     ASSERT_EQ(written, 6);
993     ASSERT_EQ(nchars, 6);
994     delete[] buffer;
995 
996     str = "encode\xc2\xab\xe2\x98\x80t";
997     testStr = engine_->CreateString(str.c_str(), str.length());
998     buffer = new char[str.length()];
999     bufferSize = str.length();
1000     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
1001     bufferSize--;
1002     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
1003     ASSERT_EQ(written, 11);
1004     ASSERT_EQ(nchars, 8);
1005     delete[] buffer;
1006 
1007     str = "";
1008     testStr = engine_->CreateString(str.c_str(), str.length());
1009     buffer = new char[str.length() + 1];
1010     bufferSize = str.length() + 1;
1011     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
1012     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
1013     ASSERT_EQ(written, 0);
1014     ASSERT_EQ(nchars, 0);
1015     delete[] buffer;
1016 }