Skip to content

Commit

Permalink
Merge pull request #15600 from emberjs/improve-test-debugging
Browse files Browse the repository at this point in the history
[BUGFIX LTS] ensure “pause on exception” pauses in the right place
  • Loading branch information
rwjblue authored Sep 21, 2017
2 parents c377788 + db55502 commit 04b6f42
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 26 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
"babel-plugin-transform-es2015-template-literals": "^6.22.0",
"babel-plugin-transform-proto-to-assign": "^6.23.0",
"babel-template": "^6.24.1",
"backburner.js": "^1.1.0",
"backburner.js": "^1.2.1",
"broccoli-babel-transpiler": "next",
"broccoli-concat": "^3.2.2",
"broccoli-file-creator": "^1.1.1",
Expand Down
6 changes: 6 additions & 0 deletions packages/ember-metal/lib/error_handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ let getStack = error => {
};

let onerror;
export const onErrorTarget = {
get onerror() {
return dispatchOverride || onerror;
}
};

// Ember.onerror getter
export function getOnerror() {
return onerror;
Expand Down
20 changes: 5 additions & 15 deletions packages/ember-metal/lib/run_loop.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { GUID_KEY } from 'ember-utils';
import { assert, isTesting } from 'ember-debug';
import {
dispatchError,
setOnerror
onErrorTarget
} from './error_handler';
import {
beginPropertyChanges,
Expand All @@ -18,25 +17,16 @@ function onEnd(current, next) {
run.currentRunLoop = next;
}

const onErrorTarget = {
get onerror() {
return dispatchError;
},
set onerror(handler) {
return setOnerror(handler);
}
};

const backburner = new Backburner(['sync', 'actions', 'destroy'], {
GUID_KEY: GUID_KEY,
GUID_KEY,
sync: {
before: beginPropertyChanges,
after: endPropertyChanges
},
defaultQueue: 'actions',
onBegin: onBegin,
onEnd: onEnd,
onErrorTarget: onErrorTarget,
onBegin,
onEnd,
onErrorTarget,
onErrorMethod: 'onerror'
});

Expand Down
5 changes: 3 additions & 2 deletions packages/ember-metal/tests/run_loop/later_test.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { assign } from 'ember-utils';
import { run, isNone } from '../..';

const originalSetTimeout = window.setTimeout;
Expand Down Expand Up @@ -198,15 +199,15 @@ asyncTest('setTimeout should never run with a negative wait', function() {
// happens when an expired timer callback takes a while to run,
// which is what we simulate here.
let newSetTimeoutUsed;
run.backburner._platform = {
run.backburner._platform = assign({}, originalPlatform, {
setTimeout() {
let wait = arguments[arguments.length - 1];
newSetTimeoutUsed = true;
ok(!isNaN(wait) && wait >= 0, 'wait is a non-negative number');

return originalPlatform.setTimeout.apply(originalPlatform, arguments);
}
};
});

let count = 0;
run(() => {
Expand Down
4 changes: 2 additions & 2 deletions packages/ember-runtime/tests/system/object/create_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ QUnit.test('inherits properties from passed in EmberObject', function() {
});

QUnit.test('throws if you try to pass anything a string as a parameter', function() {
let expected = 'EmberObject.create only accepts an objects.';
let expected = 'Ember.Object.create only accepts objects.';

throws(() => EmberObject.create('some-string'), expected);
expectAssertion(() => EmberObject.create('some-string'), expected);
});

QUnit.test('EmberObject.create can take undefined as a parameter', function() {
Expand Down
93 changes: 93 additions & 0 deletions packages/ember/tests/error_handler_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import Ember from 'ember';
import { run } from 'ember-metal';
import { DEBUG } from 'ember-env-flags';

const ONERROR = Ember.onerror;
const ADAPTER = Ember.Test && Ember.Test.adapter;
const TESTING = Ember.testing;

QUnit.module('error_handler', {
teardown() {
Ember.onerror = ONERROR;
Ember.testing = TESTING;
if (Ember.Test) {
Ember.Test.adapter = ADAPTER;
}
}
});

function runThatThrows(message) {
return run(() => {
throw new Error(message);
});
}

test('by default there is no onerror', function(assert) {
Ember.onerror = undefined;
assert.throws(runThatThrows, Error);
assert.equal(Ember.onerror, undefined);
});

test('when Ember.onerror is registered', function(assert) {
assert.expect(2);
Ember.onerror = function(error) {
assert.ok(true, 'onerror called');
throw error;
};
assert.throws(runThatThrows, Error);
// Ember.onerror = ONERROR;
});

if (DEBUG) {
test('when Ember.Test.adapter is registered', function(assert) {
assert.expect(2);

Ember.Test.adapter = {
exception(error) {
assert.ok(true, 'adapter called');
throw error;
}
};

assert.throws(runThatThrows, Error);
});

test('when both Ember.onerror Ember.Test.adapter are registered', function(assert) {
assert.expect(2);

// takes precedence
Ember.Test.adapter = {
exception(error) {
assert.ok(true, 'adapter called');
throw error;
}
};

Ember.onerror = function(error) {
assert.ok(false, 'onerror was NEVER called');
throw error;
};

assert.throws(runThatThrows, Error);
});
}

QUnit.test('Ember.run does not swallow exceptions by default (Ember.testing = true)', function() {
Ember.testing = true;
let error = new Error('the error');
throws(() => {
Ember.run(() => {
throw error;
});
}, error);
});

QUnit.test('Ember.run does not swallow exceptions by default (Ember.testing = false)', function() {
Ember.testing = false;
let error = new Error('the error');
throws(() => {
Ember.run(() => {
throw error;
});
}, error);
});
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ moduleFor('The {{link-to}} helper + query params - globals mode app', class exte
[`@test the {{link-to}} helper throws a useful error if you invoke it wrong`](assert) {
assert.expect(1);

assert.throws(() => {
expectAssertion(() => {
this.runTask(() => {
this.createApplication();

Expand All @@ -574,6 +574,6 @@ moduleFor('The {{link-to}} helper + query params - globals mode app', class exte

this.addTemplate('application', `{{#link-to id='the-link'}}Index{{/link-to}}`);
});
}, /(You must provide one or more parameters to the link-to component.|undefined is not an object)/);
}, /You must provide one or more parameters to the link-to component/);
}
});
});
6 changes: 3 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -870,9 +870,9 @@ backbone@^1.1.2:
dependencies:
underscore ">=1.8.3"

backburner.js@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-1.1.0.tgz#16ef021891bc330a2d021c63d8d68cb8611eb3e4"
backburner.js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-1.2.1.tgz#26adfcd4d06adc80f78be010b3ff90bf44fc7790"

[email protected]:
version "1.0.2"
Expand Down

0 comments on commit 04b6f42

Please sign in to comment.