UNPKG

xtemplate

Version:

eXtensible Template Engine lib on browser and nodejs. support async control, inheritance, include, logic expression, custom function and more.

414 lines (317 loc) 10.7 kB
/** * test common feature for xtemplate * @author yiminghe@gmail.com */ var XTemplate = require('xtemplate'); var util = require('./util'); describe('feature', function () { it('support {{%%}}', function () { var tpl = '{{%{{my}}%}}'; var render = new XTemplate(tpl).render({ my: 1 }); expect(render).to.equal('{{my}}'); tpl = '{{%%}}'; render = new XTemplate(tpl).render({ my: 1 }); expect(render).to.equal(''); }); it('not allow empty content', function () { var tpl = ''; var data = { title: 'o' }; try { new XTemplate(tpl, { name: 'tpl-empty-content' }).render(data); } catch (e) { expect(e.message.indexOf('syntax error') !== -1).to.be(true); } }); it('support {{variable}}', function () { var tpl = 'this is class="t" {{title}}!'; var data = { title: 'o' }; var render = new XTemplate(tpl, { name: 'tpl-variable' }).render(data); expect(render).to.equal('this is class="t" o!'); }); it('support double quote in content', function () { var tpl = '<a href="www.g.cn"></a>'; var render = new XTemplate(tpl).render({}); expect(render).to.equal('<a href="www.g.cn"></a>'); }); describe('property', function () { it('support sub property', function () { var tpl = '{{data.x}}'; var data = { data: { x: 1 } }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('1'); }); it('will render empty instead of undefined', function () { var tpl = '{{data.x}}'; var data = { data: { p: 1 } }; var render = new XTemplate(tpl).render(data); expect(render).to.equal(''); }); it('support array index', function () { var tpl = '{{data[1][1]}}'; var data = { data: [1, [3, 2]] }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('2'); }); }); it('support variable as index', function () { var tpl = '{{data[d]}}'; var data = { data: { my: 1 }, d: 'my' }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('1'); }); it('support express as index', function () { var tpl = '{{data["m"+"y"]}}'; var data = { data: { my: 1 }, d: 'my' }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('1'); }); describe('negative number and minus', function () { it('support 0-1', function () { var tpl = '{{#if( n===0-1)}}-1{{else}}1{{/if}}'; var data = { n: -1 }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('-1'); tpl = '{{#if (n===1)}}-1{{else}}1{{/if}}'; data = { n: 1 }; try { new XTemplate(tpl).render(data); } catch (e) { expect(e.message.indexOf('Syntax error') > -1).to.equalTruthy(); } }); it('support simple -1', function () { var tpl = '{{-1}}'; var render = new XTemplate(tpl).render(); expect(render).to.equal('-1'); }); it('support -1', function () { var tpl = '{{#if( n===-1)}}-1{{else}}1{{/if}}'; var data = { n: -1 }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('-1'); }); }); describe('with', function () { it('support object in with', function () { var tpl = '{{#with (data)}}{{name}}-{{age}}{{/with}}'; var data = { data: { name: 'h', age: 2 } }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('h-2'); }); it('this will prevent up resolve',function(){ var tpl ='{{#with(t)}}{{#with(t2)}}{{#with(t3)}}{{../this.tt}}{{/with}}{{/with}}{{/with}}'; var data = {t:{tt:1,t2:{t3:{tt:3}}}}; var render = new XTemplate(tpl).render(data); expect(render).to.equal(''); }); }); describe('parent scope', function () { it('support access root scope', function () { var tpl = '{{#each (children)}}' + '{{name}}{{root.name}}' + '{{/each}}'; var data = { name: 'x', children: [ { name: 'x1' }, { name: 'x2' } ] }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('x1xx2x'); }); // https://github.com/kissyteam/kissy/issues/517 it('this will prevent scope finding', function () { var ret = new XTemplate('{{a}}^{{#each (b)}}|{{this.a}}{{/each}}$').render({ a: 1, b: [ { a: 2 }, {} ] }); expect(ret).to.equal('1^|2|$'); }); it('support for with', function () { var tpl = '{{#with( data)}}' + '{{#with (p)}}' + '{{name}}-{{age}}-{{../l2}}-{{../../l1}}' + '{{/with}}' + '{{/with}}'; var data = { l1: 'l1', l2: 'l1_2', data: { l1: 'l2_1', l2: 'l2', p: { l1: 'l3_1', l2: 'l3_2', name: 'h', age: 2 } } }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('h-2-l2-l1'); }); it('support for each', function () { var tpl = '{{#each (data)}}{{this}}-{{../total}}|{{/each}}'; var data = { data: [1, 2], total: 3 }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('1-3|2-3|'); }); // it('support with and each', function () { var tpl = '{{#with (a)}}{{#each (b)}}{{this}}{{../x}}{{../../x}}{{/each}}{{/with}}'; var data = { a: { b: [1], x: 5 }, x: 6 }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('156'); }); }); it('support comment', function () { var tpl = 'my {{!\n' + 'comment' + '\n}} {{title}}'; var data = { title: 'oo' }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('my oo'); }); it('support set', function () { var tpl = '{{#each (data)}}' + '{{set (n2 = this*2, n3 = this*3)}}' + '{{n2}}-{{n3}}|' + '{{/each}}'; var data = { data: [1, 2] }; expect(new XTemplate(tpl).render(data)).to.equal('2-3|4-6|'); }); it('support set for this', function () { var tpl = '{{#each (data)}}' + '{{set (n2 = this*2, n3 = this*3)}}' + '{{this.n2}}-{{this.n3}}|' + '{{/each}}'; var data = { data: [1, 2] }; expect(new XTemplate(tpl).render(data)).to.equal('2-3|4-6|'); }); it('support set on top', function () { var tpl = '{{set(n=1)}}{{n}}'; expect(new XTemplate(tpl).render({})).to.equal('1'); }); it('support function as property value', function () { var tpl = '{{x.y(1,2)}}' + '{{#with(x)}}{{#with(z)}}{{../y(3,4)}}{{/with}}{{/with}}' + '{{#with(x)}}{{#with(z)}}{{../../x["y"](3,4)}}{{/with}}{{/with}}'; var render = new XTemplate(tpl).render({ x: { y: function (a, b) { return a + b + this.salt; }, salt: 1, z: { } } }); expect(render).to.equal('488'); }); it('support model object with function', function () { function Adder(cfg) { util.mix(this, cfg); } Adder.prototype.add = function (a, b) { return a + b + this.salt; }; var tpl = '{{x.add(1,2)}}'; var render = new XTemplate(tpl).render({ x: new Adder({ salt: 10 }) }); expect(render).to.equal('13'); }); describe('汉字', function () { it('允许汉字内容', function () { var tpl = '{{t}}出现了'; var data = { t: 1 }; var render = new XTemplate(tpl).render(data); expect(render).to.equal('1出现了'); }); it('允许汉字参数', function () { var tpl = '{{t("出现了")}}'; var data = { }; var render = new XTemplate(tpl, { commands: { t: function (scope, option) { return option.params[0]; } } }).render(data); expect(render).to.equal('出现了'); }); }); });