Skip to content

Commit 30cd4a3

Browse files
JckXiamhdawson
authored andcommitted
test: add tests for .Data method
- add tests for .Data method to ensure the content is consistent PR-URL: #1203 Reviewed-By: Michael Dawson <[email protected]
1 parent 225ca35 commit 30cd4a3

File tree

2 files changed

+132
-10
lines changed

2 files changed

+132
-10
lines changed

test/typedarray.cc

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
#include <vector>
12
#include "napi.h"
2-
33
using namespace Napi;
44

55
#if defined(NAPI_HAS_CONSTEXPR)
@@ -179,6 +179,99 @@ Value GetTypedArrayType(const CallbackInfo& info) {
179179
}
180180
}
181181

182+
template <typename type>
183+
bool TypedArrayDataIsEquivalent(TypedArrayOf<type> arr,
184+
TypedArrayOf<type> inputArr) {
185+
if (arr.ElementLength() != inputArr.ElementLength()) {
186+
return false;
187+
}
188+
std::vector<type> bufferContent(arr.Data(), arr.Data() + arr.ElementLength());
189+
std::vector<type> inputContent(inputArr.Data(),
190+
inputArr.Data() + inputArr.ElementLength());
191+
if (bufferContent != inputContent) {
192+
return false;
193+
}
194+
return true;
195+
}
196+
197+
Value CheckBufferContent(const CallbackInfo& info) {
198+
TypedArray array = info[0].As<TypedArray>();
199+
200+
switch (array.TypedArrayType()) {
201+
case napi_int8_array:
202+
return Boolean::New(
203+
info.Env(),
204+
TypedArrayDataIsEquivalent<int8_t>(info[0].As<Int8Array>(),
205+
info[1].As<Int8Array>()));
206+
207+
break;
208+
case napi_uint8_array:
209+
return Boolean::New(
210+
info.Env(),
211+
TypedArrayDataIsEquivalent<int8_t>(info[0].As<Int8Array>(),
212+
info[1].As<Int8Array>()));
213+
214+
case napi_uint8_clamped_array:
215+
return Boolean::New(
216+
info.Env(),
217+
TypedArrayDataIsEquivalent<uint8_t>(info[0].As<Uint8Array>(),
218+
info[1].As<Uint8Array>()));
219+
220+
case napi_int16_array:
221+
return Boolean::New(
222+
info.Env(),
223+
TypedArrayDataIsEquivalent<int16_t>(info[0].As<Int16Array>(),
224+
info[1].As<Int16Array>()));
225+
226+
case napi_uint16_array:
227+
return Boolean::New(
228+
info.Env(),
229+
TypedArrayDataIsEquivalent<uint16_t>(info[0].As<Uint16Array>(),
230+
info[1].As<Uint16Array>()));
231+
232+
case napi_int32_array:
233+
return Boolean::New(
234+
info.Env(),
235+
TypedArrayDataIsEquivalent<int32_t>(info[0].As<Int32Array>(),
236+
info[1].As<Int32Array>()));
237+
238+
case napi_uint32_array:
239+
return Boolean::New(
240+
info.Env(),
241+
TypedArrayDataIsEquivalent<uint32_t>(info[0].As<Uint32Array>(),
242+
info[1].As<Uint32Array>()));
243+
244+
case napi_float32_array:
245+
return Boolean::New(
246+
info.Env(),
247+
TypedArrayDataIsEquivalent<float>(info[0].As<Float32Array>(),
248+
info[1].As<Float32Array>()));
249+
250+
case napi_float64_array:
251+
return Boolean::New(
252+
info.Env(),
253+
TypedArrayDataIsEquivalent<double>(info[0].As<Float64Array>(),
254+
info[1].As<Float64Array>()));
255+
256+
#if (NAPI_VERSION > 5)
257+
case napi_bigint64_array:
258+
return Boolean::New(
259+
info.Env(),
260+
TypedArrayDataIsEquivalent<int64_t>(info[0].As<BigInt64Array>(),
261+
info[1].As<BigInt64Array>()));
262+
263+
case napi_biguint64_array:
264+
return Boolean::New(
265+
info.Env(),
266+
TypedArrayDataIsEquivalent<uint64_t>(info[0].As<BigUint64Array>(),
267+
info[1].As<BigUint64Array>()));
268+
269+
#endif
270+
default:
271+
return Boolean::New(info.Env(), false);
272+
}
273+
}
274+
182275
Value GetTypedArrayLength(const CallbackInfo& info) {
183276
TypedArray array = info[0].As<TypedArray>();
184277
return Number::New(info.Env(), static_cast<double>(array.ElementLength()));
@@ -310,6 +403,7 @@ Object InitTypedArray(Env env) {
310403
exports["getTypedArrayBuffer"] = Function::New(env, GetTypedArrayBuffer);
311404
exports["getTypedArrayElement"] = Function::New(env, GetTypedArrayElement);
312405
exports["setTypedArrayElement"] = Function::New(env, SetTypedArrayElement);
406+
exports["checkBufferContent"] = Function::New(env, CheckBufferContent);
313407

314408
return exports;
315409
}

test/typedarray.js

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,42 @@ module.exports = require('./common').runTest(test);
66

77
function test (binding) {
88
const testData = [
9-
['int8', Int8Array, 1],
10-
['uint8', Uint8Array, 1],
11-
['uint8_clamped', Uint8ClampedArray, 1],
12-
['int16', Int16Array, 2],
13-
['uint16', Uint16Array, 2],
14-
['int32', Int32Array, 4],
15-
['uint32', Uint32Array, 4],
16-
['float32', Float32Array, 4],
17-
['float64', Float64Array, 8]
9+
['int8', Int8Array, 1, new Int8Array([0, 124, 24, 44])],
10+
['uint8', Uint8Array, 1, new Uint8Array([0, 255, 2, 14])],
11+
['uint8_clamped', Uint8ClampedArray, 1, new Uint8ClampedArray([0, 256, 0, 255])],
12+
['int16', Int16Array, 2, new Int16Array([-32768, 32767, 1234, 42])],
13+
['uint16', Uint16Array, 2, new Uint16Array([0, 65535, 4, 12])],
14+
['int32', Int32Array, 4, new Int32Array([Math.pow(2, 31), Math.pow(-2, 31), 255, 4])],
15+
['uint32', Uint32Array, 4, new Uint32Array([0, Math.pow(2, 32), 24, 125])],
16+
['float32', Float32Array, 4, new Float32Array([0, 21, 34, 45])],
17+
['float64', Float64Array, 8, new Float64Array([0, 4124, 45, 90])]
1818
];
1919

20+
const bigIntTests = [
21+
['bigint64', BigInt64Array, 8, new BigInt64Array([9007199254740991n, 9007199254740991n, 24n, 125n])],
22+
['biguint64', BigUint64Array, 8, new BigUint64Array([9007199254740991n, 9007199254740991n, 2345n, 345n])]
23+
];
24+
25+
bigIntTests.forEach(data => {
26+
const length = 4;
27+
const t = binding.typedarray.createTypedArray(data[0], length);
28+
assert.ok(t instanceof data[1]);
29+
assert.strictEqual(binding.typedarray.getTypedArrayType(t), data[0]);
30+
assert.strictEqual(binding.typedarray.getTypedArrayLength(t), length);
31+
assert.strictEqual(binding.typedarray.getTypedArraySize(t), data[2]);
32+
assert.strictEqual(binding.typedarray.getTypedArrayByteOffset(t), 0);
33+
assert.strictEqual(binding.typedarray.getTypedArrayByteLength(t), data[2] * length);
34+
35+
t[3] = 11n;
36+
assert.strictEqual(binding.typedarray.getTypedArrayElement(t, 3), 11n);
37+
binding.typedarray.setTypedArrayElement(t, 3, 22n);
38+
assert.strictEqual(binding.typedarray.getTypedArrayElement(t, 3), 22n);
39+
assert.strictEqual(t[3], 22n);
40+
41+
const nonEmptyTypedArray = binding.typedarray.createTypedArray(data[0], length, data[3].buffer);
42+
binding.typedarray.checkBufferContent(nonEmptyTypedArray, data[3]);
43+
});
44+
2045
testData.forEach(data => {
2146
try {
2247
const length = 4;
@@ -63,6 +88,9 @@ function test (binding) {
6388
assert.strictEqual(t[3], 22);
6489

6590
assert.strictEqual(binding.typedarray.getTypedArrayBuffer(t), b);
91+
92+
const nonEmptyTypedArray = binding.typedarray.createTypedArray(data[0], length, data[3].buffer);
93+
assert.strictEqual(binding.typedarray.checkBufferContent(nonEmptyTypedArray, data[3]), true);
6694
} catch (e) {
6795
console.log(data);
6896
throw e;

0 commit comments

Comments
 (0)