Skip to content

Commit

Permalink
Remove jasmine.CATCH_EXCEPTIONS
Browse files Browse the repository at this point in the history
- HTMLReporters should be rewritten to make this sort of thing easier.
- Fix HTMLReporter try/catch switch
- We can't really call resultCallback & throw, so that's been reverted
  for now.
  • Loading branch information
ragaskar committed Dec 8, 2012
1 parent 98c99c4 commit 4355249
Show file tree
Hide file tree
Showing 15 changed files with 78 additions and 84 deletions.
2 changes: 1 addition & 1 deletion lib/jasmine-core/boot/boot.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
jasmine.util.extend(window, jasmineInterface);
}

var htmlReporter = new jasmine.HtmlReporter(null, jasmine);
var htmlReporter = new jasmine.HtmlReporter(null, jasmine, env);

env.addReporter(jasmineInterface.jsApiReporter);
env.addReporter(htmlReporter);
Expand Down
38 changes: 22 additions & 16 deletions lib/jasmine-core/jasmine-html.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {

if (parent) {
if (typeof this.views.suites[parent.id] == 'undefined') {
this.views.suites[parent.id] = new this.jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views, this.jasmine);
this.views.suites[parent.id] = new this.jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views, this.jasmine, this.catchExceptions);
}
parentDiv = this.views.suites[parent.id].element;
}
Expand All @@ -62,11 +62,13 @@ jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
}
};

jasmine.HtmlReporter = function(_doc, jasmine, yieldForRender) {
jasmine.HtmlReporter = function(_doc, jasmine, env, options) {
options = options || {};
var self = this;
this.jasmine = jasmine || window.jasmine;
var doc = _doc || window.document;


var reporterView;

var dom = {};
Expand All @@ -84,7 +86,7 @@ jasmine.HtmlReporter = function(_doc, jasmine, yieldForRender) {
doc.body.appendChild(dom.reporter);
setExceptionHandling();

reporterView = new self.jasmine.HtmlReporter.ReporterView(dom, self.jasmine);
reporterView = new self.jasmine.HtmlReporter.ReporterView(dom, self.jasmine, env.catchingExceptions());
reporterView.addSpecs(specs, self.specFilter);
};

Expand All @@ -101,7 +103,7 @@ jasmine.HtmlReporter = function(_doc, jasmine, yieldForRender) {

var lastYieldForRender = 0;
var refreshInterval = 250;
yieldForRender = yieldForRender || function(fn) {
var yieldForRender = options.yieldForRender || function(fn) {
var now = Date.now();
var delta = (now - lastYieldForRender);
if (delta > refreshInterval) {
Expand Down Expand Up @@ -180,7 +182,7 @@ jasmine.HtmlReporter = function(_doc, jasmine, yieldForRender) {
}

function searchWithCatch() {
var params = jasmine.HtmlReporter.parameters(window.document);
var params = self.jasmine.HtmlReporter.parameters(window.document);
var removed = false;
var i = 0;

Expand All @@ -191,7 +193,7 @@ jasmine.HtmlReporter = function(_doc, jasmine, yieldForRender) {
}
i++;
}
if (self.jasmine.CATCH_EXCEPTIONS) {
if (env.catchingExceptions()) {
params.push("catch=false");
}

Expand All @@ -203,7 +205,7 @@ jasmine.HtmlReporter = function(_doc, jasmine, yieldForRender) {

if (noTryCatch()) {
chxCatch.setAttribute('checked', true);
self.jasmine.CATCH_EXCEPTIONS = false;
env.catchExceptions(false);
}
chxCatch.onclick = function() {
window.location.search = searchWithCatch();
Expand Down Expand Up @@ -236,7 +238,7 @@ jasmine.HtmlReporter.sectionLink = function(sectionName, catchExceptions) {
return link;
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);
jasmine.HtmlReporter.ReporterView = function(dom, jasmine) {
jasmine.HtmlReporter.ReporterView = function(dom, jasmine, catchExceptions) {
this.startedAt = new Date();
this.runningSpecCount = 0;
this.completeSpecCount = 0;
Expand Down Expand Up @@ -270,7 +272,7 @@ jasmine.HtmlReporter.ReporterView = function(dom, jasmine) {

for (var i = 0; i < specs.length; i++) {
var spec = specs[i];
this.views.specs[spec.id] = new this.jasmine.HtmlReporter.SpecView(spec, dom, this.views, this.jasmine);
this.views.specs[spec.id] = new this.jasmine.HtmlReporter.SpecView(spec, dom, this.views, this.jasmine, catchExceptions);
if (specFilter(spec)) {
this.runningSpecCount++;
}
Expand Down Expand Up @@ -320,14 +322,14 @@ jasmine.HtmlReporter.ReporterView = function(dom, jasmine) {

// currently running UI
if (isUndefined(this.runningAlert)) {
this.runningAlert = this.createDom('a', { href: this.jasmine.HtmlReporter.sectionLink(null, this.jasmine.CATCH_EXCEPTIONS), className: "runningAlert bar" });
this.runningAlert = this.createDom('a', { href: this.jasmine.HtmlReporter.sectionLink(null, catchExceptions), className: "runningAlert bar" });
dom.alert.appendChild(this.runningAlert);
}
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);

// skipped specs UI
if (isUndefined(this.skippedAlert)) {
this.skippedAlert = this.createDom('a', { href: this.jasmine.HtmlReporter.sectionLink(null, this.jasmine.CATCH_EXCEPTIONS), className: "skippedAlert bar" });
this.skippedAlert = this.createDom('a', { href: this.jasmine.HtmlReporter.sectionLink(null, catchExceptions), className: "skippedAlert bar" });
}

this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
Expand All @@ -338,7 +340,7 @@ jasmine.HtmlReporter.ReporterView = function(dom, jasmine) {

// passing specs UI
if (isUndefined(this.passedAlert)) {
this.passedAlert = this.createDom('span', { href: this.jasmine.HtmlReporter.sectionLink(null, this.jasmine.CATCH_EXCEPTIONS), className: "passingAlert bar" });
this.passedAlert = this.createDom('span', { href: this.jasmine.HtmlReporter.sectionLink(null, catchExceptions), className: "passingAlert bar" });
}
this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);

Expand Down Expand Up @@ -401,19 +403,22 @@ jasmine.HtmlReporter.ReporterView = function(dom, jasmine) {
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);


jasmine.HtmlReporter.SpecView = function(spec, dom, views, jasmine) {
jasmine.HtmlReporter.SpecView = function(spec, dom, views, jasmine, catchExceptions) {
this.spec = spec;
this.dom = dom;
this.views = views;
this.jasmine = jasmine || {};
this.catchExceptions = catchExceptions;

this.symbol = this.createDom('li', { className: 'pending' });
this.dom.symbolSummary.appendChild(this.symbol);

this.summary = this.createDom('div', { className: 'specSummary' },
this.createDom('a', {
className: 'description',
href: this.jasmine.HtmlReporter.sectionLink(this.spec.getFullName(), this.jasmine.CATCH_EXCEPTIONS),
//TODO: sectionLink is a dependency passed in that knows about catchingExceptions
//so we don't pass catchExceptions everywhere.
href: this.jasmine.HtmlReporter.sectionLink(this.spec.getFullName(), catchExceptions),
title: this.spec.getFullName()
}, this.spec.description)
);
Expand Down Expand Up @@ -480,14 +485,15 @@ jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
};

jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);
jasmine.HtmlReporter.SuiteView = function(suite, dom, views, jasmine) {
jasmine.HtmlReporter.SuiteView = function(suite, dom, views, jasmine, catchExceptions) {
this.suite = suite;
this.dom = dom;
this.views = views;
this.jasmine = jasmine || {};
this.catchExceptions = catchExceptions;

this.element = this.createDom('div', { className: 'suite' },
this.createDom('a', { className: 'description', href: this.jasmine.HtmlReporter.sectionLink(this.suite.getFullName(), this.jasmine.CATCH_EXCEPTIONS) }, this.suite.description)
this.createDom('a', { className: 'description', href: this.jasmine.HtmlReporter.sectionLink(this.suite.getFullName(), catchExceptions) }, this.suite.description)
);

this.appendToSummary(this.suite, this.element);
Expand Down
26 changes: 14 additions & 12 deletions lib/jasmine-core/jasmine.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,6 @@ jasmine.MAX_PRETTY_PRINT_DEPTH = 40;
*/
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;

/**
* By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite.
* Set to false to let the exception bubble up in the browser.
*
*/
jasmine.CATCH_EXCEPTIONS = true;

jasmine.getGlobal = function() {
function getGlobal() {
return this;
Expand Down Expand Up @@ -480,6 +473,7 @@ jasmine.buildExpectationResult = function(params) {
var self = this;
var global = options.global || jasmine.getGlobal();

var catchExceptions = true;
var encourageGC = options.encourageGarbageCollection || encourageGarbageCollection;

this.clock = new jasmine.Clock(global, new jasmine.DelayedFunctionScheduler());
Expand All @@ -492,7 +486,6 @@ jasmine.buildExpectationResult = function(params) {
this.currentRunner_ = new jasmine.Runner(this, isSuite);
this.spies_ = [];
this.currentSpec = null;
this.catchExceptions = jasmine.CATCH_EXCEPTIONS;
this.undefined = jasmine.undefined;

this.reporter = new jasmine.MultiReporter();
Expand Down Expand Up @@ -558,6 +551,14 @@ jasmine.buildExpectationResult = function(params) {
return buildExpectationResult(attrs);
};

this.catchExceptions = function(value) {
return catchExceptions = !!value;
}

this.catchingExceptions = function(value) {
return catchExceptions;
}

this.specFactory = function(description, fn, suite) {
var spec = new specConstructor({
id: self.nextSpecId(),
Expand All @@ -569,7 +570,7 @@ jasmine.buildExpectationResult = function(params) {
getSpecName: function(spec) { return getSpecName(spec, suite) },
startCallback: startCallback,
description: description,
catchExceptions: self.catchExceptions,
catchingExceptions: this.catchingExceptions,
expectationResultFactory: expectationResultFactory,
fn: fn
});
Expand Down Expand Up @@ -1887,7 +1888,7 @@ jasmine.Spec = function(attrs) {
this.fn = attrs.fn;
this.beforeFns = attrs.beforeFns || function() {};
this.afterFns = attrs.afterFns || function() {};
this.catchExceptions = attrs.catchExceptions;
this.catchingExceptions = attrs.catchingExceptions;
this.startCallback = attrs.startCallback || function() {};
this.exceptionFormatter = attrs.exceptionFormatter || function() {};
this.getSpecName = attrs.getSpecName;
Expand Down Expand Up @@ -1933,8 +1934,9 @@ jasmine.Spec.prototype.execute = function() {
message: self.exceptionFormatter(e),
trace: e
}));
if (!self.catchExceptions) {
resultCallback();
if (!self.catchingExceptions()) {
//TODO: set a var when we catch an exception and
//use a finally block to close the loop in a nice way..
throw e;
}
}
Expand Down
7 changes: 1 addition & 6 deletions spec/core/ExceptionsSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ describe('Exceptions:', function() {

describe('with break on exception', function() {
it('should not catch the exception', function() {
var oldCatch = jasmine.CATCH_EXCEPTIONS;
jasmine.CATCH_EXCEPTIONS = false;
env = new jasmine.Env();
env.catchExceptions(false);
var suite = env.describe('suite for break on exceptions', function() {
env.it('should break when an exception is thrown', function() {
throw new Error('I should hit a breakpoint!');
Expand All @@ -50,9 +48,6 @@ describe('Exceptions:', function() {
dont_change = 'oops I changed';
}
catch (e) {}
finally {
jasmine.CATCH_EXCEPTIONS = oldCatch;
}

expect(dont_change).toEqual('I will never change!');
});
Expand Down
19 changes: 0 additions & 19 deletions spec/core/SpecSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,25 +158,6 @@ describe("Spec", function() {
expect(spec.status()).toBe('failed');
});

it("calls the resultCallback with a failure when an exception occurs in the spec fn", function() {
//TODO: one day we should pass a stack with this.
var resultCallback = originalJasmine.createSpy('resultCallback'),
spec = new jasmine.Spec({
fn: function() {
throw new Error();
},
catchExceptions: true,
resultCallback: resultCallback
});

expect(resultCallback).not.toHaveBeenCalled();
spec.execute();
expect(resultCallback).toHaveBeenCalledWith(
originalJasmine.objectContaining({status: 'failed'})
);

});

it("throws when an exception occurs in the spec fn if catchExceptions is false", function() {
//TODO: one day we should pass a stack with this.
var resultCallback = originalJasmine.createSpy('resultCallback'),
Expand Down
5 changes: 4 additions & 1 deletion spec/html/HTMLReporterSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ describe("HtmlReporter", function() {

body = document.createElement("body");
fakeDocument = { body: body, location: { search: "" } };
htmlReporter = new jasmine.HtmlReporter(fakeDocument, null, function(fn) { fn() });
htmlReporter = new jasmine.HtmlReporter(fakeDocument, null, {
catchingExceptions: function() { return true; },
catchExceptions: function() { }
}, {yieldForRender: function(fn) { fn() }});
});

function fakeSpec(name) {
Expand Down
1 change: 0 additions & 1 deletion spec/runner.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@


<!-- include spec files here... -->
<script type="text/javascript" src=".././spec/core/BaseSpec.js"></script>
<script type="text/javascript" src=".././spec/core/CustomMatchersSpec.js"></script>
<script type="text/javascript" src=".././spec/core/EnvSpec.js"></script>
<script type="text/javascript" src=".././spec/core/ExceptionsSpec.js"></script>
Expand Down
12 changes: 10 additions & 2 deletions src/core/Env.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
var self = this;
var global = options.global || jasmine.getGlobal();

var catchExceptions = true;
var encourageGC = options.encourageGarbageCollection || encourageGarbageCollection;

this.clock = new jasmine.Clock(global, new jasmine.DelayedFunctionScheduler());
Expand All @@ -21,7 +22,6 @@
this.currentRunner_ = new jasmine.Runner(this, isSuite);
this.spies_ = [];
this.currentSpec = null;
this.catchExceptions = jasmine.CATCH_EXCEPTIONS;
this.undefined = jasmine.undefined;

this.reporter = new jasmine.MultiReporter();
Expand Down Expand Up @@ -87,6 +87,14 @@
return buildExpectationResult(attrs);
};

this.catchExceptions = function(value) {
return catchExceptions = !!value;
}

this.catchingExceptions = function(value) {
return catchExceptions;
}

this.specFactory = function(description, fn, suite) {
var spec = new specConstructor({
id: self.nextSpecId(),
Expand All @@ -98,7 +106,7 @@
getSpecName: function(spec) { return getSpecName(spec, suite) },
startCallback: startCallback,
description: description,
catchExceptions: self.catchExceptions,
catchingExceptions: this.catchingExceptions,
expectationResultFactory: expectationResultFactory,
fn: fn
});
Expand Down
7 changes: 4 additions & 3 deletions src/core/Spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jasmine.Spec = function(attrs) {
this.fn = attrs.fn;
this.beforeFns = attrs.beforeFns || function() {};
this.afterFns = attrs.afterFns || function() {};
this.catchExceptions = attrs.catchExceptions;
this.catchingExceptions = attrs.catchingExceptions;
this.startCallback = attrs.startCallback || function() {};
this.exceptionFormatter = attrs.exceptionFormatter || function() {};
this.getSpecName = attrs.getSpecName;
Expand Down Expand Up @@ -54,8 +54,9 @@ jasmine.Spec.prototype.execute = function() {
message: self.exceptionFormatter(e),
trace: e
}));
if (!self.catchExceptions) {
resultCallback();
if (!self.catchingExceptions()) {
//TODO: set a var when we catch an exception and
//use a finally block to close the loop in a nice way..
throw e;
}
}
Expand Down
7 changes: 0 additions & 7 deletions src/core/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,6 @@ jasmine.MAX_PRETTY_PRINT_DEPTH = 40;
*/
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;

/**
* By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite.
* Set to false to let the exception bubble up in the browser.
*
*/
jasmine.CATCH_EXCEPTIONS = true;

jasmine.getGlobal = function() {
function getGlobal() {
return this;
Expand Down
Loading

0 comments on commit 4355249

Please sign in to comment.