diff --git a/.eslintrc b/.eslintrc index 4ff2c50..4fb86e1 100644 --- a/.eslintrc +++ b/.eslintrc @@ -16,6 +16,7 @@ "files": ["example/**", "test/**"], "rules": { "array-bracket-newline": 0, + "max-lines": 0, "max-params": 0, "max-statements": 0, "no-console": 0, diff --git a/index.js b/index.js index 61307f3..d980db2 100644 --- a/index.js +++ b/index.js @@ -50,7 +50,7 @@ function isBuffer(x) { } function objEquiv(a, b, opts) { - /* eslint max-statements: [2, 50] */ + /* eslint max-statements: [2, 70] */ var i, key; if (typeof a !== typeof b) { return false; } if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; } @@ -60,6 +60,14 @@ function objEquiv(a, b, opts) { if (isArguments(a) !== isArguments(b)) { return false; } + // TODO: replace when a cross-realm brand check is available + var aIsError = a instanceof Error; + var bIsError = b instanceof Error; + if (aIsError !== bIsError) { return false; } + if (aIsError || bIsError) { + if (a.name !== b.name || a.message !== b.message) { return false; } + } + var aIsRegex = isRegex(a); var bIsRegex = isRegex(b); if (aIsRegex !== bIsRegex) { return false; } diff --git a/package.json b/package.json index f580769..cfabbfc 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "devDependencies": { "@ljharb/eslint-config": "^13.1.1", "eslint": "^5.16.0", + "object.assign": "^4.1.0", "tape": "^4.11.0" }, "repository": { diff --git a/test/cmp.js b/test/cmp.js index b377743..f540228 100644 --- a/test/cmp.js +++ b/test/cmp.js @@ -1,5 +1,6 @@ var test = require('tape'); require('./_tape'); +var assign = require('object.assign'); var equal = require('../'); @@ -342,3 +343,29 @@ test('functions', function (t) { t.end(); }); + +test('Errors', function (t) { + t.deepEqualTest(new Error('xyz'), new Error('xyz'), 'two errors of the same type with the same message', true, true, false); + t.deepEqualTest(new Error('xyz'), new TypeError('xyz'), 'two errors of different types with the same message', false, false); + t.deepEqualTest(new Error('xyz'), new Error('zyx'), 'two errors of the same type with a different message', false, false); + + t.deepEqualTest( + new Error('a'), + assign(new Error('a'), { code: 10 }), + 'two otherwise equal errors with different own properties', + false, + false + ); + + t.end(); +}); + +test('errors', function (t) { + + t.end(); +}); + +test('error = Object', function (t) { + t.notOk(equal(new Error('a'), { message: 'a' })); + t.end(); +});