const inspect = require('bare-inspect')
class AssertionError extends Error {
constructor(opts = {}) {
let { message = null, actual, expected, operator } = opts
if (message === null) {
message = `${inspect(actual)} ${operator} ${inspect(expected)}`
}
super(message)
this.actual = actual
this.expected = expected
this.operator = operator
}
get name() {
return 'AssertionError'
}
get code() {
'ASSERTION'
}
}
function assertFail(opts, fn) {
if (opts.message instanceof Error) throw opts.message
const err = new AssertionError(opts)
if (Error.captureStackTrace) Error.captureStackTrace(err, fn)
throw err
}
module.exports = exports = function assert(actual, message) {
if (actual) return
assertFail({ message, actual, expected: true, operator: '==' }, assert)
}
exports.AssertionError = AssertionError
exports.fail = function fail(message) {
if (message === undefined) message = 'Failed'
assertFail({ message, operator: 'fail' }, fail)
}
exports.ok = function ok(actual, message) {
if (actual) return
assertFail({ message, actual, expected: true, operator: '==' }, ok)
}
exports.notOk = function ok(actual, message) {
if (!actual) return
assertFail({ message, actual, expected: false, operator: '==' }, ok)
}
exports.equal = function equal(actual, expected, message) {
if (actual == expected || (actual !== actual && expected !== expected)) {
return
}
assertFail({ message, actual, expected, operator: '==' }, equal)
}
exports.notEqual = function notEqual(actual, expected, message) {
if (actual != expected && (actual === actual || expected === expected)) {
return
}
assertFail({ message, actual, expected, operator: '!=' }, notEqual)
}
exports.strictEqual = function strictEqual(actual, expected, message) {
if (Object.is(actual, expected)) return
assertFail(
{ message, actual, expected, operator: 'strictEqual' },
strictEqual
)
}
exports.notStrictEqual = function notStrictEqual(actual, expected, message) {
if (!Object.is(actual, expected)) return
assertFail(
{ message, actual, expected, operator: 'notStrictEqual' },
notStrictEqual
)
}