ractive
Version:
Next-generation DOM manipulation
223 lines (155 loc) • 5.51 kB
JavaScript
define([
'config/options/template/template',
'utils/isObject',
'utils/create'
],
function (
config,
isObject,
create
) {
'use strict';
return function () {
var Ractive, Component, ractive,
templateOpt1 = { template: '{{foo}}' },
templateOpt2 = { template: '{{bar}}' },
templateOpt1fn = { template: () => templateOpt1.template },
moduleSetup = {
setup: function(){
//Ractive = { defaults: {}, parseOptions: {} };
ractive = { _config: {} };
// bootstrap mock Ractive
Ractive = function () {};
Ractive.prototype = { template: {v:1,t:[]} };
Ractive.defaults = Ractive.prototype;
Component = function() {};
Component.prototype = create( Ractive.prototype );
Component.prototype.constructor = Component;
Component.defaults = Component.prototype;
},
teardown: function(){
}
};
function mockExtend( template ){
config.extend( Ractive, Component.prototype, template || {} );
}
module( 'Template Configuration', moduleSetup);
function testDefault( template ) {
ok( template, 'on defaults' );
ok( isObject(template), 'isObject' );
ok( template.v, 'has version' );
ok( template.t, 'has main template' );
equal( template.t.length, 0, 'main template has no items' );
}
function testTemplate1( template ) {
deepEqual( template, [ { r: 'foo', t: 2 } ] );
}
function testTemplate2( template ) {
deepEqual( template, [ { r: 'bar', t: 2 } ] );
}
function testComponentTemplate1( template ) {
deepEqual( template, {v:1,t:[ { r: 'foo', t: 2 } ]} );
}
function testComponentTemplate2( template ) {
deepEqual( template, {v:1,t:[ { r: 'bar', t: 2 } ]} );
}
test( 'Default create', t => {
testDefault( Ractive.defaults.template );
});
test( 'Empty extend inherits parent', t => {
mockExtend();
testDefault( Component.defaults.template )
});
test( 'Extend with template', t => {
mockExtend( templateOpt1 );
testComponentTemplate1( Component.defaults.template );
});
test( 'Extend twice with different templates', t => {
config.extend( Ractive, Component.prototype, templateOpt1 );
var Child = create( Component );
config.extend( Component, Child.prototype, templateOpt2 );
testComponentTemplate2( Child.prototype.template );
});
test( 'Init template', t => {
config.init( Ractive, ractive, templateOpt1 );
t.ok( !ractive.defaults );
testTemplate1( ractive.template );
});
test( 'Init with pure string template', t => {
config.init( Ractive, ractive, { template: 'foo' } );
t.equal( ractive.template, 'foo' );
});
test( 'Init take precedence over default', t => {
config.extend( Ractive, Component.prototype, templateOpt1 );
config.init( Component, ractive, templateOpt2 );
testTemplate2( ractive.template );
});
test( 'Extend with template function', t => {
config.extend( Ractive, Component.prototype, templateOpt1fn );
config.init( Component, ractive, {} );
testTemplate1( ractive.template );
});
test( 'Extend uses child parse options', t => {
Component.defaults.delimiters = [ '<#', '#>' ];
config.extend( Ractive, Component.prototype, { template: '<#foo#>' } );
config.init( Component, ractive, {} );
testTemplate1( ractive.template );
});
test( 'Init with template function', t => {
config.init( Ractive, ractive, templateOpt1fn );
testTemplate1( ractive.template );
});
// test( 'Overwrite before init', t => {
// Ractive.defaults.template = templateOpt1.template;
// config.init( Ractive, ractive );
// testTemplate1( ractive.template );
// });
test( 'Overwrite after extend before init', t => {
config.extend( Ractive, Component.prototype, templateOpt1 );
Component.defaults.template = templateOpt2.template;
config.init( Component, ractive, {} );
testTemplate2( ractive.template );
});
test( 'Template function arguments and this', t => {
ractive.data = { good: true };
config.init( Ractive, ractive, {
template: function( data, parser ){
t.equal( this, ractive );
t.ok( parser.parse );
return ( data.good ? templateOpt1 : templateOpt2).template;
}
});
testTemplate1( ractive.template );
});
module( 'Template Configuration', moduleSetup);
test( 'Template with partial', t => {
ractive.partials = {};
config.init( Ractive, ractive, {
template: '{{foo}}<!-- {{>bar}} -->{{bar}}<!-- {{/bar}} -->'
});
testTemplate1( ractive.template );
t.ok( ractive.partials.bar );
testTemplate2( ractive.partials.bar)
});
test( 'Template with partial extended', t => {
var options = { template: '{{foo}}<!-- {{>bar}} -->{{bar}}<!-- {{/bar}} -->' };
Component.partials = {};
config.extend( Ractive, Component.prototype, options );
deepEqual( Component.defaults.template, { v: 1, t: [{r: "foo", t: 2 } ], p: {bar: [{r: "bar", t: 2 } ] } });
});
test( 'Template with partial added and takes precedence over option partials', t => {
ractive.partials = {
bar: '{{bop}}',
bizz: '{{buzz}}'
};
config.init( Ractive, ractive, {
template: '{{foo}}<!-- {{>bar}} -->{{bar}}<!-- {{/bar}} -->'
});
t.ok( ractive.partials.bar, 'has bar partial' );
t.ok( ractive.partials.bizz, 'has bizz partial' );
// Commenting out - surely {{bop}} doesn't need to be parsed yet?
// testTemplate2( ractive.partials.bar, 'has correct bar partial')
delete ractive.partials;
});
}
});