From 7482b682d667b41799bd60a522b5ee5f5ca4eaa5 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Mon, 17 Nov 2014 17:39:39 -0800 Subject: [PATCH] fix(test_lib): allow equality tests for `Map` --- modules/test_lib/pubspec.yaml | 2 ++ modules/test_lib/src/test_lib.es6 | 39 ++++++++++++++++++++++++++ modules/test_lib/test/test_lib_spec.js | 38 ++++++++++++++++++++----- 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/modules/test_lib/pubspec.yaml b/modules/test_lib/pubspec.yaml index a8563be001..1ac0af21cc 100644 --- a/modules/test_lib/pubspec.yaml +++ b/modules/test_lib/pubspec.yaml @@ -2,5 +2,7 @@ name: test_lib environment: sdk: '>=1.4.0' dependencies: + facade: + path: ../facade dev_dependencies: guinness: ">=0.1.16 <0.2.0" \ No newline at end of file diff --git a/modules/test_lib/src/test_lib.es6 b/modules/test_lib/src/test_lib.es6 index e3ddd49b21..61319f1d50 100644 --- a/modules/test_lib/src/test_lib.es6 +++ b/modules/test_lib/src/test_lib.es6 @@ -20,6 +20,33 @@ window.print = function(msg) { window.beforeEach(function() { jasmine.addMatchers({ + // Custom handler for Map to give nice error messages in JavaScript + toEqual: function(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + var pass; + if (actual instanceof Map) { + pass = actual.size === expected.size; + if (pass) { + actual.forEach( (v,k) => { + pass = pass && util.equals(v, expected.get(k)); + }); + } + return { + pass: pass, + get message() { + return `Expected ${mapToString(actual)} ${(pass ? 'not' : '')} to equal to ${mapToString(expected)}`; + } + }; + } else { + return { + pass: util.equals(actual, expected) + } + } + } + }; + }, + toBePromise: function() { return { compare: function (actual, expectedClass) { @@ -49,3 +76,15 @@ window.beforeEach(function() { } }); }); + + +function mapToString(m) { + if (!m) { + return ''+m; + } + var res = []; + m.forEach( (v,k) => { + res.push(`${k}:${v}`); + }); + return `{ ${res.join(',')} }`; +} \ No newline at end of file diff --git a/modules/test_lib/test/test_lib_spec.js b/modules/test_lib/test/test_lib_spec.js index 662c561274..ef9870c4d2 100644 --- a/modules/test_lib/test/test_lib_spec.js +++ b/modules/test_lib/test/test_lib_spec.js @@ -1,4 +1,5 @@ -import {describe, it, iit, expect} from 'test_lib/test_lib'; +import {describe, it, iit, ddescribe, expect} from 'test_lib/test_lib'; +import {MapWrapper} from 'facade/collection'; class TestObj { constructor(prop) { @@ -7,12 +8,12 @@ class TestObj { } export function main() { - describe("test_lib", function () { - describe("equality", function () { - it("should structurally compare objects", function () { - var expected = new TestObj(new TestObj({"one" : [1,2]})); - var actual = new TestObj(new TestObj({"one" : [1,2]})); - var falseActual = new TestObj(new TestObj({"one" : [1,3]})); + describe('test_lib', () => { + describe('equality', () => { + it('should structurally compare objects', () => { + var expected = new TestObj(new TestObj({'one' : [1,2]})); + var actual = new TestObj(new TestObj({'one' : [1,2]})); + var falseActual = new TestObj(new TestObj({'one' : [1,3]})); expect(actual).toEqual(expected); expect(falseActual).not.toEqual(expected); @@ -22,5 +23,28 @@ export function main() { expect([{'a':'b'}]).toEqual([{'a':'b'}]); }); }); + + describe('toEqual for Maps', () => { + it('should detect equality for same reference', () => { + var m1 = MapWrapper.createFromStringMap({'a': 1}); + expect(m1).toEqual(m1); + }); + + it('should detect equality for same content', () => { + expect(MapWrapper.createFromStringMap({'a': 1})).toEqual(MapWrapper.createFromStringMap({'a': 1})); + }); + + it('should detect missing entries', () => { + expect(MapWrapper.createFromStringMap({'a': 1})).not.toEqual(MapWrapper.createFromStringMap({})); + }); + + it('should detect different values', () => { + expect(MapWrapper.createFromStringMap({'a': 1})).not.toEqual(MapWrapper.createFromStringMap({'a': 2})); + }); + + it('should detect additional entries', () => { + expect(MapWrapper.createFromStringMap({'a': 1})).not.toEqual(MapWrapper.createFromStringMap({'a': 1, 'b': 1})); + }); + }); }); } \ No newline at end of file