aurelia-templating
Version:
An extensible HTML templating engine supporting databinding, custom elements, attached behaviors and more.
129 lines (119 loc) • 4.24 kB
JavaScript
import { ViewFactory } from "../src/view-factory";
import { Container } from "aurelia-dependency-injection";
import { ViewCompiler } from "../src/view-compiler";
import { ViewResources } from "../src/view-resources";
import { createFragment } from './util';
import { TargetInstruction } from "../src/instructions";
describe('ViewFactory', () => {
it('constructs', () => {
[null, undefined, 'string', {}, 1].forEach(v => {
expect(() => new ViewFactory(v, v, v, v)).not.toThrow();
});
});
describe('create()', () => {
/**@type {Container} */
let container;
// /**@type {ViewCompiler} */
// let compiler;
/**@type {ViewFactory} */
let viewFactory;
beforeEach(() => {
container = new Container();
// compiler = container.get(ViewCompiler);
// compiler.bindingLanguage.inspectTextContent = function() {
// return {
// createBinding() {
// return { bind() {}, unbind() {} };
// }
// }
// };
// compiler.bindingLanguage.inspectAttribute = function inspectAttribute(resources, tagName, attrName, attrValue) {
// return { attrName, attrValue };
// }
});
it('creates', () => {
const binding = {};
viewFactory = new ViewFactory(
createFragment('<div class="au-target" au-target-id="1"></div>'),
{
1: {
behaviorInstructions: [],
expressions: [
{
createBinding(target) {
binding.target = target;
return binding;
}
}
],
}
},
container.get(ViewResources)
);
const view = viewFactory.create(container);
expect(view.bindings).toBeDefined();
expect(view.bindings.length).toBe(1, 'It should have had 1 binding');
const target = binding.target;
expect(target instanceof Element).toBe(true, 'It should have had the target');
expect(target.className).toBe('au-target');
});
describe('<let/>', () => {
it('creates with <let/>', () => {
const binding = {};
const unset = {};
viewFactory = new ViewFactory(
createFragment(`<let class="au-target" au-target-id="1"></let>`),
{
1: TargetInstruction.letElement([
{ createBinding(target) {
binding.target = arguments.length === 0 ? unset : target;
return binding;
}}
])
},
container.get(ViewResources)
);
const view = viewFactory.create(container);
expect(view.bindings).toBeDefined();
expect(view.bindings.length).toBe(1, 'It should have had 1 binding');
const target = binding.target;
expect(target).toBe(unset, 'It should have had no target in createBinding()');
expect(view.firstChild).toBe(null, '<let/> element should have been removed');
});
it('creates with multiple <let/>', () => {
const binding = {};
const unset = {};
viewFactory = new ViewFactory(
createFragment(`
<let class="au-target" au-target-id="1"></let>
<div>
<let class="au-target" au-target-id="2"></let>
</div>
<div>
<let class="au-target" au-target-id="3"></let>
</div>
`),
{
1: TargetInstruction.letElement([
createLetExpression({ a: 1 })
]),
2: TargetInstruction.letElement([
createLetExpression({ a: 2 })
]),
3: TargetInstruction.letElement([
createLetExpression({ a: 3 })
]),
},
container.get(ViewResources)
);
const view = viewFactory.create(container);
expect(view.bindings).toBeDefined();
expect(view.bindings.length).toBe(3, 'It should have had 1 binding');
expect(view.bindings.every(b => 'a' in b)).toBe(true, 'It should have created multiple let bindings');
});
});
function createLetExpression(binding) {
return { createBinding() { return binding } };
}
});
});