@@ -31,6 +31,19 @@ assert.strictEqual(convertToInt(-0.5, 64), 0);
3131assert . strictEqual ( convertToInt ( - 0.5 , 64 , 'signed' ) , 0 ) ;
3232assert . strictEqual ( convertToInt ( - 1.5 , 64 , 'signed' ) , - 1 ) ;
3333
34+ {
35+ const options = {
36+ get enforceRange ( ) {
37+ throw new Error ( 'enforceRange should not be read' ) ;
38+ } ,
39+ get clamp ( ) {
40+ throw new Error ( 'clamp should not be read' ) ;
41+ } ,
42+ } ;
43+
44+ assert . strictEqual ( convertToInt ( 7 , 8 , 'unsigned' , options ) , 7 ) ;
45+ }
46+
3447{
3548 const opts = {
3649 __proto__ : null ,
@@ -215,6 +228,12 @@ assert.strictEqual(convertToInt(Number.MAX_SAFE_INTEGER, 64, 'signed', {
215228assert . strictEqual ( convertToInt ( Number . MIN_SAFE_INTEGER , 64 , 'signed' , {
216229 enforceRange : true ,
217230} ) , Number . MIN_SAFE_INTEGER ) ;
231+ assert . strictEqual ( convertToInt ( - 0.5 , 8 , 'unsigned' , {
232+ enforceRange : true ,
233+ } ) , 0 ) ;
234+ assert . strictEqual ( convertToInt ( 255.5 , 8 , 'unsigned' , {
235+ enforceRange : true ,
236+ } ) , 255 ) ;
218237
219238const outOfRangeValues = [ 2 ** 53 , - ( 2 ** 53 ) ] ;
220239for ( const value of outOfRangeValues ) {
@@ -237,14 +256,74 @@ assert.throws(() => convertToInt(Number.MIN_SAFE_INTEGER - 1, 64, 'signed', {
237256 name : 'TypeError' ,
238257 code : 'ERR_OUT_OF_RANGE' ,
239258} ) ;
259+ assert . throws ( ( ) => convertToInt ( 256 , 8 , 'unsigned' , {
260+ enforceRange : true ,
261+ } ) , {
262+ name : 'TypeError' ,
263+ code : 'ERR_OUT_OF_RANGE' ,
264+ } ) ;
265+
266+ {
267+ const calls = [ ] ;
268+ const options = {
269+ get enforceRange ( ) {
270+ calls . push ( 'enforceRange' ) ;
271+ return true ;
272+ } ,
273+ get clamp ( ) {
274+ calls . push ( 'clamp' ) ;
275+ return true ;
276+ } ,
277+ } ;
278+
279+ assert . strictEqual ( convertToInt ( 1.5 , 8 , 'unsigned' , options ) , 1 ) ;
280+ assert . deepStrictEqual ( calls , [ 'enforceRange' ] ) ;
281+ }
282+
283+ {
284+ const calls = [ ] ;
285+ const options = {
286+ get enforceRange ( ) {
287+ calls . push ( 'enforceRange' ) ;
288+ return true ;
289+ } ,
290+ get clamp ( ) {
291+ calls . push ( 'clamp' ) ;
292+ return true ;
293+ } ,
294+ } ;
295+
296+ assert . strictEqual ( convertToInt ( 255.5 , 8 , 'unsigned' , options ) , 255 ) ;
297+ assert . deepStrictEqual ( calls , [ 'enforceRange' ] ) ;
298+ }
299+
300+ {
301+ const calls = [ ] ;
302+ const options = {
303+ get enforceRange ( ) {
304+ calls . push ( 'enforceRange' ) ;
305+ return false ;
306+ } ,
307+ get clamp ( ) {
308+ calls . push ( 'clamp' ) ;
309+ return true ;
310+ } ,
311+ } ;
312+
313+ assert . strictEqual ( convertToInt ( 256 , 8 , 'unsigned' , options ) , 255 ) ;
314+ assert . deepStrictEqual ( calls , [ 'enforceRange' , 'clamp' ] ) ;
315+ }
240316
241317// Out of range: clamp
242318assert . strictEqual ( convertToInt ( NaN , 64 , 'unsigned' , { clamp : true } ) , 0 ) ;
243319assert . strictEqual ( convertToInt ( Infinity , 64 , 'unsigned' , { clamp : true } ) , Number . MAX_SAFE_INTEGER ) ;
244320assert . strictEqual ( convertToInt ( - Infinity , 64 , 'unsigned' , { clamp : true } ) , 0 ) ;
245321assert . strictEqual ( convertToInt ( - Infinity , 64 , 'signed' , { clamp : true } ) , Number . MIN_SAFE_INTEGER ) ;
322+ assert . strictEqual ( convertToInt ( 0x1_0000 , 16 , 'unsigned' , { clamp : true } ) , 0xFFFF ) ;
246323assert . strictEqual ( convertToInt ( 0x1_0000_0000 , 32 , 'unsigned' , { clamp : true } ) , 0xFFFF_FFFF ) ;
247324assert . strictEqual ( convertToInt ( 0xFFFF_FFFF , 32 , 'unsigned' , { clamp : true } ) , 0xFFFF_FFFF ) ;
325+ assert . strictEqual ( convertToInt ( 0x8000 , 16 , 'signed' , { clamp : true } ) , 0x7FFF ) ;
326+ assert . strictEqual ( convertToInt ( - 0x8001 , 16 , 'signed' , { clamp : true } ) , - 0x8000 ) ;
248327assert . strictEqual ( convertToInt ( 0x8000_0000 , 32 , 'signed' , { clamp : true } ) , 0x7FFF_FFFF ) ;
249328assert . strictEqual ( convertToInt ( 0xFFFF_FFFF , 32 , 'signed' , { clamp : true } ) , 0x7FFF_FFFF ) ;
250329assert . strictEqual ( convertToInt ( 0.5 , 64 , 'unsigned' , { clamp : true } ) , 0 ) ;
@@ -261,6 +340,10 @@ assert.strictEqual(convertToInt(Infinity, 64), 0);
261340assert . strictEqual ( convertToInt ( - Infinity , 64 ) , 0 ) ;
262341assert . strictEqual ( convertToInt ( - 3 , 8 ) , 253 ) ;
263342assert . strictEqual ( convertToInt ( - 3 , 8 ) , new Uint8Array ( [ - 3 ] ) [ 0 ] ) ;
343+ assert . strictEqual ( convertToInt ( 0x1_0000 , 16 ) , 0 ) ;
344+ assert . strictEqual ( convertToInt ( 0x1_0001 , 16 ) , 1 ) ;
345+ assert . strictEqual ( convertToInt ( - 1 , 16 ) , 0xFFFF ) ;
346+ assert . strictEqual ( convertToInt ( - 1 , 16 ) , new Uint16Array ( [ - 1 ] ) [ 0 ] ) ;
264347assert . strictEqual ( convertToInt ( 0x1_0000_0000 , 32 ) , 0 ) ;
265348assert . strictEqual ( convertToInt ( 0x1_0000_0001 , 32 ) , 1 ) ;
266349assert . strictEqual ( convertToInt ( 0xFFFF_FFFF , 32 ) , 0xFFFF_FFFF ) ;
@@ -274,6 +357,10 @@ assert.strictEqual(convertToInt(-(two64 + 2 ** 12), 64),
274357 two64 - 2 ** 12 ) ;
275358
276359// Out of range, step 11.
360+ assert . strictEqual ( convertToInt ( 0x8000 , 16 , 'signed' ) , - 0x8000 ) ;
361+ assert . strictEqual ( convertToInt ( 0xFFFF , 16 , 'signed' ) , - 1 ) ;
362+ assert . strictEqual ( convertToInt ( - 0x8001 , 16 , 'signed' ) , 0x7FFF ) ;
363+ assert . strictEqual ( convertToInt ( - 0x8001 , 16 , 'signed' ) , new Int16Array ( [ - 0x8001 ] ) [ 0 ] ) ;
277364assert . strictEqual ( convertToInt ( 0x8000_0000 , 32 , 'signed' ) , - 0x8000_0000 ) ;
278365assert . strictEqual ( convertToInt ( 0xFFF_FFFF , 32 , 'signed' ) , 0xFFF_FFFF ) ;
279366assert . strictEqual ( convertToInt ( - 200 , 8 , 'signed' ) , 56 ) ;
0 commit comments