From acf0606f72825d6be975d449096352d3652cfced Mon Sep 17 00:00:00 2001 From: Gabriel Schulhof Date: Mon, 9 Jul 2018 11:41:58 -0400 Subject: [PATCH] n-api: test uint32 truncation Re: https://github.com/nodejs/abi-stable-node/issues/55#issuecomment-403382424 PR-URL: https://github.com/nodejs/node/pull/21722 Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Michael Dawson --- test/addons-napi/test_number/test.js | 14 +++++++++++++ test/addons-napi/test_number/test_number.c | 23 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/test/addons-napi/test_number/test.js b/test/addons-napi/test_number/test.js index 6c04a222cb4eb6..34f48aee578ac6 100644 --- a/test/addons-napi/test_number/test.js +++ b/test/addons-napi/test_number/test.js @@ -35,6 +35,20 @@ testNumber(Number.POSITIVE_INFINITY); testNumber(Number.NEGATIVE_INFINITY); testNumber(Number.NaN); +function testUint32(input, expected = input) { + assert.strictEqual(expected, test_number.TestUint32Truncation(input)); +} + +// Test zero +testUint32(0.0, 0); +testUint32(-0.0, 0); + +// Test overflow scenarios +testUint32(4294967295); +testUint32(4294967296, 0); +testUint32(4294967297, 1); +testUint32(17 * 4294967296 + 1, 1); + // validate documented behavior when value is retrieved as 32-bit integer with // `napi_get_value_int32` function testInt32(input, expected = input) { diff --git a/test/addons-napi/test_number/test_number.c b/test/addons-napi/test_number/test_number.c index 19b0ae83f051df..63290bf6d64d7e 100644 --- a/test/addons-napi/test_number/test_number.c +++ b/test/addons-napi/test_number/test_number.c @@ -23,6 +23,28 @@ static napi_value Test(napi_env env, napi_callback_info info) { return output; } +static napi_value TestUint32Truncation(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments"); + + napi_valuetype valuetype0; + NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0)); + + NAPI_ASSERT(env, valuetype0 == napi_number, + "Wrong type of arguments. Expects a number as first argument."); + + uint32_t input; + NAPI_CALL(env, napi_get_value_uint32(env, args[0], &input)); + + napi_value output; + NAPI_CALL(env, napi_create_uint32(env, input, &output)); + + return output; +} + static napi_value TestInt32Truncation(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1]; @@ -71,6 +93,7 @@ static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor descriptors[] = { DECLARE_NAPI_PROPERTY("Test", Test), DECLARE_NAPI_PROPERTY("TestInt32Truncation", TestInt32Truncation), + DECLARE_NAPI_PROPERTY("TestUint32Truncation", TestUint32Truncation), DECLARE_NAPI_PROPERTY("TestInt64Truncation", TestInt64Truncation), };