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 #include "js_napi_common.h"
16 #include "napi/native_api.h"
17 #include "napi/native_common.h"
18 #include "napi/native_node_api.h"
19 namespace ACE {
20 namespace NAPI {
21 namespace SYSTEM_TEST_NAPI {
22 static constexpr size_t bufferSizeAt16 = 128;
23 static constexpr size_t bufferSizeAt16Ext = 4;
24
TestStringUtf16(napi_env env,napi_callback_info info)25 static napi_value TestStringUtf16(napi_env env, napi_callback_info info)
26 {
27 size_t argc = 1;
28 napi_value args[1];
29 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
30 NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments");
31 napi_valuetype valuetype;
32 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
33 NAPI_ASSERT(env, valuetype == napi_string, "Wrong type of argment. Expects a string.");
34 char16_t buffer[bufferSizeAt16] = { 0 };
35 size_t buffer_size = bufferSizeAt16;
36 size_t copied;
37
38 NAPI_CALL(env, napi_get_value_string_utf16(env, args[0], buffer, buffer_size, &copied));
39 napi_value output = nullptr;
40 NAPI_CALL(env, napi_create_string_utf16(env, buffer, copied, &output));
41 return output;
42 }
43
TestStringUtf16Insufficient(napi_env env,napi_callback_info info)44 static napi_value TestStringUtf16Insufficient(napi_env env, napi_callback_info info)
45 {
46 size_t argc = 1;
47 napi_value args[1] = { nullptr };
48 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
49 NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments");
50
51 napi_valuetype valuetype;
52 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
53 NAPI_ASSERT(env, valuetype == napi_string, "Wrong type of argment. Expects a string.");
54
55 char16_t buffer[bufferSizeAt16Ext] = { 0 };
56 size_t buffer_size = bufferSizeAt16Ext;
57 size_t copied;
58
59 NAPI_CALL(env, napi_get_value_string_utf16(env, args[0], buffer, buffer_size, &copied));
60
61 napi_value output = nullptr;
62 NAPI_CALL(env, napi_create_string_utf16(env, buffer, copied, &output));
63
64 return output;
65 }
66
TestStringUtf16Length(napi_env env,napi_callback_info info)67 static napi_value TestStringUtf16Length(napi_env env, napi_callback_info info)
68 {
69 size_t argc = 1;
70 napi_value args[1] = { nullptr };
71 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
72 NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments");
73
74 napi_valuetype valuetype;
75 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
76 NAPI_ASSERT(env, valuetype == napi_string, "Wrong type of argment. Expects a string.");
77
78 size_t length;
79 NAPI_CALL(env, napi_get_value_string_utf16(env, args[0], NULL, 0, &length));
80
81 napi_value output;
82 NAPI_CALL(env, napi_create_uint32(env, (uint32_t)length, &output));
83
84 return output;
85 }
86
TestStringLargeUtf16(napi_env env,napi_callback_info info)87 static napi_value TestStringLargeUtf16(napi_env env, napi_callback_info info)
88 {
89 napi_value output = nullptr;
90 if (SIZE_MAX > INT_MAX) {
91 NAPI_CALL(env, napi_create_string_utf16(env, ((const char16_t*)""), ((size_t)INT_MAX) + 1, &output));
92 } else {
93 NAPI_CALL(env, napi_throw_error(env, NULL, "Invalid argument"));
94 }
95
96 return output;
97 }
98
JsStringInit(napi_env env,napi_value exports)99 napi_value JsStringInit(napi_env env, napi_value exports)
100 {
101 napi_property_descriptor descriptors[] = {
102 DECLARE_NAPI_FUNCTION("testStringUtf16", TestStringUtf16),
103 DECLARE_NAPI_FUNCTION("testStringUtf16Insufficient", TestStringUtf16Insufficient),
104 DECLARE_NAPI_FUNCTION("testStringUtf16Length", TestStringUtf16Length),
105 DECLARE_NAPI_FUNCTION("testStringLargeUtf16", TestStringLargeUtf16),
106 };
107
108 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors));
109 return exports;
110 }
111 } // namespace SYSTEM_TEST_NAPI
112 } // namespace NAPI
113 } // namespace ACE
114