1'use strict'; 2 3require('../common'); 4const assert = require('assert'); 5 6const a = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]); 7const b = Buffer.from([5, 6, 7, 8, 9, 0, 1, 2, 3, 4]); 8 9assert.strictEqual(a.compare(b), -1); 10 11// Equivalent to a.compare(b). 12assert.strictEqual(a.compare(b, 0), -1); 13assert.throws(() => a.compare(b, '0'), { code: 'ERR_INVALID_ARG_TYPE' }); 14assert.strictEqual(a.compare(b, undefined), -1); 15 16// Equivalent to a.compare(b). 17assert.strictEqual(a.compare(b, 0, undefined, 0), -1); 18 19// Zero-length target, return 1 20assert.strictEqual(a.compare(b, 0, 0, 0), 1); 21assert.throws( 22 () => a.compare(b, 0, '0', '0'), 23 { code: 'ERR_INVALID_ARG_TYPE' } 24); 25 26// Equivalent to Buffer.compare(a, b.slice(6, 10)) 27assert.strictEqual(a.compare(b, 6, 10), 1); 28 29// Zero-length source, return -1 30assert.strictEqual(a.compare(b, 6, 10, 0, 0), -1); 31 32// Zero-length source and target, return 0 33assert.strictEqual(a.compare(b, 0, 0, 0, 0), 0); 34assert.strictEqual(a.compare(b, 1, 1, 2, 2), 0); 35 36// Equivalent to Buffer.compare(a.slice(4), b.slice(0, 5)) 37assert.strictEqual(a.compare(b, 0, 5, 4), 1); 38 39// Equivalent to Buffer.compare(a.slice(1), b.slice(5)) 40assert.strictEqual(a.compare(b, 5, undefined, 1), 1); 41 42// Equivalent to Buffer.compare(a.slice(2), b.slice(2, 4)) 43assert.strictEqual(a.compare(b, 2, 4, 2), -1); 44 45// Equivalent to Buffer.compare(a.slice(4), b.slice(0, 7)) 46assert.strictEqual(a.compare(b, 0, 7, 4), -1); 47 48// Equivalent to Buffer.compare(a.slice(4, 6), b.slice(0, 7)); 49assert.strictEqual(a.compare(b, 0, 7, 4, 6), -1); 50 51// Null is ambiguous. 52assert.throws( 53 () => a.compare(b, 0, null), 54 { code: 'ERR_INVALID_ARG_TYPE' } 55); 56 57// Values do not get coerced. 58assert.throws( 59 () => a.compare(b, 0, { valueOf: () => 5 }), 60 { code: 'ERR_INVALID_ARG_TYPE' } 61); 62 63// Infinity should not be coerced. 64assert.throws( 65 () => a.compare(b, Infinity, -Infinity), 66 { code: 'ERR_OUT_OF_RANGE' } 67); 68 69// Zero length target because default for targetEnd <= targetSource 70assert.strictEqual(a.compare(b, 0xff), 1); 71 72assert.throws( 73 () => a.compare(b, '0xff'), 74 { code: 'ERR_INVALID_ARG_TYPE' } 75); 76assert.throws( 77 () => a.compare(b, 0, '0xff'), 78 { code: 'ERR_INVALID_ARG_TYPE' } 79); 80 81const oor = { code: 'ERR_OUT_OF_RANGE' }; 82 83assert.throws(() => a.compare(b, 0, 100, 0), oor); 84assert.throws(() => a.compare(b, 0, 1, 0, 100), oor); 85assert.throws(() => a.compare(b, -1), oor); 86assert.throws(() => a.compare(b, 0, Infinity), oor); 87assert.throws(() => a.compare(b, 0, 1, -1), oor); 88assert.throws(() => a.compare(b, -Infinity, Infinity), oor); 89assert.throws(() => a.compare(), { 90 code: 'ERR_INVALID_ARG_TYPE', 91 name: 'TypeError', 92 message: 'The "target" argument must be an instance of ' + 93 'Buffer or Uint8Array. Received undefined' 94}); 95