diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index 307f20e0..26ae6ac9 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -132,7 +132,7 @@ jasmineRequire.HtmlReporter = function(j$) { if (result.status === 'failed') { failures.push(failureDom(result)); } - addDeprecationWarnings(result); + addDeprecationWarnings(result, 'suite'); }; this.specStarted = function(result) { @@ -168,7 +168,7 @@ jasmineRequire.HtmlReporter = function(j$) { failures.push(failureDom(result)); } - addDeprecationWarnings(result); + addDeprecationWarnings(result, 'spec'); }; this.displaySpecInCorrectFormat = function(result) { @@ -307,14 +307,27 @@ jasmineRequire.HtmlReporter = function(j$) { addDeprecationWarnings(doneResult); - var warningBarClassName = 'jasmine-bar jasmine-warning'; for (i = 0; i < deprecationWarnings.length; i++) { - var warning = deprecationWarnings[i]; + var context; + + switch (deprecationWarnings[i].runnableType) { + case 'spec': + context = '(in spec: ' + deprecationWarnings[i].runnableName + ')'; + break; + case 'suite': + context = '(in suite: ' + deprecationWarnings[i].runnableName + ')'; + break; + default: + context = ''; + } + alert.appendChild( createDom( 'span', - { className: warningBarClassName }, - 'DEPRECATION: ' + warning + { className: 'jasmine-bar jasmine-warning' }, + 'DEPRECATION: ' + deprecationWarnings[i].message, + createDom('br'), + context ) ); } @@ -625,12 +638,18 @@ jasmineRequire.HtmlReporter = function(j$) { return addToExistingQueryString('spec', els.join(' ')); } - function addDeprecationWarnings(result) { + function addDeprecationWarnings(result, runnableType) { if (result && result.deprecationWarnings) { for (var i = 0; i < result.deprecationWarnings.length; i++) { var warning = result.deprecationWarnings[i].message; + debugger; if (!j$.util.arrayContains(warning)) { - deprecationWarnings.push(warning); + debugger; + deprecationWarnings.push({ + message: warning, + runnableName: result.fullName, + runnableType: runnableType + }); } } } diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 71194eeb..f86e9f55 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -1537,12 +1537,22 @@ getJasmineRequireObj().Env = function(j$) { this.deprecated = function(deprecation) { var runnable = currentRunnable() || topSuite; + var context; + + if (runnable === topSuite) { + context = ''; + } else if (runnable === currentSuite()) { + context = ' (in suite: ' + runnable.getFullName() + ')'; + } else { + context = ' (in spec: ' + runnable.getFullName() + ')'; + } + runnable.addDeprecationWarning(deprecation); if ( typeof console !== 'undefined' && typeof console.error === 'function' ) { - console.error('DEPRECATION:', deprecation); + console.error('DEPRECATION: ' + deprecation + context); } }; @@ -7151,17 +7161,21 @@ getJasmineRequireObj().QueueRunner = function(j$) { if (retval && j$.isFunction_(retval.then)) { // Issue a warning that matches the user's code if (j$.isAsyncFunction_(fn)) { - this.deprecated('An asynchronous before/it/after ' + - 'function was defined with the async keyword but also took a ' + - 'done callback. This is not supported and will stop working in' + - ' the future. Either remove the done callback (recommended) or ' + - 'remove the async keyword.'); + this.deprecated( + 'An asynchronous before/it/after ' + + 'function was defined with the async keyword but also took a ' + + 'done callback. This is not supported and will stop working in' + + ' the future. Either remove the done callback (recommended) or ' + + 'remove the async keyword.' + ); } else { - this.deprecated('An asynchronous before/it/after ' + - 'function took a done callback but also returned a promise. ' + - 'This is not supported and will stop working in the future. ' + - 'Either remove the done callback (recommended) or change the ' + - 'function to not return a promise.'); + this.deprecated( + 'An asynchronous before/it/after ' + + 'function took a done callback but also returned a promise. ' + + 'This is not supported and will stop working in the future. ' + + 'Either remove the done callback (recommended) or change the ' + + 'function to not return a promise.' + ); } } }; diff --git a/spec/core/QueueRunnerSpec.js b/spec/core/QueueRunnerSpec.js index c722aaff..7333b02a 100644 --- a/spec/core/QueueRunnerSpec.js +++ b/spec/core/QueueRunnerSpec.js @@ -528,11 +528,12 @@ describe('QueueRunner', function() { queueRunner.execute(); - expect(deprecated).toHaveBeenCalledWith('An asynchronous ' + - 'before/it/after function took a done callback but also returned a '+ - 'promise. This is not supported and will stop working in the future. ' + - 'Either remove the done callback (recommended) or change the function ' + - 'to not return a promise.' + expect(deprecated).toHaveBeenCalledWith( + 'An asynchronous ' + + 'before/it/after function took a done callback but also returned a ' + + 'promise. This is not supported and will stop working in the future. ' + + 'Either remove the done callback (recommended) or change the function ' + + 'to not return a promise.' ); }); @@ -541,17 +542,18 @@ describe('QueueRunner', function() { eval('var fn = async function(done){};'); var deprecated = jasmine.createSpy('deprecated'), queueRunner = new jasmineUnderTest.QueueRunner({ - queueableFns: [{fn: fn}], + queueableFns: [{ fn: fn }], deprecated: deprecated }); queueRunner.execute(); - expect(deprecated).toHaveBeenCalledWith('An asynchronous ' + - 'before/it/after function was defined with the async keyword but ' + - 'also took a done callback. This is not supported and will stop ' + - 'working in the future. Either remove the done callback ' + - '(recommended) or remove the async keyword.' + expect(deprecated).toHaveBeenCalledWith( + 'An asynchronous ' + + 'before/it/after function was defined with the async keyword but ' + + 'also took a done callback. This is not supported and will stop ' + + 'working in the future. Either remove the done callback ' + + '(recommended) or remove the async keyword.' ); }); }); diff --git a/spec/core/integration/EnvSpec.js b/spec/core/integration/EnvSpec.js index b51a7297..a11897b3 100644 --- a/spec/core/integration/EnvSpec.js +++ b/spec/core/integration/EnvSpec.js @@ -2294,7 +2294,7 @@ describe("Env integration", function() { it('should report deprecation warnings on the correct specs and suites', function(done) { var reporter = jasmine.createSpyObj('reporter', ['jasmineDone', 'suiteDone', 'specDone']); - // prevent deprecation from being displayed + // prevent deprecation from being displayed, as well as letting us observe calls spyOn(console, "error"); env.addReporter(reporter); @@ -2316,6 +2316,7 @@ describe("Env integration", function() { expect(result.deprecationWarnings).toEqual([ jasmine.objectContaining({ message: 'top level deprecation' }) ]); + expect(console.error).toHaveBeenCalledWith('DEPRECATION: top level deprecation'); expect(reporter.suiteDone).toHaveBeenCalledWith(jasmine.objectContaining({ fullName: 'suite', @@ -2323,6 +2324,7 @@ describe("Env integration", function() { jasmine.objectContaining({ message: 'suite level deprecation' }) ] })); + expect(console.error).toHaveBeenCalledWith('DEPRECATION: suite level deprecation (in suite: suite)'); expect(reporter.specDone).toHaveBeenCalledWith(jasmine.objectContaining({ fullName: 'suite spec', @@ -2330,6 +2332,7 @@ describe("Env integration", function() { jasmine.objectContaining({ message: 'spec level deprecation' }) ] })); + expect(console.error).toHaveBeenCalledWith('DEPRECATION: spec level deprecation (in spec: suite spec)'); done(); }); diff --git a/spec/html/HtmlReporterSpec.js b/spec/html/HtmlReporterSpec.js index 3b4f20e5..c41b68bb 100644 --- a/spec/html/HtmlReporterSpec.js +++ b/spec/html/HtmlReporterSpec.js @@ -270,12 +270,14 @@ describe('HtmlReporter', function() { reporter.jasmineStarted({}); reporter.specDone({ status: 'passed', + fullName: 'a spec with a deprecation', deprecationWarnings: [{ message: 'spec deprecation' }], failedExpectations: [], passedExpectations: [] }); reporter.suiteDone({ status: 'passed', + fullName: 'a suite with a deprecation', deprecationWarnings: [{ message: 'suite deprecation' }], failedExpectations: [] }); @@ -287,12 +289,17 @@ describe('HtmlReporter', function() { var alertBars = container.querySelectorAll('.jasmine-alert .jasmine-bar'); expect(alertBars.length).toEqual(4); - expect(alertBars[1].innerHTML).toMatch(/spec deprecation/); + expect(alertBars[1].innerHTML).toMatch( + /spec deprecation.*\(in spec: a spec with a deprecation\)/ + ); expect(alertBars[1].getAttribute('class')).toEqual( 'jasmine-bar jasmine-warning' ); - expect(alertBars[2].innerHTML).toMatch(/suite deprecation/); + expect(alertBars[2].innerHTML).toMatch( + /suite deprecation.*\(in suite: a suite with a deprecation\)/ + ); expect(alertBars[3].innerHTML).toMatch(/global deprecation/); + expect(alertBars[3].innerHTML).not.toMatch(/in /); }); }); diff --git a/src/core/Env.js b/src/core/Env.js index 7e299717..a70413b8 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -581,12 +581,22 @@ getJasmineRequireObj().Env = function(j$) { this.deprecated = function(deprecation) { var runnable = currentRunnable() || topSuite; + var context; + + if (runnable === topSuite) { + context = ''; + } else if (runnable === currentSuite()) { + context = ' (in suite: ' + runnable.getFullName() + ')'; + } else { + context = ' (in spec: ' + runnable.getFullName() + ')'; + } + runnable.addDeprecationWarning(deprecation); if ( typeof console !== 'undefined' && typeof console.error === 'function' ) { - console.error('DEPRECATION:', deprecation); + console.error('DEPRECATION: ' + deprecation + context); } }; diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index f009c3b5..be9e7f62 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -218,17 +218,21 @@ getJasmineRequireObj().QueueRunner = function(j$) { if (retval && j$.isFunction_(retval.then)) { // Issue a warning that matches the user's code if (j$.isAsyncFunction_(fn)) { - this.deprecated('An asynchronous before/it/after ' + - 'function was defined with the async keyword but also took a ' + - 'done callback. This is not supported and will stop working in' + - ' the future. Either remove the done callback (recommended) or ' + - 'remove the async keyword.'); + this.deprecated( + 'An asynchronous before/it/after ' + + 'function was defined with the async keyword but also took a ' + + 'done callback. This is not supported and will stop working in' + + ' the future. Either remove the done callback (recommended) or ' + + 'remove the async keyword.' + ); } else { - this.deprecated('An asynchronous before/it/after ' + - 'function took a done callback but also returned a promise. ' + - 'This is not supported and will stop working in the future. ' + - 'Either remove the done callback (recommended) or change the ' + - 'function to not return a promise.'); + this.deprecated( + 'An asynchronous before/it/after ' + + 'function took a done callback but also returned a promise. ' + + 'This is not supported and will stop working in the future. ' + + 'Either remove the done callback (recommended) or change the ' + + 'function to not return a promise.' + ); } } }; diff --git a/src/html/HtmlReporter.js b/src/html/HtmlReporter.js index 24d3a404..7cb2227e 100644 --- a/src/html/HtmlReporter.js +++ b/src/html/HtmlReporter.js @@ -101,7 +101,7 @@ jasmineRequire.HtmlReporter = function(j$) { if (result.status === 'failed') { failures.push(failureDom(result)); } - addDeprecationWarnings(result); + addDeprecationWarnings(result, 'suite'); }; this.specStarted = function(result) { @@ -137,7 +137,7 @@ jasmineRequire.HtmlReporter = function(j$) { failures.push(failureDom(result)); } - addDeprecationWarnings(result); + addDeprecationWarnings(result, 'spec'); }; this.displaySpecInCorrectFormat = function(result) { @@ -276,14 +276,27 @@ jasmineRequire.HtmlReporter = function(j$) { addDeprecationWarnings(doneResult); - var warningBarClassName = 'jasmine-bar jasmine-warning'; for (i = 0; i < deprecationWarnings.length; i++) { - var warning = deprecationWarnings[i]; + var context; + + switch (deprecationWarnings[i].runnableType) { + case 'spec': + context = '(in spec: ' + deprecationWarnings[i].runnableName + ')'; + break; + case 'suite': + context = '(in suite: ' + deprecationWarnings[i].runnableName + ')'; + break; + default: + context = ''; + } + alert.appendChild( createDom( 'span', - { className: warningBarClassName }, - 'DEPRECATION: ' + warning + { className: 'jasmine-bar jasmine-warning' }, + 'DEPRECATION: ' + deprecationWarnings[i].message, + createDom('br'), + context ) ); } @@ -594,12 +607,18 @@ jasmineRequire.HtmlReporter = function(j$) { return addToExistingQueryString('spec', els.join(' ')); } - function addDeprecationWarnings(result) { + function addDeprecationWarnings(result, runnableType) { if (result && result.deprecationWarnings) { for (var i = 0; i < result.deprecationWarnings.length; i++) { var warning = result.deprecationWarnings[i].message; + debugger; if (!j$.util.arrayContains(warning)) { - deprecationWarnings.push(warning); + debugger; + deprecationWarnings.push({ + message: warning, + runnableName: result.fullName, + runnableType: runnableType + }); } } }