angular2
Version:
Angular 2 - a web framework for modern web apps
250 lines • 8.99 kB
JavaScript
;var collection_1 = require('angular2/src/facade/collection');
var lang_1 = require('angular2/src/facade/lang');
var di_1 = require('angular2/src/core/di');
var test_injector_1 = require('./test_injector');
var utils_1 = require('./utils');
var test_injector_2 = require('./test_injector');
exports.inject = test_injector_2.inject;
var matchers_1 = require('./matchers');
exports.expect = matchers_1.expect;
exports.proxy = function (t) { return t; };
var _global = (typeof window === 'undefined' ? lang_1.global : window);
exports.afterEach = _global.afterEach;
var AsyncTestCompleter = (function () {
function AsyncTestCompleter(_done) {
this._done = _done;
}
AsyncTestCompleter.prototype.done = function () { this._done(); };
return AsyncTestCompleter;
})();
exports.AsyncTestCompleter = AsyncTestCompleter;
var jsmBeforeEach = _global.beforeEach;
var jsmDescribe = _global.describe;
var jsmDDescribe = _global.fdescribe;
var jsmXDescribe = _global.xdescribe;
var jsmIt = _global.it;
var jsmIIt = _global.fit;
var jsmXIt = _global.xit;
var runnerStack = [];
var inIt = false;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 500;
var globalTimeOut = utils_1.browserDetection.isSlow ? 3000 : jasmine.DEFAULT_TIMEOUT_INTERVAL;
var testProviders;
/**
* Mechanism to run `beforeEach()` functions of Angular tests.
*
* Note: Jasmine own `beforeEach` is used by this library to handle DI providers.
*/
var BeforeEachRunner = (function () {
function BeforeEachRunner(_parent) {
this._parent = _parent;
this._fns = [];
}
BeforeEachRunner.prototype.beforeEach = function (fn) { this._fns.push(fn); };
BeforeEachRunner.prototype.run = function (injector) {
if (this._parent)
this._parent.run(injector);
this._fns.forEach(function (fn) {
return lang_1.isFunction(fn) ? fn() : fn.execute(injector);
});
};
return BeforeEachRunner;
})();
// Reset the test providers before each test
jsmBeforeEach(function () { testProviders = []; });
function _describe(jsmFn) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var parentRunner = runnerStack.length === 0 ? null : runnerStack[runnerStack.length - 1];
var runner = new BeforeEachRunner(parentRunner);
runnerStack.push(runner);
var suite = jsmFn.apply(void 0, args);
runnerStack.pop();
return suite;
}
function describe() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
return _describe.apply(void 0, [jsmDescribe].concat(args));
}
exports.describe = describe;
function ddescribe() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
return _describe.apply(void 0, [jsmDDescribe].concat(args));
}
exports.ddescribe = ddescribe;
function xdescribe() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
return _describe.apply(void 0, [jsmXDescribe].concat(args));
}
exports.xdescribe = xdescribe;
function beforeEach(fn) {
if (runnerStack.length > 0) {
// Inside a describe block, beforeEach() uses a BeforeEachRunner
runnerStack[runnerStack.length - 1].beforeEach(fn);
}
else {
// Top level beforeEach() are delegated to jasmine
jsmBeforeEach(fn);
}
}
exports.beforeEach = beforeEach;
/**
* Allows overriding default providers defined in test_injector.js.
*
* The given function must return a list of DI providers.
*
* Example:
*
* beforeEachBindings(() => [
* provide(Compiler, {useClass: MockCompiler}),
* provide(SomeToken, {useValue: myValue}),
* ]);
*/
function beforeEachProviders(fn) {
jsmBeforeEach(function () {
var bindings = fn();
if (!bindings)
return;
testProviders = testProviders.concat(bindings);
});
}
exports.beforeEachProviders = beforeEachProviders;
/**
* @deprecated
*/
function beforeEachBindings(fn) {
beforeEachProviders(fn);
}
exports.beforeEachBindings = beforeEachBindings;
function _it(jsmFn, name, testFn, testTimeOut) {
var runner = runnerStack[runnerStack.length - 1];
var timeOut = lang_1.Math.max(globalTimeOut, testTimeOut);
if (testFn instanceof test_injector_1.FunctionWithParamTokens) {
// The test case uses inject(). ie `it('test', inject([AsyncTestCompleter], (async) => { ...
// }));`
if (testFn.hasToken(AsyncTestCompleter)) {
jsmFn(name, function (done) {
var completerProvider = di_1.provide(AsyncTestCompleter, {
useFactory: function () {
// Mark the test as async when an AsyncTestCompleter is injected in an it()
if (!inIt)
throw new Error('AsyncTestCompleter can only be injected in an "it()"');
return new AsyncTestCompleter(done);
}
});
var injector = test_injector_1.createTestInjector(testProviders.concat([completerProvider]));
runner.run(injector);
inIt = true;
testFn.execute(injector);
inIt = false;
}, timeOut);
}
else {
jsmFn(name, function () {
var injector = test_injector_1.createTestInjector(testProviders);
runner.run(injector);
testFn.execute(injector);
}, timeOut);
}
}
else {
// The test case doesn't use inject(). ie `it('test', (done) => { ... }));`
if (testFn.length === 0) {
jsmFn(name, function () {
var injector = test_injector_1.createTestInjector(testProviders);
runner.run(injector);
testFn();
}, timeOut);
}
else {
jsmFn(name, function (done) {
var injector = test_injector_1.createTestInjector(testProviders);
runner.run(injector);
testFn(done);
}, timeOut);
}
}
}
function it(name, fn, timeOut) {
if (timeOut === void 0) { timeOut = null; }
return _it(jsmIt, name, fn, timeOut);
}
exports.it = it;
function xit(name, fn, timeOut) {
if (timeOut === void 0) { timeOut = null; }
return _it(jsmXIt, name, fn, timeOut);
}
exports.xit = xit;
function iit(name, fn, timeOut) {
if (timeOut === void 0) { timeOut = null; }
return _it(jsmIIt, name, fn, timeOut);
}
exports.iit = iit;
var SpyObject = (function () {
function SpyObject(type) {
if (type === void 0) { type = null; }
if (type) {
for (var prop in type.prototype) {
var m = null;
try {
m = type.prototype[prop];
}
catch (e) {
}
if (typeof m === 'function') {
this.spy(prop);
}
}
}
}
// Noop so that SpyObject has the same interface as in Dart
SpyObject.prototype.noSuchMethod = function (args) { };
SpyObject.prototype.spy = function (name) {
if (!this[name]) {
this[name] = this._createGuinnessCompatibleSpy(name);
}
return this[name];
};
SpyObject.prototype.prop = function (name, value) { this[name] = value; };
SpyObject.stub = function (object, config, overrides) {
if (object === void 0) { object = null; }
if (config === void 0) { config = null; }
if (overrides === void 0) { overrides = null; }
if (!(object instanceof SpyObject)) {
overrides = config;
config = object;
object = new SpyObject();
}
var m = collection_1.StringMapWrapper.merge(config, overrides);
collection_1.StringMapWrapper.forEach(m, function (value, key) { object.spy(key).andReturn(value); });
return object;
};
/** @internal */
SpyObject.prototype._createGuinnessCompatibleSpy = function (name) {
var newSpy = jasmine.createSpy(name);
newSpy.andCallFake = newSpy.and.callFake;
newSpy.andReturn = newSpy.and.returnValue;
newSpy.reset = newSpy.calls.reset;
// revisit return null here (previously needed for rtts_assert).
newSpy.and.returnValue(null);
return newSpy;
};
return SpyObject;
})();
exports.SpyObject = SpyObject;
function isInInnerZone() {
return lang_1.global.zone._innerZone === true;
}
exports.isInInnerZone = isInInnerZone;
//# sourceMappingURL=testing_internal.js.map