195 lines
7.1 KiB
TypeScript
195 lines
7.1 KiB
TypeScript
|
import {
|
||
|
AsyncTestCompleter,
|
||
|
beforeEach,
|
||
|
ddescribe,
|
||
|
describe,
|
||
|
el,
|
||
|
expect,
|
||
|
iit,
|
||
|
inject,
|
||
|
it,
|
||
|
xit,
|
||
|
beforeEachBindings,
|
||
|
SpyObject,
|
||
|
} from 'angular2/test_lib';
|
||
|
|
||
|
import {MapWrapper} from 'angular2/src/facade/collection';
|
||
|
import {DOM} from 'angular2/src/dom/dom_adapter';
|
||
|
|
||
|
import {DomTestbed, TestView} from './dom_testbed';
|
||
|
|
||
|
import {ViewDefinition, DirectiveMetadata, RenderViewRef} from 'angular2/src/render/api';
|
||
|
|
||
|
export function main() {
|
||
|
describe('DomRenderer integration', () => {
|
||
|
beforeEachBindings(() => [DomTestbed]);
|
||
|
|
||
|
it('should create and destroy root host views while using the given elements in place',
|
||
|
inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compiler.compileHost(someComponent)
|
||
|
.then((hostProtoViewDto) => {
|
||
|
var view =
|
||
|
new TestView(tb.renderer.createRootHostView(hostProtoViewDto.render, '#root'));
|
||
|
expect(view.rawView.rootNodes[0]).toEqual(tb.rootEl);
|
||
|
|
||
|
tb.renderer.destroyView(view.viewRef);
|
||
|
// destroying a root view should not disconnect it!
|
||
|
expect(tb.rootEl.parentNode).toBeTruthy();
|
||
|
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
it('should create and destroy free host views',
|
||
|
inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compiler.compileHost(someComponent)
|
||
|
.then((hostProtoViewDto) => {
|
||
|
var view = new TestView(tb.renderer.createView(hostProtoViewDto.render));
|
||
|
var hostElement = tb.renderer.getHostElement(view.viewRef);
|
||
|
DOM.appendChild(tb.rootEl, hostElement);
|
||
|
|
||
|
tb.renderer.detachFreeHostView(null, view.viewRef);
|
||
|
expect(DOM.parentElement(hostElement)).toBeFalsy();
|
||
|
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
it('should attach and detach component views',
|
||
|
inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compileAll([
|
||
|
someComponent,
|
||
|
new ViewDefinition(
|
||
|
{componentId: 'someComponent', template: 'hello', directives: []})
|
||
|
])
|
||
|
.then((protoViewDtos) => {
|
||
|
var rootView = tb.createRootView(protoViewDtos[0]);
|
||
|
var cmpView = tb.createComponentView(rootView.viewRef, 0, protoViewDtos[1]);
|
||
|
expect(tb.rootEl).toHaveText('hello');
|
||
|
tb.destroyComponentView(rootView.viewRef, 0, cmpView.viewRef);
|
||
|
expect(tb.rootEl).toHaveText('');
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
it('should update text nodes', inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compileAll([
|
||
|
someComponent,
|
||
|
new ViewDefinition(
|
||
|
{componentId: 'someComponent', template: '{{a}}', directives: []})
|
||
|
])
|
||
|
.then((protoViewDtos) => {
|
||
|
var rootView = tb.createRootView(protoViewDtos[0]);
|
||
|
var cmpView = tb.createComponentView(rootView.viewRef, 0, protoViewDtos[1]);
|
||
|
|
||
|
tb.renderer.setText(cmpView.viewRef, 0, 'hello');
|
||
|
expect(tb.rootEl).toHaveText('hello');
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
it('should update element properties', inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compileAll([
|
||
|
someComponent,
|
||
|
new ViewDefinition({
|
||
|
componentId: 'someComponent',
|
||
|
template: '<input [value]="someProp">asdf',
|
||
|
directives: []
|
||
|
})
|
||
|
])
|
||
|
.then((protoViewDtos) => {
|
||
|
var rootView = tb.createRootView(protoViewDtos[0]);
|
||
|
var cmpView = tb.createComponentView(rootView.viewRef, 0, protoViewDtos[1]);
|
||
|
|
||
|
tb.renderer.setElementProperty(cmpView.viewRef, 0, 'value', 'hello');
|
||
|
expect(DOM.childNodes(tb.rootEl)[0].value).toEqual('hello');
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
it('should call actions on the element',
|
||
|
inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compileAll([
|
||
|
someComponent,
|
||
|
new ViewDefinition({
|
||
|
componentId: 'someComponent',
|
||
|
template: '<input with-host-actions></input>',
|
||
|
directives: [directiveWithHostActions]
|
||
|
})
|
||
|
])
|
||
|
.then((protoViewDtos) => {
|
||
|
var views = tb.createRootViews(protoViewDtos);
|
||
|
var componentView = views[1];
|
||
|
|
||
|
tb.renderer.callAction(componentView.viewRef, 0, 'value = "val"', null);
|
||
|
|
||
|
expect(DOM.getValue(DOM.childNodes(tb.rootEl)[0])).toEqual('val');
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
|
||
|
it('should add and remove views to and from containers',
|
||
|
inject([AsyncTestCompleter, DomTestbed], (async, tb) => {
|
||
|
tb.compileAll([
|
||
|
someComponent,
|
||
|
new ViewDefinition({
|
||
|
componentId: 'someComponent',
|
||
|
template: '<template>hello</template>',
|
||
|
directives: []
|
||
|
})
|
||
|
])
|
||
|
.then((protoViewDtos) => {
|
||
|
var rootView = tb.createRootView(protoViewDtos[0]);
|
||
|
var cmpView = tb.createComponentView(rootView.viewRef, 0, protoViewDtos[1]);
|
||
|
|
||
|
var childProto = protoViewDtos[1].elementBinders[0].nestedProtoView;
|
||
|
expect(tb.rootEl).toHaveText('');
|
||
|
var childView = tb.createViewInContainer(cmpView.viewRef, 0, 0, childProto);
|
||
|
expect(tb.rootEl).toHaveText('hello');
|
||
|
tb.destroyViewInContainer(cmpView.viewRef, 0, 0, childView.viewRef);
|
||
|
expect(tb.rootEl).toHaveText('');
|
||
|
|
||
|
async.done();
|
||
|
});
|
||
|
}));
|
||
|
|
||
|
it('should handle events', inject([AsyncTestCompleter, DomTestbed], (async, tb: DomTestbed) => {
|
||
|
tb.compileAll([
|
||
|
someComponent,
|
||
|
new ViewDefinition({
|
||
|
componentId: 'someComponent',
|
||
|
template: '<input (change)="doSomething()">',
|
||
|
directives: []
|
||
|
})
|
||
|
])
|
||
|
.then((protoViewDtos) => {
|
||
|
var rootView = tb.createRootView(protoViewDtos[0]);
|
||
|
var cmpView = tb.createComponentView(rootView.viewRef, 0, protoViewDtos[1]);
|
||
|
|
||
|
tb.triggerEvent(cmpView.viewRef, 0, 'change');
|
||
|
var eventEntry = cmpView.events[0];
|
||
|
// bound element index
|
||
|
expect(eventEntry[0]).toEqual(0);
|
||
|
// event type
|
||
|
expect(eventEntry[1]).toEqual('change');
|
||
|
// actual event
|
||
|
expect((<any>MapWrapper.get(eventEntry[2], '$event')).type).toEqual('change');
|
||
|
async.done();
|
||
|
});
|
||
|
|
||
|
}));
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
var someComponent = new DirectiveMetadata(
|
||
|
{id: 'someComponent', type: DirectiveMetadata.COMPONENT_TYPE, selector: 'some-comp'});
|
||
|
|
||
|
var directiveWithHostActions = new DirectiveMetadata({
|
||
|
id: 'withHostActions',
|
||
|
type: DirectiveMetadata.DIRECTIVE_TYPE,
|
||
|
selector: '[with-host-actions]',
|
||
|
hostActions: MapWrapper.createFromStringMap({'setValue': 'value = "val"'})
|
||
|
});
|