• 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);
__anon8a3d7f070102null151     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,
__anon8a3d7f070202(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_value propNames = nullptr;
231     ASSERT_CHECK_CALL(napi_get_property_names(env, result, &propNames));
232     ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object);
233     bool isArray = false;
234     ASSERT_CHECK_CALL(napi_is_array(env, propNames, &isArray));
235     ASSERT_TRUE(isArray);
236     uint32_t arrayLength = 0;
237     ASSERT_CHECK_CALL(napi_get_array_length(env, propNames, &arrayLength));
238     ASSERT_EQ(arrayLength, (uint32_t)2);
239 
240     for (uint32_t i = 0; i < arrayLength; i++) {
241         bool hasElement = false;
242         ASSERT_CHECK_CALL(napi_has_element(env, propNames, i, &hasElement));
243 
244         napi_value propName = nullptr;
245         ASSERT_CHECK_CALL(napi_get_element(env, propNames, i, &propName));
246         ASSERT_CHECK_VALUE_TYPE(env, propName, napi_string);
247 
248         bool hasProperty = false;
249         napi_has_property(env, result, propName, &hasProperty);
250         ASSERT_TRUE(hasProperty);
251 
252         napi_value propValue = nullptr;
253         napi_get_property(env, result, propName, &propValue);
254         ASSERT_TRUE(propValue != nullptr);
255     }
256 }
257 
258 /**
259  * @tc.name: FunctionTest001
260  * @tc.desc: Test function type.
261  * @tc.type: FUNC
262  */
263 HWTEST_F(NapiBasicTest, FunctionTest001, testing::ext::TestSize.Level1)
264 {
265     napi_env env = (napi_env)engine_;
266 
__anon8a3d7f070302(napi_env env, napi_callback_info info) 267     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
268         napi_value thisVar;
269         napi_value* argv = nullptr;
270         size_t argc = 0;
271         void* data = nullptr;
272 
273         napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
274         if (argc > 0) {
275             argv = new napi_value[argc];
276         }
277         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
278 
279         napi_value result = nullptr;
280         napi_create_object(env, &result);
281 
282         napi_value messageKey = nullptr;
283         const char* messageKeyStr = "message";
284         napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey);
285         napi_value messageValue = nullptr;
286         const char* messageValueStr = "OK";
287         napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue);
288         napi_set_property(env, result, messageKey, messageValue);
289 
290         if (argv != nullptr) {
291             delete []argv;
292         }
293 
294         return result;
295     };
296 
297     napi_value recv = nullptr;
298     napi_value funcValue = nullptr;
299     napi_get_undefined(env, &recv);
300     ASSERT_NE(recv, nullptr);
301 
302     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
303     ASSERT_NE(funcValue, nullptr);
304 
305     napi_handle_scope parentScope = nullptr;
306     napi_open_handle_scope(env, &parentScope);
307     ASSERT_NE(parentScope, nullptr);
308 
309     napi_escapable_handle_scope childScope = nullptr;
310     napi_open_escapable_handle_scope(env, &childScope);
311     ASSERT_NE(childScope, nullptr);
312 
313     napi_value funcResultValue = nullptr;
314     napi_value newFuncResultValue = nullptr;
315     napi_call_function(env, recv, funcValue, 0, nullptr, &funcResultValue);
316     ASSERT_NE(funcResultValue, nullptr);
317 
318     napi_escape_handle(env, childScope, funcResultValue, &newFuncResultValue);
319     napi_close_escapable_handle_scope(env, childScope);
320     ASSERT_TRUE(newFuncResultValue != nullptr);
321     ASSERT_CHECK_VALUE_TYPE(env, newFuncResultValue, napi_object);
322     napi_close_handle_scope(env, parentScope);
323 }
324 
325 /**
326  * @tc.name: ArrayTest001
327  * @tc.desc: Test array type.
328  * @tc.type: FUNC
329  */
330 HWTEST_F(NapiBasicTest, ArrayTest001, testing::ext::TestSize.Level1) {
331     napi_env env = (napi_env) engine_;
332 
333     napi_value array = nullptr;
334     napi_create_array(env, &array);
335     ASSERT_NE(array, nullptr);
336     bool isArray = false;
337     napi_is_array(env, array, &isArray);
338     ASSERT_TRUE(isArray);
339 
340     for (size_t i = 0; i < 10; i++) {
341         napi_value num = nullptr;
342         napi_create_uint32(env, i, &num);
343         napi_set_element(env, array, i, num);
344     }
345 
346     uint32_t arrayLength = 0;
347     napi_get_array_length(env, array, &arrayLength);
348 
349     ASSERT_EQ(arrayLength, (uint32_t) 10);
350 
351     for (size_t i = 0; i < arrayLength; i++) {
352         bool hasIndex = false;
353         napi_has_element(env, array, i, &hasIndex);
354         ASSERT_TRUE(hasIndex);
355     }
356 
357     for (size_t i = 0; i < arrayLength; i++) {
358         bool isDelete = false;
359         napi_delete_element(env, array, i, &isDelete);
360         ASSERT_TRUE(isDelete);
361     }
362 }
363 
364 /**
365  * @tc.name: ArrayBufferTest001
366  * @tc.desc: Test array buffer type.
367  * @tc.type: FUNC
368  */
369 HWTEST_F(NapiBasicTest, ArrayBufferTest001, testing::ext::TestSize.Level1)
370 {
371     napi_env env = (napi_env)engine_;
372 
373     napi_value arrayBuffer = nullptr;
374     void* arrayBufferPtr = nullptr;
375     size_t arrayBufferSize = 1024;
376     napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
377 
378     void* tmpArrayBufferPtr = nullptr;
379     size_t arrayBufferLength = 0;
380     napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength);
381 
382     ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr);
383     ASSERT_EQ(arrayBufferSize, arrayBufferLength);
384 }
385 
386 /**
387  * @tc.name: TypedArrayTest001
388  * @tc.desc: Test typed array type.
389  * @tc.type: FUNC
390  */
391 HWTEST_F(NapiBasicTest, TypedArrayTest001, testing::ext::TestSize.Level1)
392 {
393     napi_env env = (napi_env)engine_;
394 
395     {
396         napi_value arrayBuffer = nullptr;
397         void* arrayBufferPtr = nullptr;
398         size_t arrayBufferSize = 1024;
399         napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
400 
401         void* tmpArrayBufferPtr = nullptr;
402         size_t arrayBufferLength = 0;
403         napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength);
404 
405         ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr);
406         ASSERT_EQ(arrayBufferSize, arrayBufferLength);
407 
408         napi_value typedarray = nullptr;
409         napi_create_typedarray(env, napi_int8_array, arrayBufferSize, arrayBuffer, 0, &typedarray);
410         ASSERT_NE(typedarray, nullptr);
411         bool isTypedArray = false;
412         napi_is_typedarray(env, typedarray, &isTypedArray);
413         ASSERT_TRUE(isTypedArray);
414 
415         napi_typedarray_type typedarrayType;
416         size_t typedarrayLength = 0;
417         void* typedarrayBufferPtr = nullptr;
418         napi_value tmpArrayBuffer = nullptr;
419         size_t byteOffset = 0;
420 
421         napi_get_typedarray_info(env, typedarray, &typedarrayType, &typedarrayLength, &typedarrayBufferPtr,
422                                  &tmpArrayBuffer, &byteOffset);
423 
424         ASSERT_EQ(typedarrayBufferPtr, arrayBufferPtr);
425         ASSERT_EQ(arrayBufferSize, typedarrayLength);
426     }
427 }
428 
429 /**
430  * @tc.name: DataViewTest001
431  * @tc.desc: Test data view type.
432  * @tc.type: FUNC
433  */
434 HWTEST_F(NapiBasicTest, DataViewTest001, testing::ext::TestSize.Level1)
435 {
436     napi_env env = (napi_env)engine_;
437 
438     napi_value arrayBuffer = nullptr;
439     void* arrayBufferPtr = nullptr;
440     size_t arrayBufferSize = 1024;
441     napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
442     ASSERT_NE(arrayBuffer, nullptr);
443     ASSERT_NE(arrayBufferPtr, nullptr);
444     bool isArrayBuffer = false;
445     napi_is_arraybuffer(env, arrayBuffer, &isArrayBuffer);
446     ASSERT_TRUE(isArrayBuffer);
447 
448     napi_value result = nullptr;
449     napi_create_dataview(env, arrayBufferSize, arrayBuffer, 0, &result);
450 
451     bool isDataView = false;
452     napi_is_dataview(env, result, &isDataView);
453 
454     napi_value retArrayBuffer = nullptr;
455     void* data = nullptr;
456     size_t byteLength = 0;
457     size_t byteOffset = 0;
458     napi_get_dataview_info(env, result, &byteLength, &data, &retArrayBuffer, &byteOffset);
459 
460     bool retIsArrayBuffer = false;
461     napi_is_arraybuffer(env, arrayBuffer, &retIsArrayBuffer);
462     ASSERT_TRUE(retIsArrayBuffer);
463     ASSERT_EQ(arrayBufferPtr, data);
464     ASSERT_EQ(arrayBufferSize, byteLength);
465     ASSERT_EQ((size_t)0, byteOffset);
466 }
467 
468 /**
469  * @tc.name: PromiseTest001
470  * @tc.desc: Test promise type.
471  * @tc.type: FUNC
472  */
473 HWTEST_F(NapiBasicTest, PromiseTest001, testing::ext::TestSize.Level1)
474 {
475     napi_env env = (napi_env)engine_;
476     {
477         napi_deferred deferred = nullptr;
478         napi_value promise = nullptr;
479         napi_create_promise(env, &deferred, &promise);
480         ASSERT_NE(deferred, nullptr);
481         ASSERT_NE(promise, nullptr);
482 
483         bool isPromise = false;
484         napi_is_promise(env, promise, &isPromise);
485         ASSERT_TRUE(isPromise);
486 
487         napi_value undefined = nullptr;
488         napi_get_undefined(env, &undefined);
489         napi_resolve_deferred(env, deferred, undefined);
490     }
491     {
492         napi_deferred deferred = nullptr;
493         napi_value promise = nullptr;
494         napi_create_promise(env, &deferred, &promise);
495         ASSERT_NE(deferred, nullptr);
496         ASSERT_NE(promise, nullptr);
497 
498         bool isPromise = false;
499         napi_is_promise(env, promise, &isPromise);
500         ASSERT_TRUE(isPromise);
501 
502         napi_value undefined = nullptr;
503         napi_get_undefined(env, &undefined);
504         napi_reject_deferred(env, deferred, undefined);
505     }
506 }
507 
508 /**
509  * @tc.name: ErrorTest001
510  * @tc.desc: Test error type.
511  * @tc.type: FUNC
512  */
513 HWTEST_F(NapiBasicTest, ErrorTest001, testing::ext::TestSize.Level1)
514 {
515     napi_env env = (napi_env)engine_;
516 
517     {
518         napi_value code = nullptr;
519         napi_value message = nullptr;
520 
521         napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code);
522         napi_create_string_latin1(env, "common error", NAPI_AUTO_LENGTH, &message);
523 
524         napi_value error = nullptr;
525         napi_create_error(env, code, message, &error);
526         ASSERT_TRUE(error != nullptr);
527         bool isError = false;
528         napi_is_error(env, error, &isError);
529         ASSERT_TRUE(isError);
530         napi_throw(env, error);
531     }
532 
533     {
534         napi_value code = nullptr;
535         napi_value message = nullptr;
536         napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code);
537         napi_create_string_latin1(env, "range error", NAPI_AUTO_LENGTH, &message);
538         napi_value error = nullptr;
539         napi_create_range_error(env, code, message, &error);
540         ASSERT_TRUE(error != nullptr);
541         bool isError = false;
542         napi_is_error(env, error, &isError);
543         ASSERT_TRUE(isError);
544     }
545 
546     {
547         napi_value code = nullptr;
548         napi_value message = nullptr;
549         napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code);
550         napi_create_string_latin1(env, "type error", NAPI_AUTO_LENGTH, &message);
551         napi_value error = nullptr;
552         napi_create_type_error(env, code, message, &error);
553         ASSERT_TRUE(error != nullptr);
554         bool isError = false;
555         napi_is_error(env, error, &isError);
556         ASSERT_TRUE(isError);
557     }
558 
559     napi_throw_error(env, "500", "Common error");
560     napi_throw_range_error(env, "500", "Range error");
561     napi_throw_type_error(env, "500", "Type error");
562     bool isExceptionPending = false;
563     napi_is_exception_pending(env, &isExceptionPending);
564     ASSERT_TRUE(isExceptionPending);
565 }
566 
567 /**
568  * @tc.name: ReferenceTest001
569  * @tc.desc: Test reference type.
570  * @tc.type: FUNC
571  */
572 HWTEST_F(NapiBasicTest, ReferenceTest001, testing::ext::TestSize.Level1)
573 {
574     napi_env env = (napi_env)engine_;
575 
576     napi_value result = nullptr;
577     napi_ref resultRef = nullptr;
578 
579     napi_create_object(env, &result);
580     napi_create_reference(env, result, 1, &resultRef);
581 
582     uint32_t resultRefCount = 0;
583 
584     napi_reference_ref(env, resultRef, &resultRefCount);
585     ASSERT_EQ(resultRefCount, (uint32_t)2);
586 
587     napi_reference_unref(env, resultRef, &resultRefCount);
588     ASSERT_EQ(resultRefCount, (uint32_t)1);
589 
590     napi_value refValue = nullptr;
591     napi_get_reference_value(env, resultRef, &refValue);
592 
593     ASSERT_NE(refValue, nullptr);
594 
595     napi_delete_reference(env, resultRef);
596 }
597 
598 /**
599  * @tc.name: CustomClassTest001
600  * @tc.desc: Test define class.
601  * @tc.type: FUNC
602  */
603 HWTEST_F(NapiBasicTest, CustomClassTest001, testing::ext::TestSize.Level1)
604 {
605     napi_env env = (napi_env)engine_;
606 
__anon8a3d7f070402(napi_env env, napi_callback_info info) 607     auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
608         napi_value thisVar = nullptr;
609         napi_value* argv = nullptr;
610         size_t argc = 0;
611         void* data = nullptr;
612         napi_value constructor = nullptr;
613         napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
614         if (argc > 0) {
615             argv = new napi_value[argc];
616         }
617         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
618         napi_get_new_target(env, info, &constructor);
619         if (constructor == nullptr) {
620             napi_throw_error(env, nullptr, "is not new instance");
621         }
622         if (argv != nullptr) {
623             delete []argv;
624         }
625         return thisVar;
626     };
627 
628     napi_value ln2 = nullptr;
629     napi_value e = nullptr;
630 
631     napi_create_double(env, 2.718281828459045, &e);
632     napi_create_double(env, 0.6931471805599453, &ln2);
633 
634     napi_property_descriptor desc[] = {
__anon8a3d7f070502() 635         DECLARE_NAPI_FUNCTION("add", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon8a3d7f070602() 636         DECLARE_NAPI_FUNCTION("sub", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon8a3d7f070702() 637         DECLARE_NAPI_FUNCTION("mul", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon8a3d7f070802() 638         DECLARE_NAPI_FUNCTION("div", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
639         DECLARE_NAPI_STATIC_FUNCTION("getTime",
__anon8a3d7f070902() 640                                      [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
641         DECLARE_NAPI_GETTER_SETTER(
__anon8a3d7f070a02() 642             "pi", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; },
__anon8a3d7f070b02() 643             [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
644 
645     };
646 
647     napi_value customClass = nullptr;
648 
649     ASSERT_CHECK_CALL(napi_define_class(env, "CustomClass", NAPI_AUTO_LENGTH, constructor, nullptr,
650                                         sizeof(desc) / sizeof(desc[0]), desc, &customClass));
651     ASSERT_CHECK_VALUE_TYPE(env, customClass, napi_function);
652     napi_value customClassPrototype = nullptr;
653     napi_get_prototype(env, customClass, &customClassPrototype);
654     ASSERT_CHECK_VALUE_TYPE(env, customClassPrototype, napi_function);
655 
656     napi_value customInstance = nullptr;
657     ASSERT_CHECK_CALL(napi_new_instance(env, customClass, 0, nullptr, &customInstance));
658 
659     bool isInstanceOf = false;
660     ASSERT_CHECK_CALL(napi_instanceof(env, customInstance, customClass, &isInstanceOf));
661     ASSERT_TRUE(isInstanceOf);
662 }
663 
664 /**
665  * @tc.name: AsyncWorkTest001
666  * @tc.desc: Test async work.
667  * @tc.type: FUNC
668  */
669 HWTEST_F(NapiBasicTest, AsyncWorkTest001, testing::ext::TestSize.Level1)
670 {
671     struct AsyncWorkContext {
672         napi_async_work work = nullptr;
673     };
674     napi_env env = (napi_env)engine_;
675     {
676         auto asyncWorkContext = new AsyncWorkContext();
677         napi_value resourceName = nullptr;
678         napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName);
679         napi_create_async_work(
__anon8a3d7f070c02(napi_env value, void* data) 680             env, nullptr, resourceName, [](napi_env value, void* data) {},
__anon8a3d7f070d02(napi_env env, napi_status status, void* data) 681             [](napi_env env, napi_status status, void* data) {
682                 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data;
683                 napi_delete_async_work(env, asyncWorkContext->work);
684                 delete asyncWorkContext;
685             },
686             asyncWorkContext, &asyncWorkContext->work);
687         napi_queue_async_work(env, asyncWorkContext->work);
688     }
689     {
690         auto asyncWorkContext = new AsyncWorkContext();
691         napi_value resourceName = nullptr;
692         napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName);
693         napi_create_async_work(
__anon8a3d7f070e02(napi_env value, void* data) 694             env, nullptr, resourceName, [](napi_env value, void* data) {},
__anon8a3d7f070f02(napi_env env, napi_status status, void* data) 695             [](napi_env env, napi_status status, void* data) {
696                 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data;
697                 napi_delete_async_work(env, asyncWorkContext->work);
698                 delete asyncWorkContext;
699             },
700             asyncWorkContext, &asyncWorkContext->work);
701         napi_queue_async_work(env, asyncWorkContext->work);
702         napi_cancel_async_work(env, asyncWorkContext->work);
703     }
704 }
705 
706 /**
707  * @tc.name: ObjectWrapperTest001
708  * @tc.desc: Test object wrapper.
709  * @tc.type: FUNC
710  */
711 HWTEST_F(NapiBasicTest, ObjectWrapperTest001, testing::ext::TestSize.Level1)
712 {
713     napi_env env = (napi_env)engine_;
714 
715     napi_value testClass = nullptr;
716     napi_define_class(
717         env, "TestClass", NAPI_AUTO_LENGTH,
__anon8a3d7f071002(napi_env env, napi_callback_info info) 718         [](napi_env env, napi_callback_info info) -> napi_value {
719             napi_value thisVar = nullptr;
720             napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
721 
722             return thisVar;
723         },
724         nullptr, 0, nullptr, &testClass);
725 
726     napi_value instanceValue = nullptr;
727     napi_new_instance(env, testClass, 0, nullptr, &instanceValue);
728 
729     const char* testStr = "test";
730     napi_wrap(
__anon8a3d7f071102(napi_env env, void* data, void* hint) 731         env, instanceValue, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr, nullptr);
732 
733     char* tmpTestStr = nullptr;
734     napi_unwrap(env, instanceValue, (void**)&tmpTestStr);
735     ASSERT_STREQ(testStr, tmpTestStr);
736 
737     char* tmpTestStr1 = nullptr;
738     napi_remove_wrap(env, instanceValue, (void**)&tmpTestStr1);
739     ASSERT_STREQ(testStr, tmpTestStr1);
740 }
741 
742 /**
743  * @tc.name: StrictEqualsTest001
744  * @tc.desc: Test date type.
745  * @tc.type: FUNC
746  */
747 HWTEST_F(NapiBasicTest, StrictEqualsTest001, testing::ext::TestSize.Level1)
748 {
749     napi_env env = (napi_env)engine_;
750 
751     const char* testStringStr = "test";
752     napi_value testString = nullptr;
753     napi_create_string_utf8(env, testStringStr, strlen(testStringStr), &testString);
754     bool isStrictEquals = false;
755     napi_strict_equals(env, testString, testString, &isStrictEquals);
756     ASSERT_TRUE(isStrictEquals);
757 
758     napi_value testObject = nullptr;
759     napi_create_object(env, &testObject);
760     isStrictEquals = false;
761     napi_strict_equals(env, testObject, testObject, &isStrictEquals);
762     ASSERT_TRUE(isStrictEquals);
763 }
764 
765 /**
766  * @tc.name: CreateRuntimeTest001
767  * @tc.desc: Test create runtime.
768  * @tc.type: FUNC
769  */
770 HWTEST_F(NapiBasicTest, CreateRuntimeTest001, testing::ext::TestSize.Level1)
771 {
772     napi_env env = (napi_env)engine_;
773 
774     napi_env newEnv = nullptr;
775     napi_create_runtime(env, &newEnv);
776 #ifdef USE_V8_ENGINE
777     ASSERT_NE(newEnv, nullptr);
778 #elif USE_QUICKJS_ENGINE
779     ASSERT_EQ(newEnv, nullptr);
780 #endif
781 }
782 
783 /**
784  * @tc.name: SerializeDeSerializeTest001
785  * @tc.desc: Test serialize & deserialize.
786  * @tc.type: FUNC
787  */
788 HWTEST_F(NapiBasicTest, SerializeDeSerializeTest001, testing::ext::TestSize.Level1)
789 {
790     napi_env env = (napi_env)engine_;
791 
792     napi_value undefined = nullptr;
793     napi_get_undefined(env, &undefined);
794 
795     napi_value num = nullptr;
796     uint32_t value = 1000;
797     napi_create_uint32(env, value, &num);
798     napi_value data = nullptr;
799     napi_serialize(env, num, undefined, &data);
800     ASSERT_NE(data, nullptr);
801 
802     napi_value result = nullptr;
803     napi_deserialize(env, data, &result);
804     ASSERT_CHECK_VALUE_TYPE(env, result, napi_number);
805     int32_t resultData = 0;
806     napi_get_value_int32(env, result, &resultData);
807     ASSERT_EQ(resultData, 1000);
808 }
809 
810 /**
811  * @tc.name: IsCallableTest001
812  * @tc.desc: Test is callable.
813  * @tc.type: FUNC
814  */
815 HWTEST_F(NapiBasicTest, IsCallableTest001, testing::ext::TestSize.Level1)
816 {
817     napi_env env = (napi_env)engine_;
818 
__anon8a3d7f071202(napi_env env, napi_callback_info info) 819     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
820         napi_value thisVar;
821         napi_value* argv = nullptr;
822         size_t argc = 0;
823         void* data = nullptr;
824 
825         napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
826         if (argc > 0) {
827             argv = new napi_value[argc];
828         }
829         napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
830 
831         napi_value result = nullptr;
832         napi_create_object(env, &result);
833 
834         napi_value messageKey = nullptr;
835         const char* messageKeyStr = "message";
836         napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey);
837         napi_value messageValue = nullptr;
838         const char* messageValueStr = "OK";
839         napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue);
840         napi_set_property(env, result, messageKey, messageValue);
841 
842         if (argv != nullptr) {
843             delete []argv;
844         }
845         return result;
846     };
847 
848     napi_value funcValue = nullptr;
849     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
850     ASSERT_NE(funcValue, nullptr);
851 
852     bool result = false;
853     napi_is_callable(env, funcValue, &result);
854     ASSERT_TRUE(result);
855 }
856 
857 /**
858  * @tc.name: EncodeToUtf8Test001
859  * @tc.desc: Test EncodeToUtf8 Func.
860  * @tc.type: FUNC
861  */
862 HWTEST_F(NapiBasicTest, EncodeToUtf8Test001, testing::ext::TestSize.Level1)
863 {
864     std::string str = "encode";
865     auto testStr = engine_->CreateString(str.c_str(), str.length());
866     char* buffer = new char[str.length()];
867     size_t bufferSize = str.length();
868     int32_t written = 0;
869     int32_t nchars = 0;
870     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
871     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
872     ASSERT_EQ(written, 6);
873     ASSERT_EQ(nchars, 6);
874     delete[] buffer;
875 
876     str = "encode\xc2\xab\xe2\x98\x80";
877     testStr = engine_->CreateString(str.c_str(), str.length());
878     buffer = new char[str.length()];
879     bufferSize = str.length();
880     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
881     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
882     ASSERT_EQ(written, 11);
883     ASSERT_EQ(nchars, 8);
884     delete[] buffer;
885 
886     buffer = new char[str.length()];
887     bufferSize = str.length();
888     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
889     bufferSize--;
890     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
891     ASSERT_EQ(written, 8);
892     ASSERT_EQ(nchars, 7);
893     delete[] buffer;
894 
895     buffer = new char[str.length()];
896     bufferSize = str.length();
897     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
898     bufferSize -= 4;
899     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
900     ASSERT_EQ(written, 6);
901     ASSERT_EQ(nchars, 6);
902     delete[] buffer;
903 
904     str = "encode\xc2\xab\xe2\x98\x80t";
905     testStr = engine_->CreateString(str.c_str(), str.length());
906     buffer = new char[str.length()];
907     bufferSize = str.length();
908     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
909     bufferSize--;
910     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
911     ASSERT_EQ(written, 11);
912     ASSERT_EQ(nchars, 8);
913     delete[] buffer;
914 
915     str = "";
916     testStr = engine_->CreateString(str.c_str(), str.length());
917     buffer = new char[str.length() + 1];
918     bufferSize = str.length() + 1;
919     ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK);
920     engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars);
921     ASSERT_EQ(written, 0);
922     ASSERT_EQ(nchars, 0);
923     delete[] buffer;
924 }
925 
926 /**
927  * @tc.name: WrapWithSizeTest001
928  * @tc.desc: Test wrap with size.
929  * @tc.type: FUNC
930  */
931 HWTEST_F(NapiBasicTest, WrapWithSizeTest001, testing::ext::TestSize.Level1)
932 {
933     napi_env env = (napi_env)engine_;
934 
935     napi_value testWrapClass = nullptr;
936     napi_define_class(
937         env, "TestWrapClass", NAPI_AUTO_LENGTH,
__anon8a3d7f071302(napi_env env, napi_callback_info info) 938         [](napi_env env, napi_callback_info info) -> napi_value {
939             napi_value thisVar = nullptr;
940             napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
941 
942             return thisVar;
943         },
944         nullptr, 0, nullptr, &testWrapClass);
945 
946     napi_value instanceValue = nullptr;
947     napi_new_instance(env, testWrapClass, 0, nullptr, &instanceValue);
948 
949     const char* testWrapStr = "testWrapStr";
950     size_t size = sizeof(*testWrapStr) / sizeof(char);
951     napi_wrap_with_size(
__anon8a3d7f071402(napi_env env, void* data, void* hint) 952         env, instanceValue, (void*)testWrapStr, [](napi_env env, void* data, void* hint) {}, nullptr, nullptr, size);
953 
954     char* tempTestStr = nullptr;
955     napi_unwrap(env, instanceValue, (void**)&tempTestStr);
956     ASSERT_STREQ(testWrapStr, tempTestStr);
957 
958     char* tempTestStr1 = nullptr;
959     napi_remove_wrap(env, instanceValue, (void**)&tempTestStr1);
960     ASSERT_STREQ(testWrapStr, tempTestStr1);
961 
962 }
963 
964 /**
965  * @tc.name: CreateExternalWithSizeTest001
966  * @tc.desc: Test create external with size.
967  * @tc.type: FUNC
968  */
969 HWTEST_F(NapiBasicTest, CreateExternalWithSizeTest001, testing::ext::TestSize.Level1)
970 {
971     napi_env env = (napi_env)engine_;
972     const char testStr[] = "test";
973     size_t size = sizeof(testStr) / sizeof(char);
974     napi_value external = nullptr;
975     napi_create_external_with_size(
976         env, (void*)testStr,
__anon8a3d7f071502(napi_env env, void* data, void* hint) 977         [](napi_env env, void* data, void* hint) { ASSERT_STREQ((const char*)data, (const char*)hint); },
978         (void*)testStr, &external, size);
979 
980     ASSERT_CHECK_VALUE_TYPE(env, external, napi_external);
981     void* tempExternal = nullptr;
982     napi_get_value_external(env, external, &tempExternal);
983     ASSERT_TRUE(tempExternal);
984     ASSERT_EQ(tempExternal, testStr);
985 }
986 
987 /**
988  * @tc.name: BigArrayTest001
989  * @tc.desc: Test is big int64 array and big uint64 array.
990  * @tc.type: FUNC
991  */
992 HWTEST_F(NapiBasicTest, BigArrayTest001, testing::ext::TestSize.Level1) {
993     napi_env env = (napi_env) engine_;
994 
995     napi_value array = nullptr;
996     napi_create_array(env, &array);
997     ASSERT_NE(array, nullptr);
998     bool isArray = false;
999     napi_is_array(env, array, &isArray);
1000     ASSERT_TRUE(isArray);
1001 
1002     bool isBigInt64Array = true;
1003     napi_is_big_int64_array(env, array, &isBigInt64Array);
1004     ASSERT_EQ(isBigInt64Array, false);
1005 
1006     bool isBigUInt64Array = true;
1007     napi_is_big_uint64_array(env, array, &isBigUInt64Array);
1008     ASSERT_EQ(isBigUInt64Array, false);
1009 }
1010 
1011 /**
1012  * @tc.name: SharedArrayBufferTest001
1013  * @tc.desc: Test is shared array buffer.
1014  * @tc.type: FUNC
1015  */
1016 HWTEST_F(NapiBasicTest, SharedArrayBufferTest001, testing::ext::TestSize.Level1) {
1017     napi_env env = (napi_env) engine_;
1018 
1019     napi_value arrayBuffer = nullptr;
1020     void* arrayBufferPtr = nullptr;
1021     size_t arrayBufferSize = 1024;
1022     napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
1023 
1024     bool isSharedArrayBuffer = true;
1025     napi_is_shared_array_buffer(env, arrayBuffer, &isSharedArrayBuffer);
1026     ASSERT_EQ(isSharedArrayBuffer, false);
1027 }