33const assert = require ( 'assert' ) ;
44module . exports = require ( '../common' ) . runTest ( test ) ;
55
6+ let runSharedArrayBufferTests = true ;
7+
68function test ( binding ) {
79 function testDataViewCreation ( factory , arrayBuffer , offset , length ) {
810 const view = factory ( arrayBuffer , offset , length ) ;
911 offset = offset || 0 ;
10- assert . ok ( dataview . getArrayBuffer ( view ) instanceof ArrayBuffer ) ;
11- assert . strictEqual ( dataview . getArrayBuffer ( view ) , arrayBuffer ) ;
12+ if ( arrayBuffer instanceof ArrayBuffer ) {
13+ assert . ok ( dataview . getArrayBuffer ( view ) instanceof ArrayBuffer ) ;
14+ assert . strictEqual ( dataview . getArrayBuffer ( view ) , arrayBuffer ) ;
15+ } else {
16+ assert . ok ( dataview . getBuffer ( view ) instanceof SharedArrayBuffer ) ;
17+ assert . strictEqual ( dataview . getBuffer ( view ) , arrayBuffer ) ;
18+ }
1219 assert . strictEqual ( dataview . getByteOffset ( view ) , offset ) ;
1320 assert . strictEqual ( dataview . getByteLength ( view ) ,
1421 length || arrayBuffer . byteLength - offset ) ;
@@ -20,16 +27,48 @@ function test (binding) {
2027 } , RangeError ) ;
2128 }
2229
23- const dataview = binding . dataview ;
24- const arrayBuffer = new ArrayBuffer ( 10 ) ;
30+ const { hasSharedArrayBuffer, dataview } = binding ;
31+
32+ {
33+ const arrayBuffer = new ArrayBuffer ( 10 ) ;
34+
35+ testDataViewCreation ( dataview . createDataView , arrayBuffer ) ;
36+ testDataViewCreation ( dataview . createDataViewWithByteOffset , arrayBuffer , 2 ) ;
37+ testDataViewCreation ( dataview . createDataViewWithByteOffset , arrayBuffer , 10 ) ;
38+ testDataViewCreation ( dataview . createDataViewWithByteOffsetAndByteLength , arrayBuffer , 2 , 4 ) ;
39+ testDataViewCreation ( dataview . createDataViewWithByteOffsetAndByteLength , arrayBuffer , 10 , 0 ) ;
40+
41+ testInvalidRange ( dataview . createDataViewWithByteOffset , arrayBuffer , 11 ) ;
42+ testInvalidRange ( dataview . createDataViewWithByteOffsetAndByteLength , arrayBuffer , 11 , 0 ) ;
43+ testInvalidRange ( dataview . createDataViewWithByteOffsetAndByteLength , arrayBuffer , 6 , 5 ) ;
44+ }
45+
46+ if ( hasSharedArrayBuffer && runSharedArrayBufferTests ) {
47+ const sab = new SharedArrayBuffer ( 10 ) ;
2548
26- testDataViewCreation ( dataview . createDataView1 , arrayBuffer ) ;
27- testDataViewCreation ( dataview . createDataView2 , arrayBuffer , 2 ) ;
28- testDataViewCreation ( dataview . createDataView2 , arrayBuffer , 10 ) ;
29- testDataViewCreation ( dataview . createDataView3 , arrayBuffer , 2 , 4 ) ;
30- testDataViewCreation ( dataview . createDataView3 , arrayBuffer , 10 , 0 ) ;
49+ try {
50+ testDataViewCreation ( dataview . createDataViewOnSharedArrayBuffer , sab ) ;
51+ } catch ( ex ) {
52+ // The `napi_create_dataview` API does not have a valid `#define`
53+ // preprocessor guard for SharedArrayBuffer support, so it is
54+ // possible that the API is present but creating a DataView on
55+ // SharedArrayBuffer is not supported in the current version of Node.js.
56+ // In that case, we should skip the test instead of throwing.
57+ if ( ex . message === 'Invalid argument' ) {
58+ console . warn ( `The current version of Node.js (${ process . version } ) does not support creating DataViews on SharedArrayBuffers; skipping tests.` ) ;
59+ runSharedArrayBufferTests = false ;
60+ return ;
61+ }
3162
32- testInvalidRange ( dataview . createDataView2 , arrayBuffer , 11 ) ;
33- testInvalidRange ( dataview . createDataView3 , arrayBuffer , 11 , 0 ) ;
34- testInvalidRange ( dataview . createDataView3 , arrayBuffer , 6 , 5 ) ;
63+ throw ex ;
64+ }
65+ testDataViewCreation ( dataview . createDataViewOnSharedArrayBufferWithByteOffset , sab , 2 ) ;
66+ testDataViewCreation ( dataview . createDataViewOnSharedArrayBufferWithByteOffset , sab , 10 ) ;
67+ testDataViewCreation ( dataview . createDataViewOnSharedArrayBufferWithByteOffsetAndByteLength , sab , 2 , 4 ) ;
68+ testDataViewCreation ( dataview . createDataViewOnSharedArrayBufferWithByteOffsetAndByteLength , sab , 10 , 0 ) ;
69+
70+ testInvalidRange ( dataview . createDataViewOnSharedArrayBufferWithByteOffset , sab , 11 ) ;
71+ testInvalidRange ( dataview . createDataViewOnSharedArrayBufferWithByteOffsetAndByteLength , sab , 11 , 0 ) ;
72+ testInvalidRange ( dataview . createDataViewOnSharedArrayBufferWithByteOffsetAndByteLength , sab , 6 , 5 ) ;
73+ }
3574}
0 commit comments