#include #include "../common.h" #include "test_null.h" #define GEN_NULL_CHECK_BINDING(binding_name, output_type, api) \ static napi_value binding_name(napi_env env, napi_callback_info info) { \ napi_value return_value; \ output_type result; \ NODE_API_CALL(env, napi_create_object(env, &return_value)); \ add_returned_status(env, \ "envIsNull", \ return_value, \ "Invalid argument", \ napi_invalid_arg, \ api(NULL, return_value, &result)); \ api(env, NULL, &result); \ add_last_status(env, "valueIsNull", return_value); \ api(env, return_value, NULL); \ add_last_status(env, "resultIsNull", return_value); \ api(env, return_value, &result); \ add_last_status(env, "inputTypeCheck", return_value); \ return return_value; \ } GEN_NULL_CHECK_BINDING(GetValueBool, bool, napi_get_value_bool) GEN_NULL_CHECK_BINDING(GetValueInt32, int32_t, napi_get_value_int32) GEN_NULL_CHECK_BINDING(GetValueUint32, uint32_t, napi_get_value_uint32) GEN_NULL_CHECK_BINDING(GetValueInt64, int64_t, napi_get_value_int64) GEN_NULL_CHECK_BINDING(GetValueDouble, double, napi_get_value_double) GEN_NULL_CHECK_BINDING(CoerceToBool, napi_value, napi_coerce_to_bool) GEN_NULL_CHECK_BINDING(CoerceToObject, napi_value, napi_coerce_to_object) GEN_NULL_CHECK_BINDING(CoerceToString, napi_value, napi_coerce_to_string) #define GEN_NULL_CHECK_STRING_BINDING(binding_name, arg_type, api) \ static napi_value binding_name(napi_env env, napi_callback_info info) { \ napi_value return_value; \ NODE_API_CALL(env, napi_create_object(env, &return_value)); \ arg_type buf1[4]; \ size_t length1 = 3; \ add_returned_status(env, \ "envIsNull", \ return_value, \ "Invalid argument", \ napi_invalid_arg, \ api(NULL, return_value, buf1, length1, &length1)); \ arg_type buf2[4]; \ size_t length2 = 3; \ api(env, NULL, buf2, length2, &length2); \ add_last_status(env, "valueIsNull", return_value); \ api(env, return_value, NULL, 3, NULL); \ add_last_status(env, "wrongTypeIn", return_value); \ napi_value string; \ NODE_API_CALL(env, \ napi_create_string_utf8(env, \ "Something", \ NAPI_AUTO_LENGTH, \ &string)); \ api(env, string, NULL, 3, NULL); \ add_last_status(env, "bufAndOutLengthIsNull", return_value); \ return return_value; \ } GEN_NULL_CHECK_STRING_BINDING(GetValueStringUtf8, char, napi_get_value_string_utf8) GEN_NULL_CHECK_STRING_BINDING(GetValueStringLatin1, char, napi_get_value_string_latin1) GEN_NULL_CHECK_STRING_BINDING(GetValueStringUtf16, char16_t, napi_get_value_string_utf16) void init_test_null(napi_env env, napi_value exports) { napi_value test_null; const napi_property_descriptor test_null_props[] = { DECLARE_NODE_API_PROPERTY("getValueBool", GetValueBool), DECLARE_NODE_API_PROPERTY("getValueInt32", GetValueInt32), DECLARE_NODE_API_PROPERTY("getValueUint32", GetValueUint32), DECLARE_NODE_API_PROPERTY("getValueInt64", GetValueInt64), DECLARE_NODE_API_PROPERTY("getValueDouble", GetValueDouble), DECLARE_NODE_API_PROPERTY("coerceToBool", CoerceToBool), DECLARE_NODE_API_PROPERTY("coerceToObject", CoerceToObject), DECLARE_NODE_API_PROPERTY("coerceToString", CoerceToString), DECLARE_NODE_API_PROPERTY("getValueStringUtf8", GetValueStringUtf8), DECLARE_NODE_API_PROPERTY("getValueStringLatin1", GetValueStringLatin1), DECLARE_NODE_API_PROPERTY("getValueStringUtf16", GetValueStringUtf16), }; NODE_API_CALL_RETURN_VOID(env, napi_create_object(env, &test_null)); NODE_API_CALL_RETURN_VOID(env, napi_define_properties( env, test_null, sizeof(test_null_props) / sizeof(*test_null_props), test_null_props)); const napi_property_descriptor test_null_set = { "testNull", NULL, NULL, NULL, NULL, test_null, napi_enumerable, NULL }; NODE_API_CALL_RETURN_VOID(env, napi_define_properties(env, exports, 1, &test_null_set)); }