diff --git a/spec/core/ClockSpec.js b/spec/core/ClockSpec.js index ba5218d9..ad47f823 100644 --- a/spec/core/ClockSpec.js +++ b/spec/core/ClockSpec.js @@ -242,7 +242,7 @@ describe('Clock', function() { expect(fakeGlobal.clearInterval).toBe(replacedClearInterval); }); - it('replaces the global timer functions on uninstall', function() { + it('restores the global timer functions on uninstall', function() { const fakeSetTimeout = jasmine.createSpy('global setTimeout'), fakeClearTimeout = jasmine.createSpy('global clearTimeout'), fakeSetInterval = jasmine.createSpy('global setInterval'), @@ -408,211 +408,219 @@ describe('Clock', function() { expect(delayedFunctionScheduler.scheduleFunction).not.toHaveBeenCalled(); }); - it('schedules the delayed function (via setTimeout) with the fake timer', function() { - const fakeSetTimeout = jasmine.createSpy('setTimeout'), - scheduleFunction = jasmine.createSpy('scheduleFunction'), - delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, - fakeGlobal = { setTimeout: fakeSetTimeout }, - delayedFn = jasmine.createSpy('delayedFn'), - mockDate = { - install: function() {}, - tick: function() {}, - uninstall: function() {} - }, - clock = new jasmineUnderTest.Clock( - fakeGlobal, - function() { - return delayedFunctionScheduler; + describe('setTimeout', function() { + it('schedules the delayed function with the fake timer', function() { + const fakeSetTimeout = jasmine.createSpy('setTimeout'), + scheduleFunction = jasmine.createSpy('scheduleFunction'), + delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, + fakeGlobal = { setTimeout: fakeSetTimeout }, + delayedFn = jasmine.createSpy('delayedFn'), + mockDate = { + install: function() {}, + tick: function() {}, + uninstall: function() {} }, - mockDate - ), - timeout = new clock.FakeTimeout(); + clock = new jasmineUnderTest.Clock( + fakeGlobal, + function() { + return delayedFunctionScheduler; + }, + mockDate + ), + timeout = new clock.FakeTimeout(); - clock.install(); - clock.setTimeout(delayedFn, 0, 'a', 'b'); + clock.install(); + clock.setTimeout(delayedFn, 0, 'a', 'b'); - expect(fakeSetTimeout).not.toHaveBeenCalled(); + expect(fakeSetTimeout).not.toHaveBeenCalled(); - if (!NODE_JS) { - expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( - delayedFn, - 0, - ['a', 'b'] - ); - } else { - expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( - delayedFn, - 0, - ['a', 'b'], - false, - timeout - ); - } + if (!NODE_JS) { + expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( + delayedFn, + 0, + ['a', 'b'] + ); + } else { + expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( + delayedFn, + 0, + ['a', 'b'], + false, + timeout + ); + } + }); + + it('returns an id for the delayed function', function() { + const fakeSetTimeout = jasmine.createSpy('setTimeout'), + scheduleId = 123, + scheduleFunction = jasmine + .createSpy('scheduleFunction') + .and.returnValue(scheduleId), + delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, + fakeGlobal = { setTimeout: fakeSetTimeout }, + delayedFn = jasmine.createSpy('delayedFn'), + mockDate = { + install: function() {}, + tick: function() {}, + uninstall: function() {} + }, + clock = new jasmineUnderTest.Clock( + fakeGlobal, + function() { + return delayedFunctionScheduler; + }, + mockDate + ); + + clock.install(); + const timeout = clock.setTimeout(delayedFn, 0); + + if (!NODE_JS) { + expect(timeout).toEqual(123); + } else { + expect(timeout.constructor.name).toEqual('FakeTimeout'); + } + }); }); - it('returns an id for the delayed function', function() { - const fakeSetTimeout = jasmine.createSpy('setTimeout'), - scheduleId = 123, - scheduleFunction = jasmine - .createSpy('scheduleFunction') - .and.returnValue(scheduleId), - delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, - fakeGlobal = { setTimeout: fakeSetTimeout }, - delayedFn = jasmine.createSpy('delayedFn'), - mockDate = { - install: function() {}, - tick: function() {}, - uninstall: function() {} - }, - clock = new jasmineUnderTest.Clock( - fakeGlobal, - function() { - return delayedFunctionScheduler; + describe('clearTimeout', function() { + it('clears the scheduled function with the scheduler', function() { + const fakeClearTimeout = jasmine.createSpy('clearTimeout'), + delayedFunctionScheduler = jasmine.createSpyObj( + 'delayedFunctionScheduler', + ['removeFunctionWithId'] + ), + fakeGlobal = { setTimeout: fakeClearTimeout }, + mockDate = { + install: function() {}, + tick: function() {}, + uninstall: function() {} }, - mockDate - ); + clock = new jasmineUnderTest.Clock( + fakeGlobal, + function() { + return delayedFunctionScheduler; + }, + mockDate + ); - clock.install(); - const timeout = clock.setTimeout(delayedFn, 0); + clock.install(); + clock.clearTimeout(123); - if (!NODE_JS) { - expect(timeout).toEqual(123); - } else { - expect(timeout.constructor.name).toEqual('FakeTimeout'); - } + expect(fakeClearTimeout).not.toHaveBeenCalled(); + expect( + delayedFunctionScheduler.removeFunctionWithId + ).toHaveBeenCalledWith(123); + }); }); - it('clears the scheduled function with the scheduler', function() { - const fakeClearTimeout = jasmine.createSpy('clearTimeout'), - delayedFunctionScheduler = jasmine.createSpyObj( - 'delayedFunctionScheduler', - ['removeFunctionWithId'] - ), - fakeGlobal = { setTimeout: fakeClearTimeout }, - mockDate = { - install: function() {}, - tick: function() {}, - uninstall: function() {} - }, - clock = new jasmineUnderTest.Clock( - fakeGlobal, - function() { - return delayedFunctionScheduler; + describe('setInterval', function() { + it('schedules the delayed function with the fake timer', function() { + const fakeSetInterval = jasmine.createSpy('setInterval'), + scheduleFunction = jasmine.createSpy('scheduleFunction'), + delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, + fakeGlobal = { setInterval: fakeSetInterval }, + delayedFn = jasmine.createSpy('delayedFn'), + mockDate = { + install: function() {}, + tick: function() {}, + uninstall: function() {} }, - mockDate - ); + clock = new jasmineUnderTest.Clock( + fakeGlobal, + function() { + return delayedFunctionScheduler; + }, + mockDate + ), + timeout = new clock.FakeTimeout(); - clock.install(); - clock.clearTimeout(123); + clock.install(); + clock.setInterval(delayedFn, 0, 'a', 'b'); - expect(fakeClearTimeout).not.toHaveBeenCalled(); - expect(delayedFunctionScheduler.removeFunctionWithId).toHaveBeenCalledWith( - 123 - ); + expect(fakeSetInterval).not.toHaveBeenCalled(); + + if (!NODE_JS) { + expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( + delayedFn, + 0, + ['a', 'b'], + true + ); + } else { + expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( + delayedFn, + 0, + ['a', 'b'], + true, + timeout + ); + } + }); + + it('returns an id for the delayed function', function() { + const fakeSetInterval = jasmine.createSpy('setInterval'), + scheduleId = 123, + scheduleFunction = jasmine + .createSpy('scheduleFunction') + .and.returnValue(scheduleId), + delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, + fakeGlobal = { setInterval: fakeSetInterval }, + delayedFn = jasmine.createSpy('delayedFn'), + mockDate = { + install: function() {}, + tick: function() {}, + uninstall: function() {} + }, + clock = new jasmineUnderTest.Clock( + fakeGlobal, + function() { + return delayedFunctionScheduler; + }, + mockDate + ); + + clock.install(); + const interval = clock.setInterval(delayedFn, 0); + + if (!NODE_JS) { + expect(interval).toEqual(123); + } else { + expect(interval.constructor.name).toEqual('FakeTimeout'); + } + }); }); - it('schedules the delayed function with the fake timer', function() { - const fakeSetInterval = jasmine.createSpy('setInterval'), - scheduleFunction = jasmine.createSpy('scheduleFunction'), - delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, - fakeGlobal = { setInterval: fakeSetInterval }, - delayedFn = jasmine.createSpy('delayedFn'), - mockDate = { - install: function() {}, - tick: function() {}, - uninstall: function() {} - }, - clock = new jasmineUnderTest.Clock( - fakeGlobal, - function() { - return delayedFunctionScheduler; + describe('clearInterval', function() { + it('clears the scheduled function with the scheduler', function() { + const clearInterval = jasmine.createSpy('clearInterval'), + delayedFunctionScheduler = jasmine.createSpyObj( + 'delayedFunctionScheduler', + ['removeFunctionWithId'] + ), + fakeGlobal = { setInterval: clearInterval }, + mockDate = { + install: function() {}, + tick: function() {}, + uninstall: function() {} }, - mockDate - ), - timeout = new clock.FakeTimeout(); + clock = new jasmineUnderTest.Clock( + fakeGlobal, + function() { + return delayedFunctionScheduler; + }, + mockDate + ); - clock.install(); - clock.setInterval(delayedFn, 0, 'a', 'b'); + clock.install(); + clock.clearInterval(123); - expect(fakeSetInterval).not.toHaveBeenCalled(); - - if (!NODE_JS) { - expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( - delayedFn, - 0, - ['a', 'b'], - true - ); - } else { - expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith( - delayedFn, - 0, - ['a', 'b'], - true, - timeout - ); - } - }); - - it('returns an id for the delayed function', function() { - const fakeSetInterval = jasmine.createSpy('setInterval'), - scheduleId = 123, - scheduleFunction = jasmine - .createSpy('scheduleFunction') - .and.returnValue(scheduleId), - delayedFunctionScheduler = { scheduleFunction: scheduleFunction }, - fakeGlobal = { setInterval: fakeSetInterval }, - delayedFn = jasmine.createSpy('delayedFn'), - mockDate = { - install: function() {}, - tick: function() {}, - uninstall: function() {} - }, - clock = new jasmineUnderTest.Clock( - fakeGlobal, - function() { - return delayedFunctionScheduler; - }, - mockDate - ); - - clock.install(); - const interval = clock.setInterval(delayedFn, 0); - - if (!NODE_JS) { - expect(interval).toEqual(123); - } else { - expect(interval.constructor.name).toEqual('FakeTimeout'); - } - }); - - it('clears the scheduled function with the scheduler', function() { - const clearInterval = jasmine.createSpy('clearInterval'), - delayedFunctionScheduler = jasmine.createSpyObj( - 'delayedFunctionScheduler', - ['removeFunctionWithId'] - ), - fakeGlobal = { setInterval: clearInterval }, - mockDate = { - install: function() {}, - tick: function() {}, - uninstall: function() {} - }, - clock = new jasmineUnderTest.Clock( - fakeGlobal, - function() { - return delayedFunctionScheduler; - }, - mockDate - ); - - clock.install(); - clock.clearInterval(123); - - expect(clearInterval).not.toHaveBeenCalled(); - expect(delayedFunctionScheduler.removeFunctionWithId).toHaveBeenCalledWith( - 123 - ); + expect(clearInterval).not.toHaveBeenCalled(); + expect( + delayedFunctionScheduler.removeFunctionWithId + ).toHaveBeenCalledWith(123); + }); }); it('gives you a friendly reminder if the Clock is not installed and you tick', function() { diff --git a/spec/core/integration/MatchersSpec.js b/spec/core/integration/MatchersSpec.js index 55a9df66..323114bd 100755 --- a/spec/core/integration/MatchersSpec.js +++ b/spec/core/integration/MatchersSpec.js @@ -470,20 +470,28 @@ describe('Matchers (Integration)', function() { }); describe('toBeNullish', function() { - verifyPasses(function(env) { - env.expect(undefined).toBeNullish(); + describe('with undefined', function() { + verifyPasses(function(env) { + env.expect(undefined).toBeNullish(); + }); }); - verifyPasses(function(env) { - env.expect(null).toBeNullish(); + describe('with null', function() { + verifyPasses(function(env) { + env.expect(null).toBeNullish(); + }); }); - verifyFails(function(env) { - env.expect(1).toBeNullish(); + describe('with a truthy value', function() { + verifyFails(function(env) { + env.expect(1).toBeNullish(); + }); }); - verifyFails(function(env) { - env.expect('').toBeNullish(); + describe('with a non-null falsy value', function() { + verifyFails(function(env) { + env.expect('').toBeNullish(); + }); }); }); @@ -665,13 +673,17 @@ describe('Matchers (Integration)', function() { env.expect(spyObj).toHaveSpyInteractions(); }); - verifyFails(function(env) { - env.expect(spyObj).toHaveSpyInteractions(); + describe('with no methods called', function() { + verifyFails(function(env) { + env.expect(spyObj).toHaveSpyInteractions(); + }); }); - verifyFails(function(env) { - spyObj.otherMethod(); - env.expect(spyObj).toHaveSpyInteractions(); + describe('with only non-spy methods called', function() { + verifyFails(function(env) { + spyObj.otherMethod(); + env.expect(spyObj).toHaveSpyInteractions(); + }); }); }); diff --git a/spec/core/matchers/toThrowErrorSpec.js b/spec/core/matchers/toThrowErrorSpec.js index 3e7e528c..c74c020d 100644 --- a/spec/core/matchers/toThrowErrorSpec.js +++ b/spec/core/matchers/toThrowErrorSpec.js @@ -281,22 +281,44 @@ describe('toThrowError', function() { ); }); - it('fails if thrown is a type of Error and the expected is a different Error', function() { - const matchersUtil = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false), - pp: jasmineUnderTest.makePrettyPrinter() - }, - matcher = jasmineUnderTest.matchers.toThrowError(matchersUtil), - fn = function() { - throw new TypeError('foo'); - }; + describe('with a string', function() { + it('fails if thrown is a type of Error and the expected is a different Error', function() { + const matchersUtil = { + equals: jasmine.createSpy('delegated-equal').and.returnValue(false), + pp: jasmineUnderTest.makePrettyPrinter() + }, + matcher = jasmineUnderTest.matchers.toThrowError(matchersUtil), + fn = function() { + throw new TypeError('foo'); + }; - const result = matcher.compare(fn, TypeError, 'bar'); + const result = matcher.compare(fn, TypeError, 'bar'); - expect(result.pass).toBe(false); - expect(result.message()).toEqual( - "Expected function to throw TypeError with message 'bar', but it threw TypeError with message 'foo'." - ); + expect(result.pass).toBe(false); + expect(result.message()).toEqual( + "Expected function to throw TypeError with message 'bar', but it threw TypeError with message 'foo'." + ); + }); + }); + + describe('with a regex', function() { + it('fails if thrown is a type of Error and the expected is a different Error', function() { + const matchersUtil = { + equals: jasmine.createSpy('delegated-equal').and.returnValue(false), + pp: jasmineUnderTest.makePrettyPrinter() + }, + matcher = jasmineUnderTest.matchers.toThrowError(matchersUtil), + fn = function() { + throw new TypeError('foo'); + }; + + const result = matcher.compare(fn, TypeError, /bar/); + + expect(result.pass).toBe(false); + expect(result.message()).toEqual( + "Expected function to throw TypeError with a message matching /bar/, but it threw TypeError with message 'foo'." + ); + }); }); it('passes if thrown is a type of Error and has the same type as the expected Error and the message matches the expected message', function() { @@ -316,22 +338,4 @@ describe('toThrowError', function() { 'Expected function not to throw TypeError with a message matching /foo/.' ); }); - - it('fails if thrown is a type of Error and the expected is a different Error', function() { - const matchersUtil = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false), - pp: jasmineUnderTest.makePrettyPrinter() - }, - matcher = jasmineUnderTest.matchers.toThrowError(matchersUtil), - fn = function() { - throw new TypeError('foo'); - }; - - const result = matcher.compare(fn, TypeError, /bar/); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual( - "Expected function to throw TypeError with a message matching /bar/, but it threw TypeError with message 'foo'." - ); - }); }); diff --git a/spec/support/jasmine-browser.js b/spec/support/jasmine-browser.js index 588f4cd9..dd24f3eb 100644 --- a/spec/support/jasmine-browser.js +++ b/spec/support/jasmine-browser.js @@ -26,6 +26,9 @@ module.exports = { 'helpers/defineJasmineUnderTest.js', 'helpers/resetEnv.js' ], + env: { + forbidDuplicateNames: true + }, random: true, browser: { name: process.env.JASMINE_BROWSER || 'firefox', diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json index 89240a27..a2018b66 100644 --- a/spec/support/jasmine.json +++ b/spec/support/jasmine.json @@ -12,5 +12,8 @@ "helpers/nodeDefineJasmineUnderTest.js", "helpers/resetEnv.js" ], + "env": { + "forbidDuplicateNames": true + }, "random": true }