|  | 
| 1 | 1 | 'use strict'; | 
| 2 | 2 | const isGeneratorFn = require('is-generator-fn'); | 
| 3 |  | -const maxTimeout = require('max-timeout'); | 
| 4 | 3 | const co = require('co-with-promise'); | 
| 5 | 4 | const observableToPromise = require('observable-to-promise'); | 
| 6 | 5 | const isPromise = require('is-promise'); | 
| @@ -102,6 +101,7 @@ class Test { | 
| 102 | 101 | 		this.calledEnd = false; | 
| 103 | 102 | 		this.duration = null; | 
| 104 | 103 | 		this.endCallbackFinisher = null; | 
|  | 104 | +		this.finishDueToInactivity = null; | 
| 105 | 105 | 		this.finishing = false; | 
| 106 | 106 | 		this.pendingAssertions = []; | 
| 107 | 107 | 		this.planCount = null; | 
| @@ -221,9 +221,6 @@ class Test { | 
| 221 | 221 | 	run() { | 
| 222 | 222 | 		this.startedAt = globals.now(); | 
| 223 | 223 | 
 | 
| 224 |  | -		// Wait until all assertions are complete | 
| 225 |  | -		this.timeoutHandle = globals.setTimeout(() => {}, maxTimeout); | 
| 226 |  | - | 
| 227 | 224 | 		const result = this.callFn(); | 
| 228 | 225 | 		if (!result.ok) { | 
| 229 | 226 | 			throwsHelper(result.error); | 
| @@ -262,23 +259,36 @@ class Test { | 
| 262 | 259 | 				this.endCallbackFinisher = () => { | 
| 263 | 260 | 					resolve(this.finishPromised()); | 
| 264 | 261 | 				}; | 
|  | 262 | + | 
|  | 263 | +				this.finishDueToInactivity = () => { | 
|  | 264 | +					this.saveFirstError(new Error('`t.end()` was never called')); | 
|  | 265 | +					resolve(this.finishPromised()); | 
|  | 266 | +				}; | 
| 265 | 267 | 			}); | 
| 266 | 268 | 		} | 
| 267 | 269 | 
 | 
| 268 | 270 | 		if (promise) { | 
| 269 |  | -			return promise.then( | 
| 270 |  | -				() => this.finish(), | 
| 271 |  | -				err => { | 
| 272 |  | -					throwsHelper(err); | 
| 273 |  | - | 
| 274 |  | -					this.saveFirstError(new assert.AssertionError({ | 
| 275 |  | -						message: 'Rejected promise returned by test', | 
| 276 |  | -						stack: err instanceof Error && err.stack, | 
| 277 |  | -						values: [formatAssertError.formatWithLabel('Rejection reason:', err)] | 
| 278 |  | -					})); | 
| 279 |  | -					return this.finish(); | 
| 280 |  | -				} | 
| 281 |  | -			); | 
|  | 271 | +			return new Promise(resolve => { | 
|  | 272 | +				this.finishDueToInactivity = () => { | 
|  | 273 | +					const err = returnedObservable ? | 
|  | 274 | +						new Error('Observable returned by test never completed') : | 
|  | 275 | +						new Error('Promise returned by test never resolved'); | 
|  | 276 | +					this.saveFirstError(err); | 
|  | 277 | +					resolve(this.finishPromised()); | 
|  | 278 | +				}; | 
|  | 279 | + | 
|  | 280 | +				promise | 
|  | 281 | +					.catch(err => { | 
|  | 282 | +						throwsHelper(err); | 
|  | 283 | + | 
|  | 284 | +						this.saveFirstError(new assert.AssertionError({ | 
|  | 285 | +							message: 'Rejected promise returned by test', | 
|  | 286 | +							stack: err instanceof Error && err.stack, | 
|  | 287 | +							values: [formatAssertError.formatWithLabel('Rejection reason:', err)] | 
|  | 288 | +						})); | 
|  | 289 | +					}) | 
|  | 290 | +					.then(() => resolve(this.finishPromised())); | 
|  | 291 | +			}); | 
| 282 | 292 | 		} | 
| 283 | 293 | 
 | 
| 284 | 294 | 		return this.finish(); | 
| @@ -314,7 +324,6 @@ class Test { | 
| 314 | 324 | 
 | 
| 315 | 325 | 	completeFinish() { | 
| 316 | 326 | 		this.duration = globals.now() - this.startedAt; | 
| 317 |  | -		globals.clearTimeout(this.timeoutHandle); | 
| 318 | 327 | 
 | 
| 319 | 328 | 		let reason = this.assertError; | 
| 320 | 329 | 		let passed = !reason; | 
|  | 
0 commit comments