1 #include <js_native_api.h>
2
3 #include "../common.h"
4 #include "test_null.h"
5
SetProperty(napi_env env, napi_callback_info info)6 static napi_value SetProperty(napi_env env, napi_callback_info info) {
7 napi_value return_value, object, key;
8
9 NODE_API_CALL(env, napi_create_object(env, &return_value));
10 NODE_API_CALL(env, napi_create_object(env, &object));
11 NODE_API_CALL(env,
12 napi_create_string_utf8(env, "someString", NAPI_AUTO_LENGTH, &key));
13
14 add_returned_status(env,
15 "envIsNull",
16 return_value,
17 "Invalid argument",
18 napi_invalid_arg,
19 napi_set_property(NULL, object, key, object));
20
21 napi_set_property(env, NULL, key, object);
22 add_last_status(env, "objectIsNull", return_value);
23
24 napi_set_property(env, object, NULL, object);
25 add_last_status(env, "keyIsNull", return_value);
26
27 napi_set_property(env, object, key, NULL);
28 add_last_status(env, "valueIsNull", return_value);
29
30 return return_value;
31 }
32
GetProperty(napi_env env, napi_callback_info info)33 static napi_value GetProperty(napi_env env, napi_callback_info info) {
34 napi_value return_value, object, key, prop;
35
36 NODE_API_CALL(env, napi_create_object(env, &return_value));
37 NODE_API_CALL(env, napi_create_object(env, &object));
38 NODE_API_CALL(env,
39 napi_create_string_utf8(env, "someString", NAPI_AUTO_LENGTH, &key));
40
41 add_returned_status(env,
42 "envIsNull",
43 return_value,
44 "Invalid argument",
45 napi_invalid_arg,
46 napi_get_property(NULL, object, key, &prop));
47
48 napi_get_property(env, NULL, key, &prop);
49 add_last_status(env, "objectIsNull", return_value);
50
51 napi_get_property(env, object, NULL, &prop);
52 add_last_status(env, "keyIsNull", return_value);
53
54 napi_get_property(env, object, key, NULL);
55 add_last_status(env, "valueIsNull", return_value);
56
57 return return_value;
58 }
59
TestBoolValuedPropApi(napi_env env, napi_status (*api)(napi_env, napi_value, napi_value, bool*))60 static napi_value TestBoolValuedPropApi(napi_env env,
61 napi_status (*api)(napi_env, napi_value, napi_value, bool*)) {
62 napi_value return_value, object, key;
63 bool result;
64
65 NODE_API_CALL(env, napi_create_object(env, &return_value));
66 NODE_API_CALL(env, napi_create_object(env, &object));
67 NODE_API_CALL(env,
68 napi_create_string_utf8(env, "someString", NAPI_AUTO_LENGTH, &key));
69
70 add_returned_status(env,
71 "envIsNull",
72 return_value,
73 "Invalid argument",
74 napi_invalid_arg,
75 api(NULL, object, key, &result));
76
77 api(env, NULL, key, &result);
78 add_last_status(env, "objectIsNull", return_value);
79
80 api(env, object, NULL, &result);
81 add_last_status(env, "keyIsNull", return_value);
82
83 api(env, object, key, NULL);
84 add_last_status(env, "valueIsNull", return_value);
85
86 return return_value;
87 }
88
HasProperty(napi_env env, napi_callback_info info)89 static napi_value HasProperty(napi_env env, napi_callback_info info) {
90 return TestBoolValuedPropApi(env, napi_has_property);
91 }
92
HasOwnProperty(napi_env env, napi_callback_info info)93 static napi_value HasOwnProperty(napi_env env, napi_callback_info info) {
94 return TestBoolValuedPropApi(env, napi_has_own_property);
95 }
96
DeleteProperty(napi_env env, napi_callback_info info)97 static napi_value DeleteProperty(napi_env env, napi_callback_info info) {
98 return TestBoolValuedPropApi(env, napi_delete_property);
99 }
100
SetNamedProperty(napi_env env, napi_callback_info info)101 static napi_value SetNamedProperty(napi_env env, napi_callback_info info) {
102 napi_value return_value, object;
103
104 NODE_API_CALL(env, napi_create_object(env, &return_value));
105 NODE_API_CALL(env, napi_create_object(env, &object));
106
107 add_returned_status(env,
108 "envIsNull",
109 return_value,
110 "Invalid argument",
111 napi_invalid_arg,
112 napi_set_named_property(NULL, object, "key", object));
113
114 napi_set_named_property(env, NULL, "key", object);
115 add_last_status(env, "objectIsNull", return_value);
116
117 napi_set_named_property(env, object, NULL, object);
118 add_last_status(env, "keyIsNull", return_value);
119
120 napi_set_named_property(env, object, "key", NULL);
121 add_last_status(env, "valueIsNull", return_value);
122
123 return return_value;
124 }
125
GetNamedProperty(napi_env env, napi_callback_info info)126 static napi_value GetNamedProperty(napi_env env, napi_callback_info info) {
127 napi_value return_value, object, prop;
128
129 NODE_API_CALL(env, napi_create_object(env, &return_value));
130 NODE_API_CALL(env, napi_create_object(env, &object));
131
132 add_returned_status(env,
133 "envIsNull",
134 return_value,
135 "Invalid argument",
136 napi_invalid_arg,
137 napi_get_named_property(NULL, object, "key", &prop));
138
139 napi_get_named_property(env, NULL, "key", &prop);
140 add_last_status(env, "objectIsNull", return_value);
141
142 napi_get_named_property(env, object, NULL, &prop);
143 add_last_status(env, "keyIsNull", return_value);
144
145 napi_get_named_property(env, object, "key", NULL);
146 add_last_status(env, "valueIsNull", return_value);
147
148 return return_value;
149 }
150
HasNamedProperty(napi_env env, napi_callback_info info)151 static napi_value HasNamedProperty(napi_env env, napi_callback_info info) {
152 napi_value return_value, object;
153 bool result;
154
155 NODE_API_CALL(env, napi_create_object(env, &return_value));
156 NODE_API_CALL(env, napi_create_object(env, &object));
157
158 add_returned_status(env,
159 "envIsNull",
160 return_value,
161 "Invalid argument",
162 napi_invalid_arg,
163 napi_has_named_property(NULL, object, "key", &result));
164
165 napi_has_named_property(env, NULL, "key", &result);
166 add_last_status(env, "objectIsNull", return_value);
167
168 napi_has_named_property(env, object, NULL, &result);
169 add_last_status(env, "keyIsNull", return_value);
170
171 napi_has_named_property(env, object, "key", NULL);
172 add_last_status(env, "valueIsNull", return_value);
173
174 return return_value;
175 }
176
SetElement(napi_env env, napi_callback_info info)177 static napi_value SetElement(napi_env env, napi_callback_info info) {
178 napi_value return_value, object;
179
180 NODE_API_CALL(env, napi_create_object(env, &return_value));
181 NODE_API_CALL(env, napi_create_object(env, &object));
182
183 add_returned_status(env,
184 "envIsNull",
185 return_value,
186 "Invalid argument",
187 napi_invalid_arg,
188 napi_set_element(NULL, object, 0, object));
189
190 napi_set_element(env, NULL, 0, object);
191 add_last_status(env, "objectIsNull", return_value);
192
193 napi_set_property(env, object, 0, NULL);
194 add_last_status(env, "valueIsNull", return_value);
195
196 return return_value;
197 }
198
GetElement(napi_env env, napi_callback_info info)199 static napi_value GetElement(napi_env env, napi_callback_info info) {
200 napi_value return_value, object, prop;
201
202 NODE_API_CALL(env, napi_create_object(env, &return_value));
203 NODE_API_CALL(env, napi_create_object(env, &object));
204
205 add_returned_status(env,
206 "envIsNull",
207 return_value,
208 "Invalid argument",
209 napi_invalid_arg,
210 napi_get_element(NULL, object, 0, &prop));
211
212 napi_get_property(env, NULL, 0, &prop);
213 add_last_status(env, "objectIsNull", return_value);
214
215 napi_get_property(env, object, 0, NULL);
216 add_last_status(env, "valueIsNull", return_value);
217
218 return return_value;
219 }
220
TestBoolValuedElementApi(napi_env env, napi_status (*api)(napi_env, napi_value, uint32_t, bool*))221 static napi_value TestBoolValuedElementApi(napi_env env,
222 napi_status (*api)(napi_env, napi_value, uint32_t, bool*)) {
223 napi_value return_value, object;
224 bool result;
225
226 NODE_API_CALL(env, napi_create_object(env, &return_value));
227 NODE_API_CALL(env, napi_create_object(env, &object));
228
229 add_returned_status(env,
230 "envIsNull",
231 return_value,
232 "Invalid argument",
233 napi_invalid_arg,
234 api(NULL, object, 0, &result));
235
236 api(env, NULL, 0, &result);
237 add_last_status(env, "objectIsNull", return_value);
238
239 api(env, object, 0, NULL);
240 add_last_status(env, "valueIsNull", return_value);
241
242 return return_value;
243 }
244
HasElement(napi_env env, napi_callback_info info)245 static napi_value HasElement(napi_env env, napi_callback_info info) {
246 return TestBoolValuedElementApi(env, napi_has_element);
247 }
248
DeleteElement(napi_env env, napi_callback_info info)249 static napi_value DeleteElement(napi_env env, napi_callback_info info) {
250 return TestBoolValuedElementApi(env, napi_delete_element);
251 }
252
DefineProperties(napi_env env, napi_callback_info info)253 static napi_value DefineProperties(napi_env env, napi_callback_info info) {
254 napi_value object, return_value;
255
256 napi_property_descriptor desc = {
257 "prop", NULL, DefineProperties, NULL, NULL, NULL, napi_enumerable, NULL
258 };
259
260 NODE_API_CALL(env, napi_create_object(env, &object));
261 NODE_API_CALL(env, napi_create_object(env, &return_value));
262
263 add_returned_status(env,
264 "envIsNull",
265 return_value,
266 "Invalid argument",
267 napi_invalid_arg,
268 napi_define_properties(NULL, object, 1, &desc));
269
270 napi_define_properties(env, NULL, 1, &desc);
271 add_last_status(env, "objectIsNull", return_value);
272
273 napi_define_properties(env, object, 1, NULL);
274 add_last_status(env, "descriptorListIsNull", return_value);
275
276 desc.utf8name = NULL;
277 napi_define_properties(env, object, 1, NULL);
278 add_last_status(env, "utf8nameIsNull", return_value);
279 desc.utf8name = "prop";
280
281 desc.method = NULL;
282 napi_define_properties(env, object, 1, NULL);
283 add_last_status(env, "methodIsNull", return_value);
284 desc.method = DefineProperties;
285
286 return return_value;
287 }
288
GetPropertyNames(napi_env env, napi_callback_info info)289 static napi_value GetPropertyNames(napi_env env, napi_callback_info info) {
290 napi_value return_value, props;
291
292 NODE_API_CALL(env, napi_create_object(env, &return_value));
293
294 add_returned_status(env,
295 "envIsNull",
296 return_value,
297 "Invalid argument",
298 napi_invalid_arg,
299 napi_get_property_names(NULL, return_value, &props));
300
301 napi_get_property_names(env, NULL, &props);
302 add_last_status(env, "objectIsNull", return_value);
303
304 napi_get_property_names(env, return_value, NULL);
305 add_last_status(env, "valueIsNull", return_value);
306
307 return return_value;
308 }
309
GetAllPropertyNames(napi_env env, napi_callback_info info)310 static napi_value GetAllPropertyNames(napi_env env, napi_callback_info info) {
311 napi_value return_value, props;
312
313 NODE_API_CALL(env, napi_create_object(env, &return_value));
314
315 add_returned_status(env,
316 "envIsNull",
317 return_value,
318 "Invalid argument",
319 napi_invalid_arg,
320 napi_get_all_property_names(NULL,
321 return_value,
322 napi_key_own_only,
323 napi_key_writable,
324 napi_key_keep_numbers,
325 &props));
326
327 napi_get_all_property_names(env,
328 NULL,
329 napi_key_own_only,
330 napi_key_writable,
331 napi_key_keep_numbers,
332 &props);
333 add_last_status(env, "objectIsNull", return_value);
334
335 napi_get_all_property_names(env,
336 return_value,
337 napi_key_own_only,
338 napi_key_writable,
339 napi_key_keep_numbers,
340 NULL);
341 add_last_status(env, "valueIsNull", return_value);
342
343 return return_value;
344 }
345
GetPrototype(napi_env env, napi_callback_info info)346 static napi_value GetPrototype(napi_env env, napi_callback_info info) {
347 napi_value return_value, proto;
348
349 NODE_API_CALL(env, napi_create_object(env, &return_value));
350
351 add_returned_status(env,
352 "envIsNull",
353 return_value,
354 "Invalid argument",
355 napi_invalid_arg,
356 napi_get_prototype(NULL, return_value, &proto));
357
358 napi_get_prototype(env, NULL, &proto);
359 add_last_status(env, "objectIsNull", return_value);
360
361 napi_get_prototype(env, return_value, NULL);
362 add_last_status(env, "valueIsNull", return_value);
363
364 return return_value;
365 }
366
init_test_null(napi_env env, napi_value exports)367 void init_test_null(napi_env env, napi_value exports) {
368 napi_value test_null;
369
370 const napi_property_descriptor test_null_props[] = {
371 DECLARE_NODE_API_PROPERTY("setProperty", SetProperty),
372 DECLARE_NODE_API_PROPERTY("getProperty", GetProperty),
373 DECLARE_NODE_API_PROPERTY("hasProperty", HasProperty),
374 DECLARE_NODE_API_PROPERTY("hasOwnProperty", HasOwnProperty),
375 DECLARE_NODE_API_PROPERTY("deleteProperty", DeleteProperty),
376 DECLARE_NODE_API_PROPERTY("setNamedProperty", SetNamedProperty),
377 DECLARE_NODE_API_PROPERTY("getNamedProperty", GetNamedProperty),
378 DECLARE_NODE_API_PROPERTY("hasNamedProperty", HasNamedProperty),
379 DECLARE_NODE_API_PROPERTY("setElement", SetElement),
380 DECLARE_NODE_API_PROPERTY("getElement", GetElement),
381 DECLARE_NODE_API_PROPERTY("hasElement", HasElement),
382 DECLARE_NODE_API_PROPERTY("deleteElement", DeleteElement),
383 DECLARE_NODE_API_PROPERTY("defineProperties", DefineProperties),
384 DECLARE_NODE_API_PROPERTY("getPropertyNames", GetPropertyNames),
385 DECLARE_NODE_API_PROPERTY("getAllPropertyNames", GetAllPropertyNames),
386 DECLARE_NODE_API_PROPERTY("getPrototype", GetPrototype),
387 };
388
389 NODE_API_CALL_RETURN_VOID(env, napi_create_object(env, &test_null));
390 NODE_API_CALL_RETURN_VOID(env, napi_define_properties(
391 env, test_null, sizeof(test_null_props) / sizeof(*test_null_props),
392 test_null_props));
393
394 const napi_property_descriptor test_null_set = {
395 "testNull", NULL, NULL, NULL, NULL, test_null, napi_enumerable, NULL
396 };
397
398 NODE_API_CALL_RETURN_VOID(env,
399 napi_define_properties(env, exports, 1, &test_null_set));
400 }
401