Skip to content

Commit 7b7beb2

Browse files
puskin94synapse
andcommitted
assert: adds partialDeepEqual, partialDeepStrictEqual, includes
Fixes: nodejs#50399 Co-Authored-By: Cristian Barlutiu <cristian.barlutiu@gmail.com>
1 parent 6a6c957 commit 7b7beb2

File tree

4 files changed

+1053
-1
lines changed

4 files changed

+1053
-1
lines changed

doc/api/assert.md

+229
Original file line numberDiff line numberDiff line change
@@ -2548,6 +2548,232 @@ assert.throws(throwingFirst, /Second$/);
25482548
Due to the confusing error-prone notation, avoid a string as the second
25492549
argument.
25502550

2551+
## `assert.partialDeepEqual(actual, expected[, message])`
2552+
2553+
<!-- YAML
2554+
added: REPLACEME
2555+
-->
2556+
2557+
* `actual` {any}
2558+
* `expected` {any}
2559+
* `message` {string|Error}
2560+
2561+
[`assert.partialDeepEqual()`][] evaluates the equivalence between the `actual` and `expected` parameters by
2562+
performing a deep comparison. This function ensures that all properties defined
2563+
in the `expected` parameter match those in the `actual` parameter in
2564+
both value and type, allowing type coercion. The main difference with [`assert.deepEqual()`][] is that
2565+
[`assert.partialDeepEqual()`][] does not require all properties in the `actual` parameter to be present in the
2566+
`expected` parameter.
2567+
2568+
```mjs
2569+
import assert from 'node:assert';
2570+
2571+
assert.partialDeepEqual({ a: 1, b: '2' }, { a: 1, b: 2 });
2572+
// OK
2573+
2574+
assert.partialDeepEqual({ a: 1, b: '2', c: 3 }, { a: 1, b: 2 });
2575+
// OK
2576+
2577+
assert.partialDeepEqual({ a: { b: { c: '1' } } }, { a: { b: { c: 1 } } });
2578+
// OK
2579+
2580+
assert.partialDeepEqual(new Set(['value1', 'value2']), new Set(['value1', 'value2']));
2581+
// OK
2582+
2583+
assert.partialDeepEqual(new Map([['key1', 'value1']]), new Map([['key1', 'value1']]));
2584+
// OK
2585+
2586+
assert.partialDeepEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]));
2587+
// OK
2588+
2589+
assert.partialDeepEqual(/abc/, /abc/);
2590+
// OK
2591+
2592+
assert.partialDeepEqual(new Date(0), new Date(0));
2593+
// OK
2594+
2595+
assert.partialDeepEqual({ a: 1 }, { a: 1, b: 2 });
2596+
// AssertionError
2597+
2598+
assert.partialDeepEqual({ a: 1, b: true }, { a: 1, b: 'true' });
2599+
// AssertionError
2600+
2601+
assert.partialDeepEqual({ a: { b: 2 } }, { a: { b: 2, c: 3 } });
2602+
// AssertionError
2603+
```
2604+
2605+
```cjs
2606+
const assert = require('node:assert');
2607+
2608+
assert.partialDeepEqual({ a: 1, b: '2' }, { a: 1, b: 2 });
2609+
// OK
2610+
2611+
assert.partialDeepEqual({ a: 1, b: '2', c: 3 }, { a: 1, b: 2 });
2612+
// OK
2613+
2614+
assert.partialDeepEqual({ a: { b: { c: '1' } } }, { a: { b: { c: 1 } } });
2615+
// OK
2616+
2617+
assert.partialDeepEqual(new Set(['value1', 'value2']), new Set(['value1', 'value2']));
2618+
// OK
2619+
2620+
assert.partialDeepEqual(new Map([['key1', 'value1']]), new Map([['key1', 'value1']]));
2621+
// OK
2622+
2623+
assert.partialDeepEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]));
2624+
// OK
2625+
2626+
assert.partialDeepEqual(/abc/, /abc/);
2627+
// OK
2628+
2629+
assert.partialDeepEqual(new Date(0), new Date(0));
2630+
// OK
2631+
2632+
assert.partialDeepEqual({ a: 1 }, { a: 1, b: 2 });
2633+
// AssertionError: Expected key b
2634+
2635+
assert.partialDeepEqual({ a: 1, b: true }, { a: 1, b: 'true' });
2636+
// AssertionError
2637+
2638+
assert.partialDeepEqual({ a: { b: 2, d: 4 } }, { a: { b: 2, c: 3 } });
2639+
// AssertionError: Expected key c
2640+
```
2641+
2642+
If the values or keys are not equal in the `expected` parameter, an [`AssertionError`][] is thrown with a `message`
2643+
property set equal to the value of the `message` parameter. If the `message`
2644+
parameter is undefined, a default error message is assigned. If the `message`
2645+
parameter is an instance of an [`Error`][] then it will be thrown instead of the
2646+
`AssertionError`.
2647+
2648+
## `assert.partialDeepStrictEqual(actual, expected[, message])`
2649+
2650+
<!-- YAML
2651+
added: REPLACEME
2652+
-->
2653+
2654+
* `actual` {any}
2655+
* `expected` {any}
2656+
* `message` {string|Error}
2657+
2658+
[`assert.partialDeepStrictEqual()`][] Assesses the equivalence between the `actual` and `expected` parameters through a
2659+
deep comparison, ensuring that all properties in the `expected` parameter are
2660+
present in the `actual` parameter with equivalent values, not allowing type coercion.
2661+
The main difference with [`assert.deepStrictEqual()`][] is that [`assert.partialDeepStrictEqual()`][] does not require
2662+
all properties in the `actual` parameter to be present in the `expected` parameter.
2663+
2664+
```mjs
2665+
import assert from 'node:assert';
2666+
2667+
assert.partialDeepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 });
2668+
// OK
2669+
2670+
assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } });
2671+
// OK
2672+
2673+
assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 });
2674+
// OK
2675+
2676+
assert.partialDeepStrictEqual(new Set(['value1', 'value2']), new Set(['value1', 'value2']));
2677+
// OK
2678+
2679+
assert.partialDeepStrictEqual(new Map([['key1', 'value1']]), new Map([['key1', 'value1']]));
2680+
// OK
2681+
2682+
assert.partialDeepStrictEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]));
2683+
// OK
2684+
2685+
assert.partialDeepStrictEqual(/abc/, /abc/);
2686+
// OK
2687+
2688+
assert.partialDeepStrictEqual(new Date(0), new Date(0));
2689+
// OK
2690+
2691+
assert.partialDeepStrictEqual({ a: 1 }, { a: 1, b: 2 });
2692+
// AssertionError
2693+
2694+
assert.partialDeepStrictEqual({ a: 1, b: '2' }, { a: 1, b: 2 });
2695+
// AssertionError
2696+
2697+
assert.partialDeepStrictEqual({ a: { b: 2 } }, { a: { b: '2' } });
2698+
// AssertionError
2699+
```
2700+
2701+
```cjs
2702+
const assert = require('node:assert');
2703+
2704+
assert.partialDeepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 });
2705+
// OK
2706+
2707+
assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } });
2708+
// OK
2709+
2710+
assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 });
2711+
// OK
2712+
2713+
assert.partialDeepStrictEqual({ a: 1 }, { a: 1, b: 2 });
2714+
// AssertionError
2715+
2716+
assert.partialDeepStrictEqual({ a: 1, b: '2' }, { a: 1, b: 2 });
2717+
// AssertionError
2718+
2719+
assert.partialDeepStrictEqual({ a: { b: 2 } }, { a: { b: '2' } });
2720+
// AssertionError
2721+
```
2722+
2723+
## `assert.includes(actual, expected[, message])`
2724+
2725+
<!-- YAML
2726+
added: REPLACEME
2727+
-->
2728+
2729+
* `actual` {Array | string}
2730+
* `expected` {any}
2731+
* `message` {string|Error}
2732+
2733+
[`assert.includes()`][] compares the `actual` and `expected` parameters to determine if the `expected`
2734+
parameter is included in the `actual` parameter; the comparison is done with type coercion.
2735+
The `actual` and the `expected` parameters can be
2736+
either an array or a string. If the `actual` parameter is an array,
2737+
the `expected` parameter must be an array and vice versa for strings.
2738+
2739+
```mjs
2740+
import assert from 'node:assert';
2741+
2742+
assert.includes([1, 2, 3], 2);
2743+
// OK
2744+
2745+
assert.includes('Hello World!', 'World');
2746+
// OK
2747+
2748+
assert.includes([1, 2, 3], '2');
2749+
// AssertionError
2750+
2751+
assert.includes('Hello World!', 'Node.js');
2752+
// AssertionError
2753+
```
2754+
2755+
```cjs
2756+
const assert = require('node:assert');
2757+
2758+
assert.includes([1, 2, 3], 2);
2759+
// OK
2760+
2761+
assert.includes('Hello World!', 'World');
2762+
// OK
2763+
2764+
assert.includes([1, 2, 3], '2');
2765+
// AssertionError
2766+
2767+
assert.includes('Hello World!', 'Node.js');
2768+
// AssertionError
2769+
```
2770+
2771+
If the assertion fails, an [`AssertionError`][] is thrown with a `message`
2772+
property set equal to the value of the `message` parameter. If the `message`
2773+
parameter is undefined, a default error message is assigned. If the `message`
2774+
parameter is an instance of an [`Error`][] then it will be thrown instead of the
2775+
`AssertionError`.
2776+
25512777
[Object wrappers]: https://developer.mozilla.org/en-US/docs/Glossary/Primitive#Primitive_wrapper_objects_in_JavaScript
25522778
[Object.prototype.toString()]: https://tc39.github.io/ecma262/#sec-object.prototype.tostring
25532779
[`!=` operator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Inequality
@@ -2571,11 +2797,14 @@ argument.
25712797
[`assert.deepStrictEqual()`]: #assertdeepstrictequalactual-expected-message
25722798
[`assert.doesNotThrow()`]: #assertdoesnotthrowfn-error-message
25732799
[`assert.equal()`]: #assertequalactual-expected-message
2800+
[`assert.includes()`]: #assertincludesactual-expected-message
25742801
[`assert.notDeepEqual()`]: #assertnotdeepequalactual-expected-message
25752802
[`assert.notDeepStrictEqual()`]: #assertnotdeepstrictequalactual-expected-message
25762803
[`assert.notEqual()`]: #assertnotequalactual-expected-message
25772804
[`assert.notStrictEqual()`]: #assertnotstrictequalactual-expected-message
25782805
[`assert.ok()`]: #assertokvalue-message
2806+
[`assert.partialDeepEqual()`]: #assertpartialdeepequalactual-expected-message
2807+
[`assert.partialDeepStrictEqual()`]: #assertpartialdeepstrictequalactual-expected-message
25792808
[`assert.strictEqual()`]: #assertstrictequalactual-expected-message
25802809
[`assert.throws()`]: #assertthrowsfn-error-message
25812810
[`getColorDepth()`]: tty.md#writestreamgetcolordepthenv

0 commit comments

Comments
 (0)