summaryrefslogtreecommitdiff
path: root/test/js-native-api/test_typedarray
diff options
context:
space:
mode:
authorGabriel Schulhof <gabriel.schulhof@intel.com>2018-11-17 12:34:54 -0800
committerGabriel Schulhof <gabriel.schulhof@intel.com>2018-12-04 13:58:17 -0800
commit938e11882b96e19b443477571455088baaa054d8 (patch)
treeeb828a60957a2881995ba9a83f44a32a18fbff16 /test/js-native-api/test_typedarray
parent83ee137c4565112177f22f2c735b266b22262220 (diff)
downloadandroid-node-v8-938e11882b96e19b443477571455088baaa054d8.tar.gz
android-node-v8-938e11882b96e19b443477571455088baaa054d8.tar.bz2
android-node-v8-938e11882b96e19b443477571455088baaa054d8.zip
test: partition N-API tests
Partition test/addons-napi into test/js-native-api and test/node-api to isolate the Node.js-agnostic portion of the N-API tests from the Node.js-specific portion. PR-URL: https://github.com/nodejs/node/pull/24557 Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Diffstat (limited to 'test/js-native-api/test_typedarray')
-rw-r--r--test/js-native-api/test_typedarray/binding.gyp11
-rw-r--r--test/js-native-api/test_typedarray/test.js76
-rw-r--r--test/js-native-api/test_typedarray/test_typedarray.c181
3 files changed, 268 insertions, 0 deletions
diff --git a/test/js-native-api/test_typedarray/binding.gyp b/test/js-native-api/test_typedarray/binding.gyp
new file mode 100644
index 0000000000..0caf90049c
--- /dev/null
+++ b/test/js-native-api/test_typedarray/binding.gyp
@@ -0,0 +1,11 @@
+{
+ "targets": [
+ {
+ "target_name": "test_typedarray",
+ "sources": [
+ "../entry_point.c",
+ "test_typedarray.c"
+ ]
+ }
+ ]
+}
diff --git a/test/js-native-api/test_typedarray/test.js b/test/js-native-api/test_typedarray/test.js
new file mode 100644
index 0000000000..2a8cf18feb
--- /dev/null
+++ b/test/js-native-api/test_typedarray/test.js
@@ -0,0 +1,76 @@
+'use strict';
+const common = require('../../common');
+const assert = require('assert');
+
+// Testing api calls for arrays
+const test_typedarray = require(`./build/${common.buildType}/test_typedarray`);
+
+const byteArray = new Uint8Array(3);
+byteArray[0] = 0;
+byteArray[1] = 1;
+byteArray[2] = 2;
+assert.strictEqual(byteArray.length, 3);
+
+const doubleArray = new Float64Array(3);
+doubleArray[0] = 0.0;
+doubleArray[1] = 1.1;
+doubleArray[2] = 2.2;
+assert.strictEqual(doubleArray.length, 3);
+
+const byteResult = test_typedarray.Multiply(byteArray, 3);
+assert.ok(byteResult instanceof Uint8Array);
+assert.strictEqual(byteResult.length, 3);
+assert.strictEqual(byteResult[0], 0);
+assert.strictEqual(byteResult[1], 3);
+assert.strictEqual(byteResult[2], 6);
+
+const doubleResult = test_typedarray.Multiply(doubleArray, -3);
+assert.ok(doubleResult instanceof Float64Array);
+assert.strictEqual(doubleResult.length, 3);
+assert.strictEqual(doubleResult[0], -0);
+assert.strictEqual(Math.round(10 * doubleResult[1]) / 10, -3.3);
+assert.strictEqual(Math.round(10 * doubleResult[2]) / 10, -6.6);
+
+const externalResult = test_typedarray.External();
+assert.ok(externalResult instanceof Int8Array);
+assert.strictEqual(externalResult.length, 3);
+assert.strictEqual(externalResult[0], 0);
+assert.strictEqual(externalResult[1], 1);
+assert.strictEqual(externalResult[2], 2);
+
+// validate creation of all kinds of TypedArrays
+const buffer = new ArrayBuffer(128);
+const arrayTypes = [ Int8Array, Uint8Array, Uint8ClampedArray, Int16Array,
+ Uint16Array, Int32Array, Uint32Array, Float32Array,
+ Float64Array, BigInt64Array, BigUint64Array ];
+
+arrayTypes.forEach((currentType) => {
+ const template = Reflect.construct(currentType, buffer);
+ const theArray = test_typedarray.CreateTypedArray(template, buffer);
+
+ assert.ok(theArray instanceof currentType,
+ 'Type of new array should match that of the template. ' +
+ `Expected type: ${currentType.name}, ` +
+ `actual type: ${template.constructor.name}`);
+ assert.notStrictEqual(theArray, template);
+ assert.strictEqual(theArray.buffer, buffer);
+});
+
+arrayTypes.forEach((currentType) => {
+ const template = Reflect.construct(currentType, buffer);
+ assert.throws(() => {
+ test_typedarray.CreateTypedArray(template, buffer, 0, 136);
+ }, RangeError);
+});
+
+const nonByteArrayTypes = [ Int16Array, Uint16Array, Int32Array, Uint32Array,
+ Float32Array, Float64Array,
+ BigInt64Array, BigUint64Array ];
+nonByteArrayTypes.forEach((currentType) => {
+ const template = Reflect.construct(currentType, buffer);
+ assert.throws(() => {
+ test_typedarray.CreateTypedArray(template, buffer,
+ currentType.BYTES_PER_ELEMENT + 1, 1);
+ console.log(`start of offset ${currentType}`);
+ }, RangeError);
+});
diff --git a/test/js-native-api/test_typedarray/test_typedarray.c b/test/js-native-api/test_typedarray/test_typedarray.c
new file mode 100644
index 0000000000..98480a4ea2
--- /dev/null
+++ b/test/js-native-api/test_typedarray/test_typedarray.c
@@ -0,0 +1,181 @@
+#include <js_native_api.h>
+#include <string.h>
+#include "../common.h"
+
+static napi_value Multiply(napi_env env, napi_callback_info info) {
+ size_t argc = 2;
+ napi_value args[2];
+ NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
+
+ NAPI_ASSERT(env, argc == 2, "Wrong number of arguments");
+
+ napi_valuetype valuetype0;
+ NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0));
+
+ NAPI_ASSERT(env, valuetype0 == napi_object,
+ "Wrong type of arguments. Expects a typed array as first argument.");
+
+ napi_value input_array = args[0];
+ bool is_typedarray;
+ NAPI_CALL(env, napi_is_typedarray(env, input_array, &is_typedarray));
+
+ NAPI_ASSERT(env, is_typedarray,
+ "Wrong type of arguments. Expects a typed array as first argument.");
+
+ napi_valuetype valuetype1;
+ NAPI_CALL(env, napi_typeof(env, args[1], &valuetype1));
+
+ NAPI_ASSERT(env, valuetype1 == napi_number,
+ "Wrong type of arguments. Expects a number as second argument.");
+
+ double multiplier;
+ NAPI_CALL(env, napi_get_value_double(env, args[1], &multiplier));
+
+ napi_typedarray_type type;
+ napi_value input_buffer;
+ size_t byte_offset;
+ size_t i, length;
+ NAPI_CALL(env, napi_get_typedarray_info(
+ env, input_array, &type, &length, NULL, &input_buffer, &byte_offset));
+
+ void* data;
+ size_t byte_length;
+ NAPI_CALL(env, napi_get_arraybuffer_info(
+ env, input_buffer, &data, &byte_length));
+
+ napi_value output_buffer;
+ void* output_ptr = NULL;
+ NAPI_CALL(env, napi_create_arraybuffer(
+ env, byte_length, &output_ptr, &output_buffer));
+
+ napi_value output_array;
+ NAPI_CALL(env, napi_create_typedarray(
+ env, type, length, output_buffer, byte_offset, &output_array));
+
+ if (type == napi_uint8_array) {
+ uint8_t* input_bytes = (uint8_t*)(data) + byte_offset;
+ uint8_t* output_bytes = (uint8_t*)(output_ptr);
+ for (i = 0; i < length; i++) {
+ output_bytes[i] = (uint8_t)(input_bytes[i] * multiplier);
+ }
+ } else if (type == napi_float64_array) {
+ double* input_doubles = (double*)((uint8_t*)(data) + byte_offset);
+ double* output_doubles = (double*)(output_ptr);
+ for (i = 0; i < length; i++) {
+ output_doubles[i] = input_doubles[i] * multiplier;
+ }
+ } else {
+ napi_throw_error(env, NULL,
+ "Typed array was of a type not expected by test.");
+ return NULL;
+ }
+
+ return output_array;
+}
+
+static napi_value External(napi_env env, napi_callback_info info) {
+ static int8_t externalData[] = {0, 1, 2};
+
+ napi_value output_buffer;
+ NAPI_CALL(env, napi_create_external_arraybuffer(
+ env,
+ externalData,
+ sizeof(externalData),
+ NULL, // finalize_callback
+ NULL, // finalize_hint
+ &output_buffer));
+
+ napi_value output_array;
+ NAPI_CALL(env, napi_create_typedarray(env,
+ napi_int8_array,
+ sizeof(externalData) / sizeof(int8_t),
+ output_buffer,
+ 0,
+ &output_array));
+
+ return output_array;
+}
+
+static napi_value CreateTypedArray(napi_env env, napi_callback_info info) {
+ size_t argc = 4;
+ napi_value args[4];
+ NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
+
+ NAPI_ASSERT(env, argc == 2 || argc == 4, "Wrong number of arguments");
+
+ napi_value input_array = args[0];
+ napi_valuetype valuetype0;
+ NAPI_CALL(env, napi_typeof(env, input_array, &valuetype0));
+
+ NAPI_ASSERT(env, valuetype0 == napi_object,
+ "Wrong type of arguments. Expects a typed array as first argument.");
+
+ bool is_typedarray;
+ NAPI_CALL(env, napi_is_typedarray(env, input_array, &is_typedarray));
+
+ NAPI_ASSERT(env, is_typedarray,
+ "Wrong type of arguments. Expects a typed array as first argument.");
+
+ napi_valuetype valuetype1;
+ napi_value input_buffer = args[1];
+ NAPI_CALL(env, napi_typeof(env, input_buffer, &valuetype1));
+
+ NAPI_ASSERT(env, valuetype1 == napi_object,
+ "Wrong type of arguments. Expects an array buffer as second argument.");
+
+ bool is_arraybuffer;
+ NAPI_CALL(env, napi_is_arraybuffer(env, input_buffer, &is_arraybuffer));
+
+ NAPI_ASSERT(env, is_arraybuffer,
+ "Wrong type of arguments. Expects an array buffer as second argument.");
+
+ napi_typedarray_type type;
+ napi_value in_array_buffer;
+ size_t byte_offset;
+ size_t length;
+ NAPI_CALL(env, napi_get_typedarray_info(
+ env, input_array, &type, &length, NULL, &in_array_buffer, &byte_offset));
+
+ if (argc == 4) {
+ napi_valuetype valuetype2;
+ NAPI_CALL(env, napi_typeof(env, args[2], &valuetype2));
+
+ NAPI_ASSERT(env, valuetype2 == napi_number,
+ "Wrong type of arguments. Expects a number as third argument.");
+
+ uint32_t uint32_length;
+ NAPI_CALL(env, napi_get_value_uint32(env, args[2], &uint32_length));
+ length = uint32_length;
+
+ napi_valuetype valuetype3;
+ NAPI_CALL(env, napi_typeof(env, args[3], &valuetype3));
+
+ NAPI_ASSERT(env, valuetype3 == napi_number,
+ "Wrong type of arguments. Expects a number as third argument.");
+
+ uint32_t uint32_byte_offset;
+ NAPI_CALL(env, napi_get_value_uint32(env, args[3], &uint32_byte_offset));
+ byte_offset = uint32_byte_offset;
+ }
+
+ napi_value output_array;
+ NAPI_CALL(env, napi_create_typedarray(
+ env, type, length, input_buffer, byte_offset, &output_array));
+
+ return output_array;
+}
+
+EXTERN_C_START
+napi_value Init(napi_env env, napi_value exports) {
+ napi_property_descriptor descriptors[] = {
+ DECLARE_NAPI_PROPERTY("Multiply", Multiply),
+ DECLARE_NAPI_PROPERTY("External", External),
+ DECLARE_NAPI_PROPERTY("CreateTypedArray", CreateTypedArray),
+ };
+
+ NAPI_CALL(env, napi_define_properties(
+ env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors));
+
+ return exports;
+}
+EXTERN_C_END