2015-03-13 06:10:11 -04:00
|
|
|
import {bind} from 'angular2/di';
|
2015-03-30 10:37:33 -04:00
|
|
|
|
2015-03-13 06:10:11 -04:00
|
|
|
import {Compiler, CompilerCache} from 'angular2/src/core/compiler/compiler';
|
|
|
|
import {Reflector, reflector} from 'angular2/src/reflection/reflection';
|
|
|
|
import {Parser, Lexer, ChangeDetection, dynamicChangeDetection} from 'angular2/change_detection';
|
|
|
|
import {ExceptionHandler} from 'angular2/src/core/exception_handler';
|
2015-04-02 17:40:49 -04:00
|
|
|
import {TemplateLoader} from 'angular2/src/render/dom/compiler/template_loader';
|
2015-03-13 06:10:11 -04:00
|
|
|
import {TemplateResolver} from 'angular2/src/core/compiler/template_resolver';
|
|
|
|
import {DirectiveMetadataReader} from 'angular2/src/core/compiler/directive_metadata_reader';
|
2015-03-30 10:37:33 -04:00
|
|
|
import {ShadowDomStrategy, EmulatedUnscopedShadowDomStrategy} from 'angular2/src/core/compiler/shadow_dom_strategy';
|
2015-04-02 12:52:00 -04:00
|
|
|
import {XHR} from 'angular2/src/services/xhr';
|
2015-03-13 06:10:11 -04:00
|
|
|
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
|
2015-04-02 12:52:00 -04:00
|
|
|
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
2015-04-02 17:40:49 -04:00
|
|
|
import {StyleUrlResolver} from 'angular2/src/render/dom/shadow_dom/style_url_resolver';
|
|
|
|
import {StyleInliner} from 'angular2/src/render/dom/shadow_dom/style_inliner';
|
2015-03-30 10:37:33 -04:00
|
|
|
import {VmTurnZone} from 'angular2/src/core/zone/vm_turn_zone';
|
|
|
|
|
|
|
|
import {DOM} from 'angular2/src/dom/dom_adapter';
|
|
|
|
|
|
|
|
import {appDocumentToken} from 'angular2/src/core/application_tokens';
|
|
|
|
|
|
|
|
import {EventManager, DomEventsPlugin} from 'angular2/src/render/dom/events/event_manager';
|
|
|
|
|
|
|
|
import {MockTemplateResolver} from 'angular2/src/mock/template_resolver_mock';
|
2015-03-31 10:55:46 -04:00
|
|
|
import {MockXHR} from 'angular2/src/mock/xhr_mock';
|
2015-03-30 10:37:33 -04:00
|
|
|
import {MockVmTurnZone} from 'angular2/src/mock/vm_turn_zone_mock';
|
|
|
|
|
|
|
|
import {TestBed} from './test_bed';
|
2015-03-13 06:10:11 -04:00
|
|
|
|
|
|
|
import {Injector} from 'angular2/di';
|
|
|
|
|
|
|
|
import {List, ListWrapper} from 'angular2/src/facade/collection';
|
|
|
|
import {FunctionWrapper} from 'angular2/src/facade/lang';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the root injector bindings.
|
|
|
|
*
|
|
|
|
* This must be kept in sync with the _rootBindings in application.js
|
|
|
|
*
|
|
|
|
* @returns {*[]}
|
|
|
|
*/
|
|
|
|
function _getRootBindings() {
|
|
|
|
return [
|
|
|
|
bind(Reflector).toValue(reflector),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the application injector bindings.
|
|
|
|
*
|
|
|
|
* This must be kept in sync with _injectorBindings() in application.js
|
|
|
|
*
|
|
|
|
* @returns {*[]}
|
|
|
|
*/
|
|
|
|
function _getAppBindings() {
|
2015-03-30 10:37:33 -04:00
|
|
|
var appDoc;
|
|
|
|
|
|
|
|
// The document is only available in browser environment
|
|
|
|
try {
|
|
|
|
appDoc = DOM.defaultDoc();
|
|
|
|
} catch(e) {
|
|
|
|
appDoc = null;
|
|
|
|
}
|
|
|
|
|
2015-03-13 06:10:11 -04:00
|
|
|
return [
|
2015-03-30 10:37:33 -04:00
|
|
|
bind(appDocumentToken).toValue(appDoc),
|
|
|
|
bind(ShadowDomStrategy).toFactory(
|
|
|
|
(styleUrlResolver, doc) => new EmulatedUnscopedShadowDomStrategy(styleUrlResolver, doc.head),
|
|
|
|
[StyleUrlResolver, appDocumentToken]),
|
2015-03-13 06:10:11 -04:00
|
|
|
Compiler,
|
|
|
|
CompilerCache,
|
2015-03-30 10:37:33 -04:00
|
|
|
bind(TemplateResolver).toClass(MockTemplateResolver),
|
2015-03-13 06:10:11 -04:00
|
|
|
bind(ChangeDetection).toValue(dynamicChangeDetection),
|
|
|
|
TemplateLoader,
|
|
|
|
DirectiveMetadataReader,
|
|
|
|
Parser,
|
|
|
|
Lexer,
|
|
|
|
ExceptionHandler,
|
2015-03-31 10:55:46 -04:00
|
|
|
bind(XHR).toClass(MockXHR),
|
2015-03-13 06:10:11 -04:00
|
|
|
ComponentUrlMapper,
|
|
|
|
UrlResolver,
|
|
|
|
StyleUrlResolver,
|
2015-03-30 10:37:33 -04:00
|
|
|
StyleInliner,
|
|
|
|
TestBed,
|
|
|
|
bind(VmTurnZone).toClass(MockVmTurnZone),
|
|
|
|
bind(EventManager).toFactory((zone) => {
|
|
|
|
var plugins = [
|
|
|
|
new DomEventsPlugin(),
|
|
|
|
];
|
|
|
|
return new EventManager(plugins, zone);
|
|
|
|
}, [VmTurnZone]),
|
2015-03-13 06:10:11 -04:00
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
export function createTestInjector(bindings: List) {
|
|
|
|
var rootInjector = new Injector(_getRootBindings());
|
|
|
|
return rootInjector.createChild(ListWrapper.concat(_getAppBindings(), bindings));
|
|
|
|
}
|
|
|
|
|
2015-03-13 16:52:59 -04:00
|
|
|
/**
|
2015-03-13 13:48:29 -04:00
|
|
|
* Allows injecting dependencies in `beforeEach()` and `it()`.
|
2015-03-13 06:10:11 -04:00
|
|
|
*
|
|
|
|
* Example:
|
|
|
|
*
|
2015-03-13 13:48:29 -04:00
|
|
|
* ```
|
|
|
|
* beforeEach(inject([Dependency, AClass], (dep, object) => {
|
|
|
|
* // some code that uses `dep` and `object`
|
|
|
|
* // ...
|
|
|
|
* }));
|
2015-03-13 06:10:11 -04:00
|
|
|
*
|
2015-03-13 13:48:29 -04:00
|
|
|
* it('...', inject([AClass, AsyncTestCompleter], (object, async) => {
|
|
|
|
* object.doSomething().then(() => {
|
|
|
|
* expect(...);
|
|
|
|
* async.done();
|
|
|
|
* });
|
|
|
|
* })
|
|
|
|
* ```
|
2015-03-13 06:10:11 -04:00
|
|
|
*
|
|
|
|
* Notes:
|
|
|
|
* - injecting an `AsyncTestCompleter` allow completing async tests - this is the equivalent of
|
|
|
|
* adding a `done` parameter in Jasmine,
|
|
|
|
* - inject is currently a function because of some Traceur limitation the syntax should eventually
|
|
|
|
* becomes `it('...', @Inject (object: AClass, async: AsyncTestCompleter) => { ... });`
|
|
|
|
*
|
|
|
|
* @param {Array} tokens
|
|
|
|
* @param {Function} fn
|
|
|
|
* @return {FunctionWithParamTokens}
|
|
|
|
*/
|
|
|
|
export function inject(tokens: List, fn: Function) {
|
|
|
|
return new FunctionWithParamTokens(tokens, fn);
|
|
|
|
}
|
|
|
|
|
|
|
|
export class FunctionWithParamTokens {
|
|
|
|
_tokens: List;
|
|
|
|
_fn: Function;
|
|
|
|
|
|
|
|
constructor(tokens: List, fn: Function) {
|
|
|
|
this._tokens = tokens;
|
|
|
|
this._fn = fn;
|
|
|
|
}
|
|
|
|
|
|
|
|
execute(injector: Injector) {
|
|
|
|
var params = ListWrapper.map(this._tokens, (t) => injector.get(t));
|
|
|
|
FunctionWrapper.apply(this._fn, params);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|