diff --git a/index.js b/index.js
index 1d4b5ea..2731dea 100644
--- a/index.js
+++ b/index.js
@@ -405,7 +405,8 @@ Buffer.isEncoding = function isEncoding (encoding) {
 
 Buffer.concat = function concat (list, length) {
   if (!Array.isArray(list)) {
-    throw new TypeError('"list" argument must be an Array of Buffers')
+    throw new TypeError('The "list" argument must be one of type ' +
+      'Array, Buffer, or Uint8Array')
   }
 
   if (list.length === 0) {
@@ -438,7 +439,7 @@ Buffer.concat = function concat (list, length) {
         )
       }
     } else if (!Buffer.isBuffer(buf)) {
-      throw new TypeError('"list" argument must be an Array of Buffers')
+      throw new TypeError('The "list" argument must be one of type Array, Buffer, or Uint8Array')
     } else {
       buf.copy(buffer, pos)
     }
@@ -733,30 +734,41 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
   byteOffset = +byteOffset // Coerce to Number.
   if (numberIsNaN(byteOffset)) {
     // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
-    byteOffset = dir ? 0 : (buffer.length - 1)
+    // In Node.js the default value for lastindexOf is buffer.length -1. Using
+    // buffer.length instead leads to the same results, but makes the code
+    // simpler
+    byteOffset = dir ? 0 : buffer.length
   }
 
+  // If the offset is greater than the length of the buffer, it will fail,
+  // except if the given value is an empty one, then the offset is returned
+  var offsetGreaterLength = false
   // Normalize byteOffset: negative offsets start from the end of the buffer
   if (byteOffset < 0) byteOffset = buffer.length + byteOffset
   if (byteOffset >= buffer.length) {
-    if (dir) return -1
-    else byteOffset = buffer.length - 1
+    if (dir) offsetGreaterLength = true
+    byteOffset = buffer.length
   } else if (byteOffset < 0) {
     if (dir) byteOffset = 0
-    else return -1
+    else offsetGreaterLength = true
   }
 
   // Normalize val
   if (typeof val === 'string') {
     val = Buffer.from(val, encoding)
+  } else if (isInstance(val, Uint8Array)) {
+    val = Buffer.from(val, encoding)
+  }
+
+  // Special case: looking for empty string/buffer always passes
+  if (Buffer.isBuffer(val) && val.length === 0) {
+    return byteOffset
+  } else if (offsetGreaterLength) {
+    return -1
   }
 
   // Finally, search either indexOf (if dir is true) or lastIndexOf
   if (Buffer.isBuffer(val)) {
-    // Special case: looking for empty string/buffer always fails
-    if (val.length === 0) {
-      return -1
-    }
     return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
   } else if (typeof val === 'number') {
     val = val & 0xFF // Search for a byte value [0-255]
@@ -770,7 +782,8 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
     return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)
   }
 
-  throw new TypeError('val must be string, number or Buffer')
+  throw new TypeError('The "value" argument must be one of type ' +
+    'string, Buffer, or Uint8Array. Received type ' + typeof val)
 }
 
 function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
@@ -782,7 +795,7 @@ function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
     encoding = String(encoding).toLowerCase()
     if (encoding === 'ucs2' || encoding === 'ucs-2' ||
         encoding === 'utf16le' || encoding === 'utf-16le') {
-      if (arr.length < 2 || val.length < 2) {
+      if (arr.length < 2 || val.length < 2 || arr.length % 2 !== 0) {
         return -1
       }
       indexSize = 2
diff --git a/test/node/test-buffer-alloc.js b/test/node/test-buffer-alloc.js
index 5d96e0a..4f98e12 100644
--- a/test/node/test-buffer-alloc.js
+++ b/test/node/test-buffer-alloc.js
@@ -117,9 +117,9 @@ b.copy(Buffer.alloc(1), 0, 2048, 2048);
   assert.strictEqual(writeTest.toString(), 'nodejs');
 }
 
-// Offset points to the end of the buffer
+// Offset points to the end of the buffer and does not throw.
 // (see https://github.com/nodejs/node/issues/8127).
-assert.doesNotThrow(() => Buffer.alloc(1).write('', 1, 0));
+Buffer.alloc(1).write('', 1, 0);
 
 // ASCII slice test
 {
@@ -925,7 +925,7 @@ common.expectsError(
   }
 }
 
-if (common.hasCrypto) { // eslint-disable-line crypto-check
+if (common.hasCrypto) { // eslint-disable-line node-core/crypto-check
   // Test truncation after decode
   const crypto = require('crypto');
 
@@ -973,7 +973,7 @@ assert.strictEqual(SlowBuffer.prototype.offset, undefined);
                          Buffer.from(''));
 
   // Check pool offset after that by trying to write string into the pool.
-  assert.doesNotThrow(() => Buffer.from('abc'));
+  Buffer.from('abc');
 }
 
 
@@ -1002,13 +1002,13 @@ common.expectsError(() => {
   assert.strictEqual(ubuf.buffer.byteLength, 10);
 }
 
-// Regression test
-assert.doesNotThrow(() => Buffer.from(new ArrayBuffer()));
+// Regression test to verify that an empty ArrayBuffer does not throw.
+Buffer.from(new ArrayBuffer());
 
-// Test that ArrayBuffer from a different context is detected correctly
+// Test that ArrayBuffer from a different context is detected correctly.
 const arrayBuf = vm.runInNewContext('new ArrayBuffer()');
-assert.doesNotThrow(() => Buffer.from(arrayBuf));
-assert.doesNotThrow(() => Buffer.from({ buffer: arrayBuf }));
+Buffer.from(arrayBuf);
+Buffer.from({ buffer: arrayBuf });
 
 assert.throws(() => Buffer.alloc({ valueOf: () => 1 }),
               /"size" argument must be of type number/);
diff --git a/test/node/test-buffer-arraybuffer.js b/test/node/test-buffer-arraybuffer.js
index b3b1a48..482dfbc 100644
--- a/test/node/test-buffer-arraybuffer.js
+++ b/test/node/test-buffer-arraybuffer.js
@@ -150,3 +150,6 @@ b.writeDoubleBE(11.11, 0, true);
   });
 }
 
+// Test an array like entry with the length set to NaN.
+assert.deepStrictEqual(Buffer.from({ length: NaN }), Buffer.alloc(0));
+
diff --git a/test/node/test-buffer-ascii.js b/test/node/test-buffer-ascii.js
index 6c462e7..22375fb 100644
--- a/test/node/test-buffer-ascii.js
+++ b/test/node/test-buffer-ascii.js
@@ -1,4 +1,3 @@
-// Copyright Joyent, Inc. and other Node contributors.var Buffer = require('../../').Buffer;
 // Copyright Joyent, Inc. and other Node contributors.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a
@@ -19,6 +18,7 @@
 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
+var Buffer = require('../../').Buffer;
 
 'use strict';
 require('./common');
diff --git a/test/node/test-buffer-bad-overload.js b/test/node/test-buffer-bad-overload.js
index ea2406f..ab0c1b2 100644
--- a/test/node/test-buffer-bad-overload.js
+++ b/test/node/test-buffer-bad-overload.js
@@ -3,9 +3,7 @@ var Buffer = require('../../').Buffer;
 const common = require('./common');
 const assert = require('assert');
 
-assert.doesNotThrow(function() {
-  Buffer.allocUnsafe(10);
-});
+Buffer.allocUnsafe(10); // Should not throw.
 
 const err = common.expectsError({
   code: 'ERR_INVALID_ARG_TYPE',
@@ -17,7 +15,5 @@ assert.throws(function() {
   Buffer.from(10, 'hex');
 }, err);
 
-assert.doesNotThrow(function() {
-  Buffer.from('deadbeaf', 'hex');
-});
+Buffer.from('deadbeaf', 'hex'); // Should not throw.
 
diff --git a/test/node/test-buffer-concat.js b/test/node/test-buffer-concat.js
index c0dc4da..759b05c 100644
--- a/test/node/test-buffer-concat.js
+++ b/test/node/test-buffer-concat.js
@@ -1,26 +1,49 @@
-'use strict';
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
 var Buffer = require('../../').Buffer;
 
+'use strict';
+const common = require('./common');
+const assert = require('assert');
+
+const zero = [];
+const one = [ Buffer.from('asdf') ];
+const long = [];
+for (let i = 0; i < 10; i++) long.push(Buffer.from('asdf'));
 
-var assert = require('assert');
+const flatZero = Buffer.concat(zero);
+const flatOne = Buffer.concat(one);
+const flatLong = Buffer.concat(long);
+const flatLongLen = Buffer.concat(long, 40);
 
-var zero = [];
-var one = [ Buffer.from('asdf') ];
-var long = [];
-for (var i = 0; i < 10; i++) long.push(Buffer.from('asdf'));
+assert.strictEqual(flatZero.length, 0);
+assert.strictEqual(flatOne.toString(), 'asdf');
 
-var flatZero = Buffer.concat(zero);
-var flatOne = Buffer.concat(one);
-var flatLong = Buffer.concat(long);
-var flatLongLen = Buffer.concat(long, 40);
+const check = 'asdf'.repeat(10);
 
-assert(flatZero.length === 0);
-assert(flatOne.toString() === 'asdf');
 // A special case where concat used to return the first item,
 // if the length is one. This check is to make sure that we don't do that.
-assert(flatOne !== one[0]);
-assert(flatLong.toString() === (new Array(10 + 1).join('asdf')));
-assert(flatLongLen.toString() === (new Array(10 + 1).join('asdf')));
+assert.notStrictEqual(flatOne, one[0]);
+assert.strictEqual(flatLong.toString(), check);
+assert.strictEqual(flatLongLen.toString(), check);
 
 assertWrongList();
 assertWrongList(null);
@@ -30,11 +53,40 @@ assertWrongList(['hello', 'world']);
 assertWrongList(['hello', Buffer.from('world')]);
 
 function assertWrongList(value) {
-  assert.throws(function() {
+  common.expectsError(() => {
     Buffer.concat(value);
-  }, function(err) {
-    return err instanceof TypeError &&
-           err.message === '"list" argument must be an Array of Buffers';
+  }, {
+    code: 'ERR_INVALID_ARG_TYPE',
+    type: TypeError,
+    message: 'The "list" argument must be one of type ' +
+             'Array, Buffer, or Uint8Array'
   });
 }
 
+// eslint-disable-next-line node-core/crypto-check
+const random10 = common.hasCrypto ?
+  require('crypto').randomBytes(10) :
+  Buffer.alloc(10, 1);
+const empty = Buffer.alloc(0);
+
+assert.notDeepStrictEqual(random10, empty);
+assert.notDeepStrictEqual(random10, Buffer.alloc(10));
+
+assert.deepStrictEqual(Buffer.concat([], 100), empty);
+assert.deepStrictEqual(Buffer.concat([random10], 0), empty);
+assert.deepStrictEqual(Buffer.concat([random10], 10), random10);
+assert.deepStrictEqual(Buffer.concat([random10, random10], 10), random10);
+assert.deepStrictEqual(Buffer.concat([empty, random10]), random10);
+assert.deepStrictEqual(Buffer.concat([random10, empty, empty]), random10);
+
+// The tail should be zero-filled
+assert.deepStrictEqual(Buffer.concat([empty], 100), Buffer.alloc(100));
+assert.deepStrictEqual(Buffer.concat([empty], 4096), Buffer.alloc(4096));
+assert.deepStrictEqual(
+  Buffer.concat([random10], 40),
+  Buffer.concat([random10, Buffer.alloc(30)]));
+
+assert.deepStrictEqual(Buffer.concat([new Uint8Array([0x41, 0x42]),
+                                      new Uint8Array([0x43, 0x44])]),
+                       Buffer.from('ABCD'));
+
diff --git a/test/node/test-buffer-includes.js b/test/node/test-buffer-includes.js
index 2096a34..6318f8b 100644
--- a/test/node/test-buffer-includes.js
+++ b/test/node/test-buffer-includes.js
@@ -1,17 +1,14 @@
 'use strict';
 var Buffer = require('../../').Buffer;
+const assert = require('assert');
+const common = require('./common');
 
-
-var assert = require('assert');
-
-var Buffer = require('../../').Buffer;
-
-var b = Buffer.from('abcdef');
-var buf_a = Buffer.from('a');
-var buf_bc = Buffer.from('bc');
-var buf_f = Buffer.from('f');
-var buf_z = Buffer.from('z');
-var buf_empty = Buffer.from('');
+const b = Buffer.from('abcdef');
+const buf_a = Buffer.from('a');
+const buf_bc = Buffer.from('bc');
+const buf_f = Buffer.from('f');
+const buf_z = Buffer.from('z');
+const buf_empty = Buffer.from('');
 
 assert(b.includes('a'));
 assert(!b.includes('a', 1));
@@ -31,10 +28,10 @@ assert(b.includes('bc', -Infinity));
 assert(!b.includes('bc', Infinity));
 assert(b.includes('f'), b.length - 1);
 assert(!b.includes('z'));
-assert(!b.includes(''));
-assert(!b.includes('', 1));
-assert(!b.includes('', b.length + 1));
-assert(!b.includes('', Infinity));
+assert(b.includes(''));
+assert(b.includes('', 1));
+assert(b.includes('', b.length + 1));
+assert(b.includes('', Infinity));
 assert(b.includes(buf_a));
 assert(!b.includes(buf_a, 1));
 assert(!b.includes(buf_a, -1));
@@ -53,10 +50,10 @@ assert(b.includes(buf_bc, -Infinity));
 assert(!b.includes(buf_bc, Infinity));
 assert(b.includes(buf_f), b.length - 1);
 assert(!b.includes(buf_z));
-assert(!b.includes(buf_empty));
-assert(!b.includes(buf_empty, 1));
-assert(!b.includes(buf_empty, b.length + 1));
-assert(!b.includes(buf_empty, Infinity));
+assert(b.includes(buf_empty));
+assert(b.includes(buf_empty, 1));
+assert(b.includes(buf_empty, b.length + 1));
+assert(b.includes(buf_empty, Infinity));
 assert(b.includes(0x61));
 assert(!b.includes(0x61, 1));
 assert(!b.includes(0x61, -1));
@@ -141,8 +138,8 @@ assert.strictEqual(
 );
 
 
-// test usc2 encoding
-var twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
+// test ucs2 encoding
+let twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
 
 assert(twoByteString.includes('\u0395', 4, 'ucs2'));
 assert(twoByteString.includes('\u03a3', -4, 'ucs2'));
@@ -151,20 +148,18 @@ assert(twoByteString.includes(
   Buffer.from('\u03a3', 'ucs2'), -6, 'ucs2'));
 assert(!twoByteString.includes('\u03a3', -2, 'ucs2'));
 
-var mixedByteStringUcs2 =
-    Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2');
+const mixedByteStringUcs2 =
+  Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2');
 assert(mixedByteStringUcs2.includes('bc', 0, 'ucs2'));
 assert(mixedByteStringUcs2.includes('\u03a3', 0, 'ucs2'));
 assert(!mixedByteStringUcs2.includes('\u0396', 0, 'ucs2'));
 
-assert(
-    6, mixedByteStringUcs2.includes(Buffer.from('bc', 'ucs2'), 0, 'ucs2'));
-assert(
-    10, mixedByteStringUcs2.includes(Buffer.from('\u03a3', 'ucs2'),
-    0, 'ucs2'));
-assert(
-    -1, mixedByteStringUcs2.includes(Buffer.from('\u0396', 'ucs2'),
-    0, 'ucs2'));
+assert.ok(
+  mixedByteStringUcs2.includes(Buffer.from('bc', 'ucs2'), 0, 'ucs2'));
+assert.ok(
+  mixedByteStringUcs2.includes(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2'));
+assert.ok(
+  !mixedByteStringUcs2.includes(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2'));
 
 twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
 
@@ -182,7 +177,7 @@ assert(twoByteString.includes('\u0391\u03a3', 0, 'ucs2'), 'Alpha Sigma');
 assert(twoByteString.includes('\u03a3\u03a3', 0, 'ucs2'), 'Sigma Sigma');
 assert(twoByteString.includes('\u03a3\u0395', 0, 'ucs2'), 'Sigma Epsilon');
 
-var mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395');
+const mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395');
 assert(mixedByteStringUtf8.includes('bc'));
 assert(mixedByteStringUtf8.includes('bc', 5));
 assert(mixedByteStringUtf8.includes('bc', -8));
@@ -192,18 +187,18 @@ assert(!mixedByteStringUtf8.includes('\u0396'));
 
 // Test complex string includes algorithms. Only trigger for long strings.
 // Long string that isn't a simple repeat of a shorter string.
-var longString = 'A';
-for (var i = 66; i < 76; i++) {  // from 'B' to 'K'
+let longString = 'A';
+for (let i = 66; i < 76; i++) {  // from 'B' to 'K'
   longString = longString + String.fromCharCode(i) + longString;
 }
 
-var longBufferString = Buffer.from(longString);
+const longBufferString = Buffer.from(longString);
 
 // pattern of 15 chars, repeated every 16 chars in long
-var pattern = 'ABACABADABACABA';
-for (var i = 0; i < longBufferString.length - pattern.length; i += 7) {
-  var includes = longBufferString.includes(pattern, i);
-  assert(includes, 'Long ABACABA...-string at index ' + i);
+let pattern = 'ABACABADABACABA';
+for (let i = 0; i < longBufferString.length - pattern.length; i += 7) {
+  const includes = longBufferString.includes(pattern, i);
+  assert(includes, `Long ABACABA...-string at index ${i}`);
 }
 assert(longBufferString.includes('AJABACA'), 'Long AJABACA, First J');
 assert(longBufferString.includes('AJABACA', 511), 'Long AJABACA, Second J');
@@ -213,17 +208,17 @@ assert(longBufferString.includes(pattern), 'Long JABACABA..., First J');
 assert(longBufferString.includes(pattern, 512), 'Long JABACABA..., Second J');
 
 // Search for a non-ASCII string in a pure ASCII string.
-var asciiString = Buffer.from(
-    'arglebargleglopglyfarglebargleglopglyfarglebargleglopglyf');
+const asciiString = Buffer.from(
+  'arglebargleglopglyfarglebargleglopglyfarglebargleglopglyf');
 assert(!asciiString.includes('\x2061'));
 assert(asciiString.includes('leb', 0));
 
 // Search in string containing many non-ASCII chars.
-var allCodePoints = [];
-for (var i = 0; i < 65536; i++) allCodePoints[i] = i;
-var allCharsString = String.fromCharCode.apply(String, allCodePoints);
-var allCharsBufferUtf8 = Buffer.from(allCharsString);
-var allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2');
+const allCodePoints = [];
+for (let i = 0; i < 65536; i++) allCodePoints[i] = i;
+const allCharsString = String.fromCharCode.apply(String, allCodePoints);
+const allCharsBufferUtf8 = Buffer.from(allCharsString);
+const allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2');
 
 // Search for string long enough to trigger complex search with ASCII pattern
 // and UC16 subject.
@@ -231,12 +226,12 @@ assert(!allCharsBufferUtf8.includes('notfound'));
 assert(!allCharsBufferUcs2.includes('notfound'));
 
 // Find substrings in Utf8.
-var lengths = [1, 3, 15];  // Single char, simple and complex.
-var indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b];
-for (var lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
-  for (var i = 0; i < indices.length; i++) {
-    var index = indices[i];
-    var length = lengths[lengthIndex];
+let lengths = [1, 3, 15];  // Single char, simple and complex.
+let indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b];
+for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
+  for (let i = 0; i < indices.length; i++) {
+    const index = indices[i];
+    let length = lengths[lengthIndex];
 
     if (index + length > 0x7F) {
       length = 2 * length;
@@ -250,10 +245,10 @@ for (var lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
       length = 4 * length;
     }
 
-    var patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length);
+    const patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length);
     assert(index, allCharsBufferUtf8.includes(patternBufferUtf8));
 
-    var patternStringUtf8 = patternBufferUtf8.toString();
+    const patternStringUtf8 = patternBufferUtf8.toString();
     assert(index, allCharsBufferUtf8.includes(patternStringUtf8));
   }
 }
@@ -261,35 +256,41 @@ for (var lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
 // Find substrings in Usc2.
 lengths = [2, 4, 16];  // Single char, simple and complex.
 indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0];
-for (var lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
-  for (var i = 0; i < indices.length; i++) {
-    var index = indices[i] * 2;
-    var length = lengths[lengthIndex];
-
-    var patternBufferUcs2 =
-        allCharsBufferUcs2.slice(index, index + length);
-    assert(
-        index, allCharsBufferUcs2.includes(patternBufferUcs2, 0, 'ucs2'));
-
-    var patternStringUcs2 = patternBufferUcs2.toString('ucs2');
-    assert(
-        index, allCharsBufferUcs2.includes(patternStringUcs2, 0, 'ucs2'));
+for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
+  for (let i = 0; i < indices.length; i++) {
+    const index = indices[i] * 2;
+    const length = lengths[lengthIndex];
+
+    const patternBufferUcs2 =
+      allCharsBufferUcs2.slice(index, index + length);
+    assert.ok(
+      allCharsBufferUcs2.includes(patternBufferUcs2, 0, 'ucs2'));
+
+    const patternStringUcs2 = patternBufferUcs2.toString('ucs2');
+    assert.ok(
+      allCharsBufferUcs2.includes(patternStringUcs2, 0, 'ucs2'));
   }
 }
 
-assert.throws(function() {
-  b.includes(function() { });
-});
-assert.throws(function() {
-  b.includes({});
-});
-assert.throws(function() {
-  b.includes([]);
+[
+  () => { },
+  {},
+  []
+].forEach((val) => {
+  common.expectsError(
+    () => b.includes(val),
+    {
+      code: 'ERR_INVALID_ARG_TYPE',
+      type: TypeError,
+      message: 'The "value" argument must be one of type string, ' +
+               `Buffer, or Uint8Array. Received type ${typeof val}`
+    }
+  );
 });
 
 // test truncation of Number arguments to uint8
 {
-  var buf = Buffer.from('this is a test');
+  const buf = Buffer.from('this is a test');
   assert.ok(buf.includes(0x6973));
   assert.ok(buf.includes(0x697320));
   assert.ok(buf.includes(0x69732069));
diff --git a/test/node/test-buffer-indexof.js b/test/node/test-buffer-indexof.js
index dcf150b..b4537c8 100644
--- a/test/node/test-buffer-indexof.js
+++ b/test/node/test-buffer-indexof.js
@@ -1,84 +1,89 @@
 'use strict';
 var Buffer = require('../../').Buffer;
-
-
-var assert = require('assert');
-
-var Buffer = require('../../').Buffer;
-
-var b = Buffer.from('abcdef');
-var buf_a = Buffer.from('a');
-var buf_bc = Buffer.from('bc');
-var buf_f = Buffer.from('f');
-var buf_z = Buffer.from('z');
-var buf_empty = Buffer.from('');
-
-assert.equal(b.indexOf('a'), 0);
-assert.equal(b.indexOf('a', 1), -1);
-assert.equal(b.indexOf('a', -1), -1);
-assert.equal(b.indexOf('a', -4), -1);
-assert.equal(b.indexOf('a', -b.length), 0);
-assert.equal(b.indexOf('a', NaN), 0);
-assert.equal(b.indexOf('a', -Infinity), 0);
-assert.equal(b.indexOf('a', Infinity), -1);
-assert.equal(b.indexOf('bc'), 1);
-assert.equal(b.indexOf('bc', 2), -1);
-assert.equal(b.indexOf('bc', -1), -1);
-assert.equal(b.indexOf('bc', -3), -1);
-assert.equal(b.indexOf('bc', -5), 1);
-assert.equal(b.indexOf('bc', NaN), 1);
-assert.equal(b.indexOf('bc', -Infinity), 1);
-assert.equal(b.indexOf('bc', Infinity), -1);
-assert.equal(b.indexOf('f'), b.length - 1);
-assert.equal(b.indexOf('z'), -1);
-assert.equal(b.indexOf(''), -1);
-assert.equal(b.indexOf('', 1), -1);
-assert.equal(b.indexOf('', b.length + 1), -1);
-assert.equal(b.indexOf('', Infinity), -1);
-assert.equal(b.indexOf(buf_a), 0);
-assert.equal(b.indexOf(buf_a, 1), -1);
-assert.equal(b.indexOf(buf_a, -1), -1);
-assert.equal(b.indexOf(buf_a, -4), -1);
-assert.equal(b.indexOf(buf_a, -b.length), 0);
-assert.equal(b.indexOf(buf_a, NaN), 0);
-assert.equal(b.indexOf(buf_a, -Infinity), 0);
-assert.equal(b.indexOf(buf_a, Infinity), -1);
-assert.equal(b.indexOf(buf_bc), 1);
-assert.equal(b.indexOf(buf_bc, 2), -1);
-assert.equal(b.indexOf(buf_bc, -1), -1);
-assert.equal(b.indexOf(buf_bc, -3), -1);
-assert.equal(b.indexOf(buf_bc, -5), 1);
-assert.equal(b.indexOf(buf_bc, NaN), 1);
-assert.equal(b.indexOf(buf_bc, -Infinity), 1);
-assert.equal(b.indexOf(buf_bc, Infinity), -1);
-assert.equal(b.indexOf(buf_f), b.length - 1);
-assert.equal(b.indexOf(buf_z), -1);
-assert.equal(b.indexOf(buf_empty), -1);
-assert.equal(b.indexOf(buf_empty, 1), -1);
-assert.equal(b.indexOf(buf_empty, b.length + 1), -1);
-assert.equal(b.indexOf(buf_empty, Infinity), -1);
-assert.equal(b.indexOf(0x61), 0);
-assert.equal(b.indexOf(0x61, 1), -1);
-assert.equal(b.indexOf(0x61, -1), -1);
-assert.equal(b.indexOf(0x61, -4), -1);
-assert.equal(b.indexOf(0x61, -b.length), 0);
-assert.equal(b.indexOf(0x61, NaN), 0);
-assert.equal(b.indexOf(0x61, -Infinity), 0);
-assert.equal(b.indexOf(0x61, Infinity), -1);
-assert.equal(b.indexOf(0x0), -1);
+const common = require('./common');
+const assert = require('assert');
+
+const b = Buffer.from('abcdef');
+const buf_a = Buffer.from('a');
+const buf_bc = Buffer.from('bc');
+const buf_f = Buffer.from('f');
+const buf_z = Buffer.from('z');
+const buf_empty = Buffer.from('');
+
+const s = 'abcdef';
+
+assert.strictEqual(b.indexOf('a'), 0);
+assert.strictEqual(b.indexOf('a', 1), -1);
+assert.strictEqual(b.indexOf('a', -1), -1);
+assert.strictEqual(b.indexOf('a', -4), -1);
+assert.strictEqual(b.indexOf('a', -b.length), 0);
+assert.strictEqual(b.indexOf('a', NaN), 0);
+assert.strictEqual(b.indexOf('a', -Infinity), 0);
+assert.strictEqual(b.indexOf('a', Infinity), -1);
+assert.strictEqual(b.indexOf('bc'), 1);
+assert.strictEqual(b.indexOf('bc', 2), -1);
+assert.strictEqual(b.indexOf('bc', -1), -1);
+assert.strictEqual(b.indexOf('bc', -3), -1);
+assert.strictEqual(b.indexOf('bc', -5), 1);
+assert.strictEqual(b.indexOf('bc', NaN), 1);
+assert.strictEqual(b.indexOf('bc', -Infinity), 1);
+assert.strictEqual(b.indexOf('bc', Infinity), -1);
+assert.strictEqual(b.indexOf('f'), b.length - 1);
+assert.strictEqual(b.indexOf('z'), -1);
+assert.strictEqual(b.indexOf(''), 0);
+assert.strictEqual(b.indexOf('', 1), 1);
+assert.strictEqual(b.indexOf('', b.length + 1), b.length);
+assert.strictEqual(b.indexOf('', Infinity), b.length);
+assert.strictEqual(b.indexOf(buf_a), 0);
+assert.strictEqual(b.indexOf(buf_a, 1), -1);
+assert.strictEqual(b.indexOf(buf_a, -1), -1);
+assert.strictEqual(b.indexOf(buf_a, -4), -1);
+assert.strictEqual(b.indexOf(buf_a, -b.length), 0);
+assert.strictEqual(b.indexOf(buf_a, NaN), 0);
+assert.strictEqual(b.indexOf(buf_a, -Infinity), 0);
+assert.strictEqual(b.indexOf(buf_a, Infinity), -1);
+assert.strictEqual(b.indexOf(buf_bc), 1);
+assert.strictEqual(b.indexOf(buf_bc, 2), -1);
+assert.strictEqual(b.indexOf(buf_bc, -1), -1);
+assert.strictEqual(b.indexOf(buf_bc, -3), -1);
+assert.strictEqual(b.indexOf(buf_bc, -5), 1);
+assert.strictEqual(b.indexOf(buf_bc, NaN), 1);
+assert.strictEqual(b.indexOf(buf_bc, -Infinity), 1);
+assert.strictEqual(b.indexOf(buf_bc, Infinity), -1);
+assert.strictEqual(b.indexOf(buf_f), b.length - 1);
+assert.strictEqual(b.indexOf(buf_z), -1);
+assert.strictEqual(b.indexOf(buf_empty), 0);
+assert.strictEqual(b.indexOf(buf_empty, 1), 1);
+assert.strictEqual(b.indexOf(buf_empty, b.length + 1), b.length);
+assert.strictEqual(b.indexOf(buf_empty, Infinity), b.length);
+assert.strictEqual(b.indexOf(0x61), 0);
+assert.strictEqual(b.indexOf(0x61, 1), -1);
+assert.strictEqual(b.indexOf(0x61, -1), -1);
+assert.strictEqual(b.indexOf(0x61, -4), -1);
+assert.strictEqual(b.indexOf(0x61, -b.length), 0);
+assert.strictEqual(b.indexOf(0x61, NaN), 0);
+assert.strictEqual(b.indexOf(0x61, -Infinity), 0);
+assert.strictEqual(b.indexOf(0x61, Infinity), -1);
+assert.strictEqual(b.indexOf(0x0), -1);
 
 // test offsets
-assert.equal(b.indexOf('d', 2), 3);
-assert.equal(b.indexOf('f', 5), 5);
-assert.equal(b.indexOf('f', -1), 5);
-assert.equal(b.indexOf('f', 6), -1);
+assert.strictEqual(b.indexOf('d', 2), 3);
+assert.strictEqual(b.indexOf('f', 5), 5);
+assert.strictEqual(b.indexOf('f', -1), 5);
+assert.strictEqual(b.indexOf('f', 6), -1);
 
-assert.equal(b.indexOf(Buffer.from('d'), 2), 3);
-assert.equal(b.indexOf(Buffer.from('f'), 5), 5);
-assert.equal(b.indexOf(Buffer.from('f'), -1), 5);
-assert.equal(b.indexOf(Buffer.from('f'), 6), -1);
+assert.strictEqual(b.indexOf(Buffer.from('d'), 2), 3);
+assert.strictEqual(b.indexOf(Buffer.from('f'), 5), 5);
+assert.strictEqual(b.indexOf(Buffer.from('f'), -1), 5);
+assert.strictEqual(b.indexOf(Buffer.from('f'), 6), -1);
 
-assert.equal(Buffer.from('ff').indexOf(Buffer.from('f'), 1, 'ucs2'), -1);
+assert.strictEqual(Buffer.from('ff').indexOf(Buffer.from('f'), 1, 'ucs2'), -1);
+
+// test invalid and uppercase encoding
+assert.strictEqual(b.indexOf('b', 'utf8'), 1);
+assert.strictEqual(b.indexOf('b', 'UTF8'), 1);
+assert.strictEqual(b.indexOf('62', 'HEX'), 1);
+assert.throws(() => b.indexOf('bad', 'enc'), /Unknown encoding: enc/);
 
 // test hex encoding
 assert.strictEqual(
@@ -172,106 +177,115 @@ assert.strictEqual(
 
 
 // test optional offset with passed encoding
-assert.equal(Buffer.from('aaaa0').indexOf('30', 'hex'), 4);
-assert.equal(Buffer.from('aaaa00a').indexOf('3030', 'hex'), 4);
+assert.strictEqual(Buffer.from('aaaa0').indexOf('30', 'hex'), 4);
+assert.strictEqual(Buffer.from('aaaa00a').indexOf('3030', 'hex'), 4);
 
 {
   // test usc2 encoding
-  var twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
+  const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
 
-  assert.equal(8, twoByteString.indexOf('\u0395', 4, 'ucs2'));
-  assert.equal(6, twoByteString.indexOf('\u03a3', -4, 'ucs2'));
-  assert.equal(4, twoByteString.indexOf('\u03a3', -6, 'ucs2'));
-  assert.equal(4, twoByteString.indexOf(
+  assert.strictEqual(8, twoByteString.indexOf('\u0395', 4, 'ucs2'));
+  assert.strictEqual(6, twoByteString.indexOf('\u03a3', -4, 'ucs2'));
+  assert.strictEqual(4, twoByteString.indexOf('\u03a3', -6, 'ucs2'));
+  assert.strictEqual(4, twoByteString.indexOf(
     Buffer.from('\u03a3', 'ucs2'), -6, 'ucs2'));
-  assert.equal(-1, twoByteString.indexOf('\u03a3', -2, 'ucs2'));
+  assert.strictEqual(-1, twoByteString.indexOf('\u03a3', -2, 'ucs2'));
 }
 
-var mixedByteStringUcs2 =
+const mixedByteStringUcs2 =
     Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2');
-assert.equal(6, mixedByteStringUcs2.indexOf('bc', 0, 'ucs2'));
-assert.equal(10, mixedByteStringUcs2.indexOf('\u03a3', 0, 'ucs2'));
-assert.equal(-1, mixedByteStringUcs2.indexOf('\u0396', 0, 'ucs2'));
+assert.strictEqual(6, mixedByteStringUcs2.indexOf('bc', 0, 'ucs2'));
+assert.strictEqual(10, mixedByteStringUcs2.indexOf('\u03a3', 0, 'ucs2'));
+assert.strictEqual(-1, mixedByteStringUcs2.indexOf('\u0396', 0, 'ucs2'));
 
-assert.equal(
-    6, mixedByteStringUcs2.indexOf(Buffer.from('bc', 'ucs2'), 0, 'ucs2'));
-assert.equal(
-    10, mixedByteStringUcs2.indexOf(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2'));
-assert.equal(
-    -1, mixedByteStringUcs2.indexOf(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2'));
+assert.strictEqual(
+  6, mixedByteStringUcs2.indexOf(Buffer.from('bc', 'ucs2'), 0, 'ucs2'));
+assert.strictEqual(
+  10, mixedByteStringUcs2.indexOf(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2'));
+assert.strictEqual(
+  -1, mixedByteStringUcs2.indexOf(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2'));
 
 {
-  var twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
+  const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
 
   // Test single char pattern
-  assert.equal(0, twoByteString.indexOf('\u039a', 0, 'ucs2'));
-  assert.equal(2, twoByteString.indexOf('\u0391', 0, 'ucs2'), 'Alpha');
-  assert.equal(4, twoByteString.indexOf('\u03a3', 0, 'ucs2'), 'First Sigma');
-  assert.equal(6, twoByteString.indexOf('\u03a3', 6, 'ucs2'), 'Second Sigma');
-  assert.equal(8, twoByteString.indexOf('\u0395', 0, 'ucs2'), 'Epsilon');
-  assert.equal(-1, twoByteString.indexOf('\u0392', 0, 'ucs2'), 'Not beta');
+  assert.strictEqual(0, twoByteString.indexOf('\u039a', 0, 'ucs2'));
+  let index = twoByteString.indexOf('\u0391', 0, 'ucs2');
+  assert.strictEqual(2, index, `Alpha - at index ${index}`);
+  index = twoByteString.indexOf('\u03a3', 0, 'ucs2');
+  assert.strictEqual(4, index, `First Sigma - at index ${index}`);
+  index = twoByteString.indexOf('\u03a3', 6, 'ucs2');
+  assert.strictEqual(6, index, `Second Sigma - at index ${index}`);
+  index = twoByteString.indexOf('\u0395', 0, 'ucs2');
+  assert.strictEqual(8, index, `Epsilon - at index ${index}`);
+  index = twoByteString.indexOf('\u0392', 0, 'ucs2');
+  assert.strictEqual(-1, index, `Not beta - at index ${index}`);
 
   // Test multi-char pattern
-  assert.equal(
-      0, twoByteString.indexOf('\u039a\u0391', 0, 'ucs2'), 'Lambda Alpha');
-  assert.equal(
-      2, twoByteString.indexOf('\u0391\u03a3', 0, 'ucs2'), 'Alpha Sigma');
-  assert.equal(
-      4, twoByteString.indexOf('\u03a3\u03a3', 0, 'ucs2'), 'Sigma Sigma');
-  assert.equal(
-      6, twoByteString.indexOf('\u03a3\u0395', 0, 'ucs2'), 'Sigma Epsilon');
+  index = twoByteString.indexOf('\u039a\u0391', 0, 'ucs2');
+  assert.strictEqual(0, index, `Lambda Alpha - at index ${index}`);
+  index = twoByteString.indexOf('\u0391\u03a3', 0, 'ucs2');
+  assert.strictEqual(2, index, `Alpha Sigma - at index ${index}`);
+  index = twoByteString.indexOf('\u03a3\u03a3', 0, 'ucs2');
+  assert.strictEqual(4, index, `Sigma Sigma - at index ${index}`);
+  index = twoByteString.indexOf('\u03a3\u0395', 0, 'ucs2');
+  assert.strictEqual(6, index, `Sigma Epsilon - at index ${index}`);
 }
 
-var mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395');
-assert.equal(5, mixedByteStringUtf8.indexOf('bc'));
-assert.equal(5, mixedByteStringUtf8.indexOf('bc', 5));
-assert.equal(5, mixedByteStringUtf8.indexOf('bc', -8));
-assert.equal(7, mixedByteStringUtf8.indexOf('\u03a3'));
-assert.equal(-1, mixedByteStringUtf8.indexOf('\u0396'));
+const mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395');
+assert.strictEqual(5, mixedByteStringUtf8.indexOf('bc'));
+assert.strictEqual(5, mixedByteStringUtf8.indexOf('bc', 5));
+assert.strictEqual(5, mixedByteStringUtf8.indexOf('bc', -8));
+assert.strictEqual(7, mixedByteStringUtf8.indexOf('\u03a3'));
+assert.strictEqual(-1, mixedByteStringUtf8.indexOf('\u0396'));
 
 
 // Test complex string indexOf algorithms. Only trigger for long strings.
 // Long string that isn't a simple repeat of a shorter string.
-var longString = 'A';
-for (var i = 66; i < 76; i++) {  // from 'B' to 'K'
+let longString = 'A';
+for (let i = 66; i < 76; i++) {  // from 'B' to 'K'
   longString = longString + String.fromCharCode(i) + longString;
 }
 
-var longBufferString = Buffer.from(longString);
+const longBufferString = Buffer.from(longString);
 
 // pattern of 15 chars, repeated every 16 chars in long
-var pattern = 'ABACABADABACABA';
-for (var i = 0; i < longBufferString.length - pattern.length; i += 7) {
-  var index = longBufferString.indexOf(pattern, i);
-  assert.equal((i + 15) & ~0xf, index, 'Long ABACABA...-string at index ' + i);
+let pattern = 'ABACABADABACABA';
+for (let i = 0; i < longBufferString.length - pattern.length; i += 7) {
+  const index = longBufferString.indexOf(pattern, i);
+  assert.strictEqual((i + 15) & ~0xf, index,
+                     `Long ABACABA...-string at index ${i}`);
 }
-assert.equal(510, longBufferString.indexOf('AJABACA'), 'Long AJABACA, First J');
-assert.equal(
-    1534, longBufferString.indexOf('AJABACA', 511), 'Long AJABACA, Second J');
+
+let index = longBufferString.indexOf('AJABACA');
+assert.strictEqual(510, index, `Long AJABACA, First J - at index ${index}`);
+index = longBufferString.indexOf('AJABACA', 511);
+assert.strictEqual(1534, index, `Long AJABACA, Second J - at index ${index}`);
 
 pattern = 'JABACABADABACABA';
-assert.equal(
-    511, longBufferString.indexOf(pattern), 'Long JABACABA..., First J');
-assert.equal(
-    1535, longBufferString.indexOf(pattern, 512), 'Long JABACABA..., Second J');
+index = longBufferString.indexOf(pattern);
+assert.strictEqual(511, index, `Long JABACABA..., First J - at index ${index}`);
+index = longBufferString.indexOf(pattern, 512);
+assert.strictEqual(
+  1535, index, `Long JABACABA..., Second J - at index ${index}`);
 
 // Search for a non-ASCII string in a pure ASCII string.
-var asciiString = Buffer.from(
-    'arglebargleglopglyfarglebargleglopglyfarglebargleglopglyf');
-assert.equal(-1, asciiString.indexOf('\x2061'));
-assert.equal(3, asciiString.indexOf('leb', 0));
+const asciiString = Buffer.from(
+  'arglebargleglopglyfarglebargleglopglyfarglebargleglopglyf');
+assert.strictEqual(-1, asciiString.indexOf('\x2061'));
+assert.strictEqual(3, asciiString.indexOf('leb', 0));
 
 // Search in string containing many non-ASCII chars.
-var allCodePoints = [];
-for (var i = 0; i < 65536; i++) allCodePoints[i] = i;
-var allCharsString = String.fromCharCode.apply(String, allCodePoints);
-var allCharsBufferUtf8 = Buffer.from(allCharsString);
-var allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2');
+const allCodePoints = [];
+for (let i = 0; i < 65536; i++) allCodePoints[i] = i;
+const allCharsString = String.fromCharCode.apply(String, allCodePoints);
+const allCharsBufferUtf8 = Buffer.from(allCharsString);
+const allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2');
 
 // Search for string long enough to trigger complex search with ASCII pattern
 // and UC16 subject.
-assert.equal(-1, allCharsBufferUtf8.indexOf('notfound'));
-assert.equal(-1, allCharsBufferUcs2.indexOf('notfound'));
+assert.strictEqual(-1, allCharsBufferUtf8.indexOf('notfound'));
+assert.strictEqual(-1, allCharsBufferUcs2.indexOf('notfound'));
 
 // Needle is longer than haystack, but only because it's encoded as UTF-16
 assert.strictEqual(Buffer.from('aaaa').indexOf('a'.repeat(4), 'ucs2'), -1);
@@ -280,16 +294,16 @@ assert.strictEqual(Buffer.from('aaaa').indexOf('a'.repeat(4), 'utf8'), 0);
 assert.strictEqual(Buffer.from('aaaa').indexOf('你好', 'ucs2'), -1);
 
 // Haystack has odd length, but the needle is UCS2.
-// assert.strictEqual(Buffer.from('aaaaa').indexOf('b', 'ucs2'), -1);
+assert.strictEqual(Buffer.from('aaaaa').indexOf('b', 'ucs2'), -1);
 
 {
   // Find substrings in Utf8.
-  var lengths = [1, 3, 15];  // Single char, simple and complex.
-  var indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b];
-  for (var lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
-    for (var i = 0; i < indices.length; i++) {
-      var index = indices[i];
-      var length = lengths[lengthIndex];
+  const lengths = [1, 3, 15];  // Single char, simple and complex.
+  const indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b];
+  for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
+    for (let i = 0; i < indices.length; i++) {
+      const index = indices[i];
+      let length = lengths[lengthIndex];
 
       if (index + length > 0x7F) {
         length = 2 * length;
@@ -303,107 +317,168 @@ assert.strictEqual(Buffer.from('aaaa').indexOf('你好', 'ucs2'), -1);
         length = 4 * length;
       }
 
-      var patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length);
-      assert.equal(index, allCharsBufferUtf8.indexOf(patternBufferUtf8));
+      const patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length);
+      assert.strictEqual(index, allCharsBufferUtf8.indexOf(patternBufferUtf8));
 
-      var patternStringUtf8 = patternBufferUtf8.toString();
-      assert.equal(index, allCharsBufferUtf8.indexOf(patternStringUtf8));
+      const patternStringUtf8 = patternBufferUtf8.toString();
+      assert.strictEqual(index, allCharsBufferUtf8.indexOf(patternStringUtf8));
     }
   }
 }
 
 {
   // Find substrings in Usc2.
-  var lengths = [2, 4, 16];  // Single char, simple and complex.
-  var indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0];
-  for (var lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
-    for (var i = 0; i < indices.length; i++) {
-      var index = indices[i] * 2;
-      var length = lengths[lengthIndex];
-
-      var patternBufferUcs2 =
+  const lengths = [2, 4, 16];  // Single char, simple and complex.
+  const indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0];
+  for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
+    for (let i = 0; i < indices.length; i++) {
+      const index = indices[i] * 2;
+      const length = lengths[lengthIndex];
+
+      const patternBufferUcs2 =
           allCharsBufferUcs2.slice(index, index + length);
-      assert.equal(
-          index, allCharsBufferUcs2.indexOf(patternBufferUcs2, 0, 'ucs2'));
+      assert.strictEqual(
+        index, allCharsBufferUcs2.indexOf(patternBufferUcs2, 0, 'ucs2'));
 
-      var patternStringUcs2 = patternBufferUcs2.toString('ucs2');
-      assert.equal(
-          index, allCharsBufferUcs2.indexOf(patternStringUcs2, 0, 'ucs2'));
+      const patternStringUcs2 = patternBufferUcs2.toString('ucs2');
+      assert.strictEqual(
+        index, allCharsBufferUcs2.indexOf(patternStringUcs2, 0, 'ucs2'));
     }
   }
 }
 
-assert.throws(function() {
-  b.indexOf(function() { });
-});
-assert.throws(function() {
-  b.indexOf({});
-});
-assert.throws(function() {
-  b.indexOf([]);
+[
+  () => {},
+  {},
+  []
+].forEach((val) => {
+  common.expectsError(
+    () => b.indexOf(val),
+    {
+      code: 'ERR_INVALID_ARG_TYPE',
+      type: TypeError,
+      message: 'The "value" argument must be one of type string, ' +
+               `Buffer, or Uint8Array. Received type ${typeof val}`
+    }
+  );
 });
 
+// Test weird offset arguments.
+// The following offsets coerce to NaN or 0, searching the whole Buffer
+assert.strictEqual(b.indexOf('b', undefined), 1);
+assert.strictEqual(b.indexOf('b', {}), 1);
+assert.strictEqual(b.indexOf('b', 0), 1);
+assert.strictEqual(b.indexOf('b', null), 1);
+assert.strictEqual(b.indexOf('b', []), 1);
+
+// The following offset coerces to 2, in other words +[2] === 2
+assert.strictEqual(b.indexOf('b', [2]), -1);
+
+// Behavior should match String.indexOf()
+assert.strictEqual(
+  b.indexOf('b', undefined),
+  s.indexOf('b', undefined));
+assert.strictEqual(
+  b.indexOf('b', {}),
+  s.indexOf('b', {}));
+assert.strictEqual(
+  b.indexOf('b', 0),
+  s.indexOf('b', 0));
+assert.strictEqual(
+  b.indexOf('b', null),
+  s.indexOf('b', null));
+assert.strictEqual(
+  b.indexOf('b', []),
+  s.indexOf('b', []));
+assert.strictEqual(
+  b.indexOf('b', [2]),
+  s.indexOf('b', [2]));
+
 // All code for handling encodings is shared between Buffer.indexOf and
 // Buffer.lastIndexOf, so only testing the separate lastIndexOf semantics.
 
 // Test lastIndexOf basic functionality; Buffer b contains 'abcdef'.
 // lastIndexOf string:
-assert.equal(b.lastIndexOf('a'), 0);
-assert.equal(b.lastIndexOf('a', 1), 0);
-assert.equal(b.lastIndexOf('b', 1), 1);
-assert.equal(b.lastIndexOf('c', 1), -1);
-assert.equal(b.lastIndexOf('a', -1), 0);
-assert.equal(b.lastIndexOf('a', -4), 0);
-assert.equal(b.lastIndexOf('a', -b.length), 0);
-assert.equal(b.lastIndexOf('a', -b.length - 1), -1);
-assert.equal(b.lastIndexOf('a', NaN), 0);
-assert.equal(b.lastIndexOf('a', -Infinity), -1);
-assert.equal(b.lastIndexOf('a', Infinity), 0);
+assert.strictEqual(b.lastIndexOf('a'), 0);
+assert.strictEqual(b.lastIndexOf('a', 1), 0);
+assert.strictEqual(b.lastIndexOf('b', 1), 1);
+assert.strictEqual(b.lastIndexOf('c', 1), -1);
+assert.strictEqual(b.lastIndexOf('a', -1), 0);
+assert.strictEqual(b.lastIndexOf('a', -4), 0);
+assert.strictEqual(b.lastIndexOf('a', -b.length), 0);
+assert.strictEqual(b.lastIndexOf('a', -b.length - 1), -1);
+assert.strictEqual(b.lastIndexOf('a', NaN), 0);
+assert.strictEqual(b.lastIndexOf('a', -Infinity), -1);
+assert.strictEqual(b.lastIndexOf('a', Infinity), 0);
 // lastIndexOf Buffer:
-assert.equal(b.lastIndexOf(buf_a), 0);
-assert.equal(b.lastIndexOf(buf_a, 1), 0);
-assert.equal(b.lastIndexOf(buf_a, -1), 0);
-assert.equal(b.lastIndexOf(buf_a, -4), 0);
-assert.equal(b.lastIndexOf(buf_a, -b.length), 0);
-assert.equal(b.lastIndexOf(buf_a, -b.length - 1), -1);
-assert.equal(b.lastIndexOf(buf_a, NaN), 0);
-assert.equal(b.lastIndexOf(buf_a, -Infinity), -1);
-assert.equal(b.lastIndexOf(buf_a, Infinity), 0);
-assert.equal(b.lastIndexOf(buf_bc), 1);
-assert.equal(b.lastIndexOf(buf_bc, 2), 1);
-assert.equal(b.lastIndexOf(buf_bc, -1), 1);
-assert.equal(b.lastIndexOf(buf_bc, -3), 1);
-assert.equal(b.lastIndexOf(buf_bc, -5), 1);
-assert.equal(b.lastIndexOf(buf_bc, -6), -1);
-assert.equal(b.lastIndexOf(buf_bc, NaN), 1);
-assert.equal(b.lastIndexOf(buf_bc, -Infinity), -1);
-assert.equal(b.lastIndexOf(buf_bc, Infinity), 1);
-assert.equal(b.lastIndexOf(buf_f), b.length - 1);
-assert.equal(b.lastIndexOf(buf_z), -1);
-assert.equal(b.lastIndexOf(buf_empty), -1);
-assert.equal(b.lastIndexOf(buf_empty, 1), -1);
-assert.equal(b.lastIndexOf(buf_empty, b.length + 1), -1);
-assert.equal(b.lastIndexOf(buf_empty, Infinity), -1);
+assert.strictEqual(b.lastIndexOf(buf_a), 0);
+assert.strictEqual(b.lastIndexOf(buf_a, 1), 0);
+assert.strictEqual(b.lastIndexOf(buf_a, -1), 0);
+assert.strictEqual(b.lastIndexOf(buf_a, -4), 0);
+assert.strictEqual(b.lastIndexOf(buf_a, -b.length), 0);
+assert.strictEqual(b.lastIndexOf(buf_a, -b.length - 1), -1);
+assert.strictEqual(b.lastIndexOf(buf_a, NaN), 0);
+assert.strictEqual(b.lastIndexOf(buf_a, -Infinity), -1);
+assert.strictEqual(b.lastIndexOf(buf_a, Infinity), 0);
+assert.strictEqual(b.lastIndexOf(buf_bc), 1);
+assert.strictEqual(b.lastIndexOf(buf_bc, 2), 1);
+assert.strictEqual(b.lastIndexOf(buf_bc, -1), 1);
+assert.strictEqual(b.lastIndexOf(buf_bc, -3), 1);
+assert.strictEqual(b.lastIndexOf(buf_bc, -5), 1);
+assert.strictEqual(b.lastIndexOf(buf_bc, -6), -1);
+assert.strictEqual(b.lastIndexOf(buf_bc, NaN), 1);
+assert.strictEqual(b.lastIndexOf(buf_bc, -Infinity), -1);
+assert.strictEqual(b.lastIndexOf(buf_bc, Infinity), 1);
+assert.strictEqual(b.lastIndexOf(buf_f), b.length - 1);
+assert.strictEqual(b.lastIndexOf(buf_z), -1);
+assert.strictEqual(b.lastIndexOf(buf_empty), b.length);
+assert.strictEqual(b.lastIndexOf(buf_empty, 1), 1);
+assert.strictEqual(b.lastIndexOf(buf_empty, b.length + 1), b.length);
+assert.strictEqual(b.lastIndexOf(buf_empty, Infinity), b.length);
 // lastIndexOf number:
-assert.equal(b.lastIndexOf(0x61), 0);
-assert.equal(b.lastIndexOf(0x61, 1), 0);
-assert.equal(b.lastIndexOf(0x61, -1), 0);
-assert.equal(b.lastIndexOf(0x61, -4), 0);
-assert.equal(b.lastIndexOf(0x61, -b.length), 0);
-assert.equal(b.lastIndexOf(0x61, -b.length - 1), -1);
-assert.equal(b.lastIndexOf(0x61, NaN), 0);
-assert.equal(b.lastIndexOf(0x61, -Infinity), -1);
-assert.equal(b.lastIndexOf(0x61, Infinity), 0);
-assert.equal(b.lastIndexOf(0x0), -1);
+assert.strictEqual(b.lastIndexOf(0x61), 0);
+assert.strictEqual(b.lastIndexOf(0x61, 1), 0);
+assert.strictEqual(b.lastIndexOf(0x61, -1), 0);
+assert.strictEqual(b.lastIndexOf(0x61, -4), 0);
+assert.strictEqual(b.lastIndexOf(0x61, -b.length), 0);
+assert.strictEqual(b.lastIndexOf(0x61, -b.length - 1), -1);
+assert.strictEqual(b.lastIndexOf(0x61, NaN), 0);
+assert.strictEqual(b.lastIndexOf(0x61, -Infinity), -1);
+assert.strictEqual(b.lastIndexOf(0x61, Infinity), 0);
+assert.strictEqual(b.lastIndexOf(0x0), -1);
 
 // Test weird offset arguments.
-// Behaviour should match String.lastIndexOf:
-assert.equal(b.lastIndexOf('b', 0), -1);
-assert.equal(b.lastIndexOf('b', undefined), 1);
-assert.equal(b.lastIndexOf('b', null), -1);
-assert.equal(b.lastIndexOf('b', {}), 1);
-assert.equal(b.lastIndexOf('b', []), -1);
-assert.equal(b.lastIndexOf('b', [2]), 1);
+// The following offsets coerce to NaN, searching the whole Buffer
+assert.strictEqual(b.lastIndexOf('b', undefined), 1);
+assert.strictEqual(b.lastIndexOf('b', {}), 1);
+
+// The following offsets coerce to 0
+assert.strictEqual(b.lastIndexOf('b', 0), -1);
+assert.strictEqual(b.lastIndexOf('b', null), -1);
+assert.strictEqual(b.lastIndexOf('b', []), -1);
+
+// The following offset coerces to 2, in other words +[2] === 2
+assert.strictEqual(b.lastIndexOf('b', [2]), 1);
+
+// Behavior should match String.lastIndexOf()
+assert.strictEqual(
+  b.lastIndexOf('b', undefined),
+  s.lastIndexOf('b', undefined));
+assert.strictEqual(
+  b.lastIndexOf('b', {}),
+  s.lastIndexOf('b', {}));
+assert.strictEqual(
+  b.lastIndexOf('b', 0),
+  s.lastIndexOf('b', 0));
+assert.strictEqual(
+  b.lastIndexOf('b', null),
+  s.lastIndexOf('b', null));
+assert.strictEqual(
+  b.lastIndexOf('b', []),
+  s.lastIndexOf('b', []));
+assert.strictEqual(
+  b.lastIndexOf('b', [2]),
+  s.lastIndexOf('b', [2]));
 
 // Test needles longer than the haystack.
 assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 'ucs2'), -1);
@@ -430,26 +505,27 @@ assert.strictEqual(buf_bc.lastIndexOf('你好', 5, 'binary'), -1);
 assert.strictEqual(buf_bc.lastIndexOf(Buffer.from('你好'), 7), -1);
 
 // Test lastIndexOf on a longer buffer:
-var bufferString = new Buffer('a man a plan a canal panama');
-assert.equal(15, bufferString.lastIndexOf('canal'));
-assert.equal(21, bufferString.lastIndexOf('panama'));
-assert.equal(0, bufferString.lastIndexOf('a man a plan a canal panama'));
-assert.equal(-1, bufferString.lastIndexOf('a man a plan a canal mexico'));
-assert.equal(-1, bufferString.lastIndexOf('a man a plan a canal mexico city'));
-assert.equal(-1, bufferString.lastIndexOf(Buffer.from('a'.repeat(1000))));
-assert.equal(0, bufferString.lastIndexOf('a man a plan', 4));
-assert.equal(13, bufferString.lastIndexOf('a '));
-assert.equal(13, bufferString.lastIndexOf('a ', 13));
-assert.equal(6, bufferString.lastIndexOf('a ', 12));
-assert.equal(0, bufferString.lastIndexOf('a ', 5));
-assert.equal(13, bufferString.lastIndexOf('a ', -1));
-assert.equal(0, bufferString.lastIndexOf('a ', -27));
-assert.equal(-1, bufferString.lastIndexOf('a ', -28));
+const bufferString = new Buffer('a man a plan a canal panama');
+assert.strictEqual(15, bufferString.lastIndexOf('canal'));
+assert.strictEqual(21, bufferString.lastIndexOf('panama'));
+assert.strictEqual(0, bufferString.lastIndexOf('a man a plan a canal panama'));
+assert.strictEqual(-1, bufferString.lastIndexOf('a man a plan a canal mexico'));
+assert.strictEqual(-1, bufferString
+  .lastIndexOf('a man a plan a canal mexico city'));
+assert.strictEqual(-1, bufferString.lastIndexOf(Buffer.from('a'.repeat(1000))));
+assert.strictEqual(0, bufferString.lastIndexOf('a man a plan', 4));
+assert.strictEqual(13, bufferString.lastIndexOf('a '));
+assert.strictEqual(13, bufferString.lastIndexOf('a ', 13));
+assert.strictEqual(6, bufferString.lastIndexOf('a ', 12));
+assert.strictEqual(0, bufferString.lastIndexOf('a ', 5));
+assert.strictEqual(13, bufferString.lastIndexOf('a ', -1));
+assert.strictEqual(0, bufferString.lastIndexOf('a ', -27));
+assert.strictEqual(-1, bufferString.lastIndexOf('a ', -28));
 
 // Test lastIndexOf for the case that the first character can be found,
 // but in a part of the buffer that does not make search to search
 // due do length constraints.
-var abInUCS2 = Buffer.from('ab', 'ucs2');
+const abInUCS2 = Buffer.from('ab', 'ucs2');
 assert.strictEqual(-1, Buffer.from('µaaaa¶bbbb', 'latin1').lastIndexOf('µ'));
 assert.strictEqual(-1, Buffer.from('µaaaa¶bbbb', 'binary').lastIndexOf('µ'));
 assert.strictEqual(-1, Buffer.from('bc').lastIndexOf('ab'));
@@ -468,9 +544,9 @@ assert.strictEqual(0, Buffer.from('abc').lastIndexOf('ab', 3));
 // Now, we test the BOYER-MOORE-HORSPOOL strategy.
 // Test lastIndexOf on a long buffer w multiple matches:
 pattern = 'JABACABADABACABA';
-assert.equal(1535, longBufferString.lastIndexOf(pattern));
-assert.equal(1535, longBufferString.lastIndexOf(pattern, 1535));
-assert.equal(511, longBufferString.lastIndexOf(pattern, 1534));
+assert.strictEqual(1535, longBufferString.lastIndexOf(pattern));
+assert.strictEqual(1535, longBufferString.lastIndexOf(pattern, 1535));
+assert.strictEqual(511, longBufferString.lastIndexOf(pattern, 1534));
 
 // Finally, give it a really long input to trigger fallback from BMH to
 // regular BOYER-MOORE (which has better worst-case complexity).
@@ -481,33 +557,34 @@ assert.equal(511, longBufferString.lastIndexOf(pattern, 1534));
 
 // countBits returns the number of bits in the binary representation of n.
 function countBits(n) {
-  for (var count = 0; n > 0; count++) {
+  let count;
+  for (count = 0; n > 0; count++) {
     n = n & (n - 1); // remove top bit
   }
   return count;
 }
-var parts = [];
-for (var i = 0; i < 1000000; i++) {
+const parts = [];
+for (let i = 0; i < 1000000; i++) {
   parts.push((countBits(i) % 2 === 0) ? 'yolo' : 'swag');
 }
-var reallyLong = new Buffer(parts.join(' '));
-assert.equal('yolo swag swag yolo', reallyLong.slice(0, 19).toString());
+const reallyLong = new Buffer(parts.join(' '));
+assert.strictEqual('yolo swag swag yolo', reallyLong.slice(0, 19).toString());
 
 // Expensive reverse searches. Stress test lastIndexOf:
 pattern = reallyLong.slice(0, 100000);  // First 1/50th of the pattern.
-assert.equal(4751360, reallyLong.lastIndexOf(pattern));
-assert.equal(3932160, reallyLong.lastIndexOf(pattern, 4000000));
-assert.equal(2949120, reallyLong.lastIndexOf(pattern, 3000000));
+assert.strictEqual(4751360, reallyLong.lastIndexOf(pattern));
+assert.strictEqual(3932160, reallyLong.lastIndexOf(pattern, 4000000));
+assert.strictEqual(2949120, reallyLong.lastIndexOf(pattern, 3000000));
 pattern = reallyLong.slice(100000, 200000);  // Second 1/50th.
-assert.equal(4728480, reallyLong.lastIndexOf(pattern));
+assert.strictEqual(4728480, reallyLong.lastIndexOf(pattern));
 pattern = reallyLong.slice(0, 1000000);  // First 1/5th.
-assert.equal(3932160, reallyLong.lastIndexOf(pattern));
+assert.strictEqual(3932160, reallyLong.lastIndexOf(pattern));
 pattern = reallyLong.slice(0, 2000000);  // first 2/5ths.
-assert.equal(0, reallyLong.lastIndexOf(pattern));
+assert.strictEqual(0, reallyLong.lastIndexOf(pattern));
 
 // test truncation of Number arguments to uint8
 {
-  var buf = Buffer.from('this is a test');
+  const buf = Buffer.from('this is a test');
   assert.strictEqual(buf.indexOf(0x6973), 3);
   assert.strictEqual(buf.indexOf(0x697320), 4);
   assert.strictEqual(buf.indexOf(0x69732069), 2);
@@ -521,3 +598,12 @@ assert.equal(0, reallyLong.lastIndexOf(pattern));
   assert.strictEqual(buf.indexOf(0xffff), -1);
 }
 
+// Test that Uint8Array arguments are okay.
+{
+  const needle = new Uint8Array([ 0x66, 0x6f, 0x6f ]);
+  const haystack = Buffer.from('a foo b foo');
+  debugger
+  assert.strictEqual(haystack.indexOf(needle), 2);
+  assert.strictEqual(haystack.lastIndexOf(needle), haystack.length - 3);
+}
+
diff --git a/test/node/test-buffer-slice.js b/test/node/test-buffer-slice.js
index c2d3282..b777ba8 100644
--- a/test/node/test-buffer-slice.js
+++ b/test/node/test-buffer-slice.js
@@ -1,4 +1,3 @@
-// Copyright Joyent, Inc. and other Node contributors.var Buffer = require('../../').Buffer;
 // Copyright Joyent, Inc. and other Node contributors.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a
@@ -19,6 +18,7 @@
 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
+var Buffer = require('../../').Buffer;
 
 'use strict';
 
@@ -78,9 +78,8 @@ expectedSameBufs.forEach(([buf1, buf2]) => {
 
 const utf16Buf = Buffer.from('0123456789', 'utf16le');
 assert.deepStrictEqual(utf16Buf.slice(0, 6), Buffer.from('012', 'utf16le'));
-// try to slice a zero length Buffer
-// see https://github.com/joyent/node/issues/5881
-assert.doesNotThrow(() => Buffer.alloc(0).slice(0, 1));
+// Try to slice a zero length Buffer.
+// See https://github.com/joyent/node/issues/5881
 assert.strictEqual(Buffer.alloc(0).slice(0, 1).length, 0);
 
 {