Skip to content

Commit 5050654

Browse files
pedrottimarkSimenB
authored andcommitted
expect: Improve report when matcher fails, part 8 (#7876)
1 parent 0cf47c4 commit 5050654

3 files changed

Lines changed: 148 additions & 82 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### Features
44

55
- `[expect]`: Improve report when matcher fails, part 7 ([#7866](https://github.com/facebook/jest/pull/7866))
6+
- `[expect]`: Improve report when matcher fails, part 8 ([#7876](https://github.com/facebook/jest/pull/7876))
67

78
### Fixes
89

packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap

Lines changed: 107 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -389,139 +389,178 @@ Received: <red>true</>"
389389
`;
390390

391391
exports[`.toBeCloseTo() {pass: false} expect(-Infinity)toBeCloseTo( -1.23) 1`] = `
392-
"<dim>expect(</><red>received</><dim>).toBeCloseTo(</><green>expected</><dim>)</>
392+
"<dim>expect(</><red>received</><dim>).</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
393393

394-
Precision: <green>2</>-digit
395-
Expected: <green>-1.23</>
396-
Received: <red>-Infinity</>"
394+
Expected: <green>-1.23</>
395+
Received: <red>-Infinity</>
396+
397+
Expected precision: <green>2</>
398+
Expected difference: < <green>0.005</>
399+
Received difference: <red>Infinity</>"
397400
`;
398401

399402
exports[`.toBeCloseTo() {pass: false} expect(Infinity)toBeCloseTo( -Infinity) 1`] = `
400-
"<dim>expect(</><red>received</><dim>).toBeCloseTo(</><green>expected</><dim>)</>
403+
"<dim>expect(</><red>received</><dim>).</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
404+
405+
Expected: <green>-Infinity</>
406+
Received: <red>Infinity</>
401407

402-
Precision: <green>2</>-digit
403-
Expected: <green>-Infinity</>
404-
Received: <red>Infinity</>"
408+
Expected precision: <green>2</>
409+
Expected difference: < <green>0.005</>
410+
Received difference: <red>Infinity</>"
405411
`;
406412

407413
exports[`.toBeCloseTo() {pass: false} expect(Infinity)toBeCloseTo( 1.23) 1`] = `
408-
"<dim>expect(</><red>received</><dim>).toBeCloseTo(</><green>expected</><dim>)</>
414+
"<dim>expect(</><red>received</><dim>).</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
415+
416+
Expected: <green>1.23</>
417+
Received: <red>Infinity</>
409418

410-
Precision: <green>2</>-digit
411-
Expected: <green>1.23</>
412-
Received: <red>Infinity</>"
419+
Expected precision: <green>2</>
420+
Expected difference: < <green>0.005</>
421+
Received difference: <red>Infinity</>"
413422
`;
414423

415424
exports[`.toBeCloseTo() {pass: true} expect(-Infinity)toBeCloseTo( -Infinity) 1`] = `
416-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
425+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
417426

418-
Precision: <green>2</>-digit
419-
Expected: <green>-Infinity</>
420-
Received: <red>-Infinity</>"
427+
Expected: not <green>-Infinity</>
428+
"
421429
`;
422430

423431
exports[`.toBeCloseTo() {pass: true} expect(0)toBeCloseTo( 0) 1`] = `
424-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
432+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
425433

426-
Precision: <green>2</>-digit
427-
Expected: <green>0</>
428-
Received: <red>0</>"
434+
Expected: not <green>0</>
435+
"
429436
`;
430437

431438
exports[`.toBeCloseTo() {pass: true} expect(0)toBeCloseTo( 0.001) 1`] = `
432-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
439+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
433440

434-
Precision: <green>2</>-digit
435-
Expected: <green>0.001</>
436-
Received: <red>0</>"
441+
Expected: not <green>0.001</>
442+
Received: <red>0</>
443+
444+
Expected precision: <green>2</>
445+
Expected difference: not < <green>0.005</>
446+
Received difference: <red>0.001</>"
437447
`;
438448

439449
exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.225) 1`] = `
440-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
450+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
451+
452+
Expected: not <green>1.225</>
453+
Received: <red>1.23</>
441454

442-
Precision: <green>2</>-digit
443-
Expected: <green>1.225</>
444-
Received: <red>1.23</>"
455+
Expected precision: <green>2</>
456+
Expected difference: not < <green>0.005</>
457+
Received difference: <red>0.004999999999999893</>"
445458
`;
446459

447460
exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.226) 1`] = `
448-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
461+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
449462

450-
Precision: <green>2</>-digit
451-
Expected: <green>1.226</>
452-
Received: <red>1.23</>"
463+
Expected: not <green>1.226</>
464+
Received: <red>1.23</>
465+
466+
Expected precision: <green>2</>
467+
Expected difference: not < <green>0.005</>
468+
Received difference: <red>0.0040000000000000036</>"
453469
`;
454470

455471
exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.229) 1`] = `
456-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
472+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
473+
474+
Expected: not <green>1.229</>
475+
Received: <red>1.23</>
457476

458-
Precision: <green>2</>-digit
459-
Expected: <green>1.229</>
460-
Received: <red>1.23</>"
477+
Expected precision: <green>2</>
478+
Expected difference: not < <green>0.005</>
479+
Received difference: <red>0.0009999999999998899</>"
461480
`;
462481

463482
exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.234) 1`] = `
464-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
483+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
465484

466-
Precision: <green>2</>-digit
467-
Expected: <green>1.234</>
468-
Received: <red>1.23</>"
485+
Expected: not <green>1.234</>
486+
Received: <red>1.23</>
487+
488+
Expected precision: <green>2</>
489+
Expected difference: not < <green>0.005</>
490+
Received difference: <red>0.0040000000000000036</>"
469491
`;
470492

471493
exports[`.toBeCloseTo() {pass: true} expect(Infinity)toBeCloseTo( Infinity) 1`] = `
472-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>)</>
494+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
473495

474-
Precision: <green>2</>-digit
475-
Expected: <green>Infinity</>
476-
Received: <red>Infinity</>"
496+
Expected: not <green>Infinity</>
497+
"
477498
`;
478499

479500
exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.000004, 5] 1`] = `
480-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>, </><green>precision</><dim>)</>
501+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>, </><green>precision</><dim>)</>
481502

482-
Precision: <green>5</>-digit
483-
Expected: <green>0.000004</>
484-
Received: <red>0</>"
503+
Expected: not <green>0.000004</>
504+
Received: <red>0</>
505+
506+
Expected precision: <green>5</>
507+
Expected difference: not < <green>0.000005</>
508+
Received difference: <red>0.000004</>"
485509
`;
486510

487511
exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.0001, 3] 1`] = `
488-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>, </><green>precision</><dim>)</>
512+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>, </><green>precision</><dim>)</>
513+
514+
Expected: not <green>0.0001</>
515+
Received: <red>0</>
489516

490-
Precision: <green>3</>-digit
491-
Expected: <green>0.0001</>
492-
Received: <red>0</>"
517+
Expected precision: <green>3</>
518+
Expected difference: not < <green>0.0005</>
519+
Received difference: <red>0.0001</>"
493520
`;
494521

495522
exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.1, 0] 1`] = `
496-
"<dim>expect(</><red>received</><dim>).</>not<dim>.toBeCloseTo(</><green>expected</><dim>, </><green>precision</><dim>)</>
523+
"<dim>expect(</><red>received</><dim>).</>not<dim>.</>toBeCloseTo<dim>(</><green>expected</><dim>, </><green>precision</><dim>)</>
497524

498-
Precision: <green>0</>-digit
499-
Expected: <green>0.1</>
500-
Received: <red>0</>"
525+
Expected: not <green>0.1</>
526+
Received: <red>0</>
527+
528+
Expected precision: <green>0</>
529+
Expected difference: not < <green>0.5</>
530+
Received difference: <red>0.1</>"
501531
`;
502532

503533
exports[`.toBeCloseTo() throws: [0, 0.01] 1`] = `
504-
"<dim>expect(</><red>received</><dim>).toBeCloseTo(</><green>expected</><dim>)</>
534+
"<dim>expect(</><red>received</><dim>).</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
535+
536+
Expected: <green>0.01</>
537+
Received: <red>0</>
505538

506-
Precision: <green>2</>-digit
507-
Expected: <green>0.01</>
508-
Received: <red>0</>"
539+
Expected precision: <green>2</>
540+
Expected difference: < <green>0.005</>
541+
Received difference: <red>0.01</>"
509542
`;
510543

511544
exports[`.toBeCloseTo() throws: [1, 1.23] 1`] = `
512-
"<dim>expect(</><red>received</><dim>).toBeCloseTo(</><green>expected</><dim>)</>
545+
"<dim>expect(</><red>received</><dim>).</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
513546

514-
Precision: <green>2</>-digit
515-
Expected: <green>1.23</>
516-
Received: <red>1</>"
547+
Expected: <green>1.23</>
548+
Received: <red>1</>
549+
550+
Expected precision: <green>2</>
551+
Expected difference: < <green>0.005</>
552+
Received difference: <red>0.22999999999999998</>"
517553
`;
518554

519555
exports[`.toBeCloseTo() throws: [1.23, 1.2249999] 1`] = `
520-
"<dim>expect(</><red>received</><dim>).toBeCloseTo(</><green>expected</><dim>)</>
556+
"<dim>expect(</><red>received</><dim>).</>toBeCloseTo<dim>(</><green>expected</><dim>)</>
557+
558+
Expected: <green>1.2249999</>
559+
Received: <red>1.23</>
521560

522-
Precision: <green>2</>-digit
523-
Expected: <green>1.2249999</>
524-
Received: <red>1.23</>"
561+
Expected precision: <green>2</>
562+
Expected difference: < <green>0.005</>
563+
Received difference: <red>0.005000099999999952</>"
525564
`;
526565

527566
exports[`.toBeDefined(), .toBeUndefined() '"a"' is defined 1`] = `

packages/expect/src/matchers.js

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,51 @@ const matchers: MatchersObject = {
8787
return {actual: received, expected, message, name: 'toBe', pass};
8888
},
8989

90-
toBeCloseTo(actual: number, expected: number, precision?: number = 2) {
90+
toBeCloseTo(received: number, expected: number, precision?: number = 2) {
9191
const secondArgument = arguments.length === 3 ? 'precision' : null;
92-
ensureNumbers(actual, expected, '.toBeCloseTo');
92+
const isNot = this.isNot;
93+
const options = {
94+
isNot,
95+
promise: this.promise,
96+
secondArgument,
97+
};
98+
ensureNumbers(received, expected, '.toBeCloseTo');
9399

94100
let pass = false;
101+
let expectedDiff = 0;
102+
let receivedDiff = 0;
95103

96-
if (actual == Infinity && expected == Infinity) pass = true;
97-
else if (actual == -Infinity && expected == -Infinity) pass = true;
98-
else pass = Math.abs(expected - actual) < Math.pow(10, -precision) / 2;
104+
if (received === Infinity && expected === Infinity) {
105+
pass = true; // Infinity - Infinity is NaN
106+
} else if (received === -Infinity && expected === -Infinity) {
107+
pass = true; // -Infinity - -Infinity is NaN
108+
} else {
109+
expectedDiff = Math.pow(10, -precision) / 2;
110+
receivedDiff = Math.abs(expected - received);
111+
pass = receivedDiff < expectedDiff;
112+
}
99113

100-
const message = () =>
101-
matcherHint('.toBeCloseTo', undefined, undefined, {
102-
isNot: this.isNot,
103-
secondArgument,
104-
}) +
105-
'\n\n' +
106-
`Precision: ${printExpected(precision)}-digit\n` +
107-
`Expected: ${printExpected(expected)}\n` +
108-
`Received: ${printReceived(actual)}`;
114+
const message = pass
115+
? () =>
116+
matcherHint('toBeCloseTo', undefined, undefined, options) +
117+
'\n\n' +
118+
`Expected: not ${printExpected(expected)}\n` +
119+
(receivedDiff === 0
120+
? ''
121+
: `Received: ${printReceived(received)}\n` +
122+
'\n' +
123+
`Expected precision: ${printExpected(precision)}\n` +
124+
`Expected difference: not < ${printExpected(expectedDiff)}\n` +
125+
`Received difference: ${printReceived(receivedDiff)}`)
126+
: () =>
127+
matcherHint('toBeCloseTo', undefined, undefined, options) +
128+
'\n\n' +
129+
`Expected: ${printExpected(expected)}\n` +
130+
`Received: ${printReceived(received)}\n` +
131+
'\n' +
132+
`Expected precision: ${printExpected(precision)}\n` +
133+
`Expected difference: < ${printExpected(expectedDiff)}\n` +
134+
`Received difference: ${printReceived(receivedDiff)}`;
109135

110136
return {message, pass};
111137
},

0 commit comments

Comments
 (0)