84 lines
2.6 KiB
TypeScript
84 lines
2.6 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {ComponentTemplate} from '@angular/core/src/render3';
|
|
import {createLView, createTNode, createTView} from '@angular/core/src/render3/instructions/shared';
|
|
import {TConstants, TElementNode, TNodeType} from '@angular/core/src/render3/interfaces/node';
|
|
import {domRendererFactory3} from '@angular/core/src/render3/interfaces/renderer';
|
|
import {LView, LViewFlags, T_HOST, TView, TViewType} from '@angular/core/src/render3/interfaces/view';
|
|
import {enterView, leaveView, specOnlyIsInstructionStateEmpty} from '@angular/core/src/render3/state';
|
|
import {noop} from '@angular/core/src/util/noop';
|
|
|
|
/**
|
|
* Fixture useful for testing operations which need `LView` / `TView`
|
|
*/
|
|
export class ViewFixture {
|
|
/**
|
|
* Clean up the `LFrame` stack between tests.
|
|
*/
|
|
static cleanUp() {
|
|
while (!specOnlyIsInstructionStateEmpty()) {
|
|
leaveView();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* DOM element which acts as a host to the `LView`.
|
|
*/
|
|
host: HTMLElement;
|
|
|
|
tView: TView;
|
|
|
|
lView: LView;
|
|
|
|
constructor({template, decls, vars, consts, context}: {
|
|
decls?: number,
|
|
vars?: number,
|
|
template?: ComponentTemplate<any>,
|
|
consts?: TConstants,
|
|
context?: {}
|
|
} = {}) {
|
|
const hostRenderer = domRendererFactory3.createRenderer(null, null);
|
|
this.host = hostRenderer.createElement('host-element') as HTMLElement;
|
|
const hostTView = createTView(TViewType.Root, null, null, 1, 0, null, null, null, null, null);
|
|
const hostLView = createLView(
|
|
null, hostTView, {}, LViewFlags.CheckAlways | LViewFlags.IsRoot, null, null,
|
|
domRendererFactory3, hostRenderer, null, null);
|
|
|
|
|
|
this.tView = createTView(
|
|
TViewType.Component, null, template || noop, decls || 0, vars || 0, null, null, null, null,
|
|
consts || null);
|
|
const hostTNode =
|
|
createTNode(hostTView, null, TNodeType.Element, 0, 'host-element', null) as TElementNode;
|
|
this.lView = createLView(
|
|
hostLView, this.tView, context || {}, LViewFlags.CheckAlways, this.host, hostTNode,
|
|
domRendererFactory3, hostRenderer, null, null);
|
|
}
|
|
|
|
/**
|
|
* If you use `ViewFixture` and `enter()`, please add `afterEach(ViewFixture.cleanup);` to ensure
|
|
* that he global `LFrame` stack gets cleaned up between the tests.
|
|
*/
|
|
enterView() {
|
|
enterView(this.lView);
|
|
}
|
|
|
|
leaveView() {
|
|
leaveView();
|
|
}
|
|
|
|
apply(fn: () => void) {
|
|
this.enterView();
|
|
try {
|
|
fn();
|
|
} finally {
|
|
this.leaveView();
|
|
}
|
|
}
|
|
} |