'use strict'; require('../common'); const { deepStrictEqual, throws } = require('assert'); const { runInNewContext } = require('vm'); const checkString = 'test'; const check = Buffer.from(checkString); class MyString extends String { constructor() { super(checkString); } } class MyPrimitive { [Symbol.toPrimitive]() { return checkString; } } class MyBadPrimitive { [Symbol.toPrimitive]() { return 1; } } deepStrictEqual(Buffer.from(new String(checkString)), check); deepStrictEqual(Buffer.from(new MyString()), check); deepStrictEqual(Buffer.from(new MyPrimitive()), check); deepStrictEqual( Buffer.from(runInNewContext('new String(checkString)', { checkString })), check ); [ [{}, 'object'], [new Boolean(true), 'boolean'], [{ valueOf() { return null; } }, 'object'], [{ valueOf() { return undefined; } }, 'object'], [{ valueOf: null }, 'object'], [Object.create(null), 'object'], [new Number(true), 'number'], [new MyBadPrimitive(), 'number'], [Symbol(), 'symbol'], [5n, 'bigint'], [(one, two, three) => {}, 'function'], [undefined, 'undefined'], [null, 'object'] ].forEach(([input, actualType]) => { const errObj = { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The first argument must be one of type string, Buffer, ' + 'ArrayBuffer, Array, or Array-like Object. Received ' + `type ${actualType}` }; throws(() => Buffer.from(input), errObj); throws(() => Buffer.from(input, 'hex'), errObj); }); Buffer.allocUnsafe(10); // Should not throw. Buffer.from('deadbeaf', 'hex'); // Should not throw.