Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose strict mode functionality #41

Merged
merged 4 commits into from Apr 11, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
37 changes: 37 additions & 0 deletions README.md
Expand Up @@ -7,6 +7,43 @@ This module is used for writing unit tests for your applications, you can access
It aims to be fully compatibe with the [node.js assert module](http://nodejs.org/api/assert.html), same API and same behavior, just adding support for web browsers.
The API and code may contain traces of the [CommonJS Unit Testing 1.0 spec](http://wiki.commonjs.org/wiki/Unit_Testing/1.0) which they were based on, but both have evolved significantly since then.

A `strict` and a `legacy` mode exist, while it is recommended to only use `strict mode`.

## Strict mode

When using the `strict mode`, any `assert` function will use the equality used in the strict function mode. So `assert.deepEqual()` will, for example, work the same as `assert.deepStrictEqual()`.

It can be accessed using:

```js
const assert = require('assert').strict;
```

## Legacy mode

> Deprecated: Use strict mode instead.

When accessing `assert` directly instead of using the `strict` property, the
[Abstract Equality Comparison](https://tc39.github.io/ecma262/#sec-abstract-equality-comparison) will be used for any function without a
"strict" in its name (e.g. `assert.deepEqual()`).

It can be accessed using:

```js
const assert = require('assert');
```

It is recommended to use the `strict mode` instead as the Abstract Equality Comparison can often have surprising results. Especially
in case of `assert.deepEqual()` as the used comparison rules there are very lax.

E.g.

```js
// WARNING: This does not throw an AssertionError!
assert.deepEqual(/a/gi, new Date());
```


## assert.fail(actual, expected, message, operator)
Throws an exception that displays the values for actual and expected separated by the provided operator.

Expand Down
14 changes: 14 additions & 0 deletions assert.js
@@ -1,5 +1,7 @@
'use strict';

var objectAssign = require('object-assign');

// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
// original notice:

Expand Down Expand Up @@ -483,6 +485,18 @@ assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {

assert.ifError = function(err) { if (err) throw err; };

// Expose a strict only variant of assert
function strict(value, message) {
if (!value) fail(value, true, message, '==', strict);
}
assert.strict = objectAssign(strict, assert, {
equal: assert.strictEqual,
deepEqual: assert.deepStrictEqual,
notEqual: assert.notStrictEqual,
notDeepEqual: assert.notDeepStrictEqual
});
assert.strict.strict = assert.strict;

var objectKeys = Object.keys || function (obj) {
var keys = [];
for (var key in obj) {
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -13,6 +13,7 @@
},
"main": "./assert.js",
"dependencies": {
"object-assign": "^4.1.1",
"util": "0.10.3"
},
"devDependencies": {
Expand Down
15 changes: 15 additions & 0 deletions test.js
Expand Up @@ -342,4 +342,19 @@ function tests (assert, what) {
assert.equal(e.toString().split('\n')[0], 'AssertionError: oh no');
}
});

test('assert - strict mode', function () {
var assertStrict = assert.strict;

assertStrict.throws(makeBlock(assertStrict.equal, 1, true), assertStrict.AssertionError);
assertStrict.notEqual(0, false);
assertStrict.throws(makeBlock(assertStrict.deepEqual, 1, true), assertStrict.AssertionError);
assertStrict.notDeepEqual(0, false);
assertStrict.equal(assertStrict.strict, assertStrict.strict.strict);
assertStrict.equal(assertStrict.equal, assertStrict.strictEqual);
assertStrict.equal(assertStrict.deepEqual, assertStrict.deepStrictEqual);
assertStrict.equal(assertStrict.notEqual, assertStrict.notStrictEqual);
assertStrict.equal(assertStrict.notDeepEqual, assertStrict.notDeepStrictEqual);
assertStrict.equal(Object.keys(assertStrict).length, Object.keys(assert).length);
});
}