Skip to content

Commit

Permalink
n-api: test uint32 truncation
Browse files Browse the repository at this point in the history
Re: nodejs/abi-stable-node#55 (comment)
PR-URL: #21722
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
  • Loading branch information
Gabriel Schulhof committed Jul 12, 2018
1 parent fcfd3e1 commit acf0606
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
14 changes: 14 additions & 0 deletions test/addons-napi/test_number/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
23 changes: 23 additions & 0 deletions test/addons-napi/test_number/test_number.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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),
};

Expand Down

0 comments on commit acf0606

Please sign in to comment.