From 09222280249c6d76658c911740d8397a01029dba Mon Sep 17 00:00:00 2001 From: Kevin Villela Date: Sun, 25 Mar 2018 12:11:49 -0700 Subject: [PATCH] fix(core): use addCustomEqualityTester instead of overriding toEqual (#22983) This propagates other custom equality testers added by users. Additionally, if an Angular project is using jasmine 2.6+, it will allow Jasmine's custom object differ to print out pretty test error messages. fixes #22939 PR Close #22983 --- packages/core/test/testing_internal_spec.ts | 12 ++++++ .../platform-browser/testing/src/matchers.ts | 38 ++++++++----------- packages/types.d.ts | 9 +++++ 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/packages/core/test/testing_internal_spec.ts b/packages/core/test/testing_internal_spec.ts index 03320aa72f..9de173b199 100644 --- a/packages/core/test/testing_internal_spec.ts +++ b/packages/core/test/testing_internal_spec.ts @@ -21,6 +21,18 @@ class SpyTestObj extends SpyObject { { describe('testing', () => { + describe('should respect custom equality tester', () => { + beforeEach(() => { + const equalIfMarried = + (first: any, second: any) => { return first === 'kevin' && second === 'patricia'; }; + jasmine.addCustomEqualityTester(equalIfMarried); + }); + + it('for positive test', () => { expect('kevin').toEqual('patricia'); }); + + it('for negative test', () => { expect('kevin').not.toEqual('kevin'); }); + }); + describe('equality', () => { it('should structurally compare objects', () => { const expected = new TestObj(new TestObj({'one': [1, 2]})); diff --git a/packages/platform-browser/testing/src/matchers.ts b/packages/platform-browser/testing/src/matchers.ts index 01417f570b..45c51c53e4 100644 --- a/packages/platform-browser/testing/src/matchers.ts +++ b/packages/platform-browser/testing/src/matchers.ts @@ -112,29 +112,23 @@ export const expect: (actual: any) => NgMatchers = _global.expect; }; _global.beforeEach(function() { - jasmine.addMatchers({ - // Custom handler for Map as Jasmine does not support it yet - toEqual: function(util) { - return { - compare: function(actual: any, expected: any) { - return {pass: util.equals(actual, expected, [compareMap])}; - } - }; - - function compareMap(actual: any, expected: any): boolean { - if (actual instanceof Map) { - let pass = actual.size === expected.size; - if (pass) { - actual.forEach((v: any, k: any) => { pass = pass && util.equals(v, expected.get(k)); }); - } - return pass; - } else { - // TODO(misko): we should change the return, but jasmine.d.ts is not null safe - return undefined !; - } + // Custom handler for Map as we use Jasmine 2.4, and support for maps is not + // added until Jasmine 2.6. + jasmine.addCustomEqualityTester(function compareMap(actual: any, expected: any): boolean { + if (actual instanceof Map) { + let pass = actual.size === expected.size; + if (pass) { + actual.forEach((v: any, k: any) => { + pass = pass && jasmine.matchersUtil.equals(v, expected.get(k)); + }); } - }, - + return pass; + } else { + // TODO(misko): we should change the return, but jasmine.d.ts is not null safe + return undefined !; + } + }); + jasmine.addMatchers({ toBePromise: function() { return { compare: function(actual: any) { diff --git a/packages/types.d.ts b/packages/types.d.ts index ad0b87d802..96996ea8e0 100644 --- a/packages/types.d.ts +++ b/packages/types.d.ts @@ -25,3 +25,12 @@ declare namespace jasmine { toHaveProperties(obj: any): boolean; } } + +/** +*Jasmine matching utilities. These are added in the a more recent version of +*the Jasmine typedefs than what we are using: +*https://github.com/DefinitelyTyped/DefinitelyTyped/pull/20771 +*/ +declare namespace jasmine { + const matchersUtil: MatchersUtil; +}