icloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsapp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
658 lines
24 KiB
658 lines
24 KiB
describe("Ext.Template", function() { |
|
|
|
describe("instantiation", function() { |
|
var tpl; |
|
|
|
it("it should extend Ext.Base", function() { |
|
tpl = new Ext.Template(""); |
|
expect(tpl.superclass).toEqual(Ext.Base.prototype); |
|
}); |
|
|
|
describe("configuration options", function() { |
|
it("should disableFormats by default", function() { |
|
tpl = new Ext.Template(""); |
|
expect(tpl.disableFormats).toBe(false); |
|
}); |
|
}); |
|
|
|
it("should alias apply with applyTemplate", function() { |
|
tpl = new Ext.Template(""); |
|
|
|
spyOn(tpl, 'apply'); |
|
|
|
tpl.applyTemplate(); |
|
|
|
expect(tpl.apply).toHaveBeenCalled(); |
|
}); |
|
|
|
it("should be able to compile immediately", function() { |
|
spyOn(Ext.Template.prototype, "compile").andCallThrough(); |
|
|
|
tpl = new Ext.Template('Hello {foo}', { |
|
compiled: true |
|
}); |
|
// must call the new tpl for it bother compiling it |
|
var s = tpl.apply({ foo: 42 }); |
|
|
|
expect(s).toBe('Hello 42'); |
|
expect(Ext.Template.prototype.compile).toHaveBeenCalled(); |
|
}); |
|
|
|
describe("constructor arguments", function() { |
|
describe("objects", function() { |
|
it("should apply all object passed after first arguments to configuration", function() { |
|
var o1 = {a: 1}, |
|
o2 = {a: 2}, |
|
o3 = {a: 3}; |
|
|
|
spyOn(Ext, "apply"); |
|
|
|
tpl = new Ext.Template("", o1, o2, o3); |
|
|
|
expect(Ext.apply.calls[1].args).toEqual([tpl, o1]); |
|
expect(Ext.apply.calls[3].args).toEqual([tpl, o2]); |
|
expect(Ext.apply.calls[5].args).toEqual([tpl, o3]); |
|
}); |
|
}); |
|
|
|
describe("strings", function() { |
|
it("should concat all strings passed as arguments", function() { |
|
var s1 = 'a', |
|
s2 = 'b', |
|
s3 = 'c'; |
|
|
|
tpl = new Ext.Template(s1, s2, s3); |
|
|
|
expect(tpl.html).toEqual(s1 + s2 + s3); |
|
}); |
|
}); |
|
|
|
describe("array", function(){ |
|
it("should concat all array strings", function(){ |
|
var tpl = new Ext.Template(['foo', 'bar', 'baz']); |
|
expect(tpl.html).toBe('foobarbaz'); |
|
}); |
|
|
|
it("should apply an objects after the first argument to the template", function(){ |
|
var o1 = { |
|
a: function(){} |
|
}, o2 = { |
|
b: function(){} |
|
}; |
|
|
|
var tpl = new Ext.Template(['foo', 'bar', o1, o2]); |
|
expect(tpl.html).toBe('foobar'); |
|
expect(tpl.a).toBe(o1.a); |
|
expect(tpl.b).toBe(o2.b); |
|
}); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("methods", function() { |
|
var appliedArr, |
|
appliedObject, |
|
simpleTpl, |
|
complexTpl, |
|
rootEl, |
|
childEl, |
|
simpleTplEl, |
|
complexTplEl; |
|
|
|
beforeEach(function() { |
|
rootEl = Ext.fly(document.body).createChild({cls: "foo", children: [{cls: "bar"}]}); |
|
childEl = rootEl.first(); |
|
|
|
simpleTpl = new Ext.Template('<div class="template">Hello {0}.</div>'); |
|
appliedArr = ["world"]; |
|
|
|
complexTpl = new Ext.Template([ |
|
'<div name="{id}">', |
|
'<span class="{cls}">{name} {value:ellipsis(10)}</span>', |
|
'</div>' |
|
]); |
|
appliedObject = {id: "myid", cls: "myclass", name: "foo", value: "bar"}; |
|
spyOn(Ext, "getDom").andCallThrough(); |
|
}); |
|
|
|
afterEach(function() { |
|
rootEl.destroy(); |
|
childEl.destroy(); |
|
}); |
|
|
|
describe("append", function() { |
|
describe("with a simple template", function() { |
|
beforeEach(function() { |
|
simpleTplEl = simpleTpl.append(rootEl, ["world"], true); |
|
}); |
|
|
|
afterEach(function() { |
|
simpleTplEl.destroy(); |
|
}); |
|
|
|
it("should append the new node to the end of the specified element", function() { |
|
expect(simpleTplEl).toEqual(rootEl.last()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(simpleTplEl.dom).hasHTML('Hello world.'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(rootEl); |
|
}); |
|
}); |
|
|
|
describe("with a complex template", function() { |
|
beforeEach(function() { |
|
complexTplEl = complexTpl.append(rootEl, appliedObject, true); |
|
}); |
|
|
|
afterEach(function() { |
|
complexTplEl.destroy(); |
|
}); |
|
|
|
it("should append the new node to the end of the specified element", function() { |
|
expect(complexTplEl).toEqual(rootEl.last()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(complexTplEl.dom).hasHTML('<span class="myclass">foo bar</span>'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(rootEl); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("apply", function() { |
|
describe("with a simple template", function() { |
|
it("should apply the supplied value and return an HTML fragments", function() { |
|
expect(simpleTpl.apply(appliedArr)).toEqual('<div class="template">Hello world.</div>'); |
|
}); |
|
}); |
|
|
|
describe("with a complex template", function() { |
|
it("should apply the supplied value and return an HTML fragments", function() { |
|
expect(complexTpl.apply(appliedObject)).toEqual('<div name="myid"><span class="myclass">foo bar</span></div>'); |
|
}); |
|
}); |
|
|
|
}); |
|
|
|
describe("insertAfter", function() { |
|
describe("with a simple template", function() { |
|
beforeEach(function() { |
|
simpleTplEl = simpleTpl.insertAfter(childEl, ["world"], true); |
|
}); |
|
|
|
afterEach(function() { |
|
simpleTplEl.destroy(); |
|
}); |
|
|
|
it("should insert the new node after the specified element", function() { |
|
expect(simpleTplEl).toEqual(childEl.next()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(simpleTplEl.dom).hasHTML('Hello world.'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(childEl); |
|
}); |
|
}); |
|
|
|
describe("with a complex template", function() { |
|
beforeEach(function() { |
|
complexTplEl = complexTpl.insertAfter(childEl, appliedObject, true); |
|
}); |
|
|
|
afterEach(function() { |
|
complexTplEl.destroy(); |
|
}) |
|
|
|
it("should insert the new node after the specified element", function() { |
|
expect(complexTplEl).toEqual(childEl.next()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(complexTplEl.dom).hasHTML('<span class="myclass">foo bar</span>'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(childEl); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("insertBefore", function() { |
|
describe("with a simple template", function() { |
|
beforeEach(function() { |
|
simpleTplEl = simpleTpl.insertBefore(childEl, ["world"], true); |
|
}); |
|
|
|
afterEach(function() { |
|
simpleTplEl.destroy(); |
|
}); |
|
|
|
it("should insert the new node before the specified element", function() { |
|
expect(simpleTplEl).toEqual(childEl.prev()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(simpleTplEl.dom).hasHTML('Hello world.'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(childEl); |
|
}); |
|
}); |
|
|
|
describe("with a complex template", function() { |
|
beforeEach(function() { |
|
complexTplEl = complexTpl.insertBefore(childEl, appliedObject, true); |
|
}); |
|
|
|
afterEach(function() { |
|
complexTplEl.destroy(); |
|
}); |
|
|
|
it("should insert the new node before the specified element", function() { |
|
expect(complexTplEl).toEqual(childEl.prev()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(complexTplEl.dom).hasHTML('<span class="myclass">foo bar</span>'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(childEl); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("insertFirst", function() { |
|
describe("with a simple template", function() { |
|
beforeEach(function() { |
|
simpleTplEl = simpleTpl.insertFirst(rootEl, ["world"], true); |
|
}); |
|
|
|
afterEach(function() { |
|
simpleTplEl.destroy(); |
|
}); |
|
|
|
it("should insert the new node as first child of the specified element", function() { |
|
expect(simpleTplEl).toEqual(rootEl.first()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(simpleTplEl.dom).hasHTML('Hello world.'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(rootEl); |
|
}); |
|
}); |
|
|
|
describe("with a complex template", function() { |
|
beforeEach(function() { |
|
complexTplEl = complexTpl.insertFirst(rootEl, appliedObject, true); |
|
}); |
|
|
|
afterEach(function() { |
|
complexTplEl.destroy(); |
|
}); |
|
|
|
it("should insert the new node as first child of the specified element", function() { |
|
expect(complexTplEl).toEqual(rootEl.first()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(complexTplEl.dom).hasHTML('<span class="myclass">foo bar</span>'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(rootEl); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("overwrite", function() { |
|
describe("with a simple template", function() { |
|
beforeEach(function() { |
|
simpleTplEl = simpleTpl.overwrite(rootEl, ["world"], true); |
|
}); |
|
|
|
afterEach(function() { |
|
simpleTplEl.destroy(); |
|
}); |
|
|
|
it("should overrride the content of the specified element", function() { |
|
expect(simpleTplEl).toEqual(rootEl.first()); |
|
expect(simpleTplEl).toEqual(rootEl.last()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(simpleTplEl.dom).hasHTML('Hello world.'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(rootEl); |
|
}); |
|
}); |
|
|
|
describe("with a complex template", function() { |
|
beforeEach(function() { |
|
complexTplEl = complexTpl.overwrite(rootEl, appliedObject, true); |
|
}); |
|
|
|
afterEach(function() { |
|
complexTplEl.destroy(); |
|
}); |
|
|
|
it("should overrride the content of the specified element", function() { |
|
expect(complexTplEl).toEqual(rootEl.first()); |
|
expect(complexTplEl).toEqual(rootEl.last()); |
|
}); |
|
|
|
it("should apply the supplied value to the template", function() { |
|
expect(complexTplEl.dom).hasHTML('<span class="myclass">foo bar</span>'); |
|
}); |
|
|
|
it("should call Ext.getDom", function() { |
|
expect(Ext.getDom).toHaveBeenCalledWith(rootEl); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("overwrite a table element", function() { |
|
var table; |
|
|
|
beforeEach(function() { |
|
table = Ext.fly(document.body).createChild({tag:'table'}); |
|
}); |
|
|
|
afterEach(function() { |
|
table.destroy(); |
|
}); |
|
|
|
it("should insert table structure into a table", function() { |
|
new Ext.Template('<tr><td>text</td></tr>').overwrite(table); |
|
|
|
var innerHTML = table.dom.innerHTML; |
|
|
|
if (Ext.isSafari4) { |
|
// Old Safari doesn't inject the tbody but the table row is created successfully |
|
expect(innerHTML).toEqual("<tr><td>text</td></tr>"); |
|
} |
|
else { |
|
expect(innerHTML.toLowerCase().replace(/\s/g, '')).toEqual("<tbody><tr><td>text</td></tr></tbody>"); |
|
} |
|
}); |
|
}); |
|
|
|
describe("set", function() { |
|
var tplString = '<div class="template">Good bye {0}.</div>'; |
|
|
|
it("should set the HTML used as the template", function() { |
|
simpleTpl.set(tplString); |
|
|
|
expect(simpleTpl.apply(["world"])).toEqual('<div class="template">Good bye world.</div>'); |
|
}); |
|
|
|
it("should be able to compile the template", function() { |
|
simpleTpl.set(tplString, true); |
|
var s = simpleTpl.apply([42]); |
|
|
|
// must call the new tpl for it bother compiling it |
|
expect(s).toBe('<div class="template">Good bye 42.</div>'); |
|
expect(typeof simpleTpl.fn === "function").toBe(true); |
|
}); |
|
}); |
|
|
|
describe("compile", function() { |
|
it("should call compiled function", function() { |
|
complexTpl.compile(); |
|
|
|
spyOn(complexTpl, "fn").andCallThrough(); |
|
|
|
complexTpl.apply(appliedObject); |
|
|
|
expect(complexTpl.fn).toHaveBeenCalledWith(appliedObject); |
|
}); |
|
|
|
it("should return the same value as if it wasn't compiled with a complex template", function() { |
|
var htmlWithNotCompiledTemplate, |
|
htmlWithCompiledTemplate; |
|
htmlWithNotCompiledTemplate = complexTpl.apply(appliedObject); |
|
complexTpl.compile(); |
|
htmlWithCompiledTemplate = complexTpl.apply(appliedObject); |
|
|
|
expect(htmlWithCompiledTemplate).toEqual(htmlWithNotCompiledTemplate); |
|
}); |
|
|
|
it("should return the same value as if it wasn't compiled with a simple template", function() { |
|
var htmlWithNotCompiledTemplate, |
|
htmlWithCompiledTemplate; |
|
|
|
htmlWithNotCompiledTemplate = simpleTpl.apply(appliedArr); |
|
simpleTpl.compile(); |
|
htmlWithCompiledTemplate = simpleTpl.apply(appliedArr); |
|
|
|
expect(htmlWithCompiledTemplate).toEqual(htmlWithNotCompiledTemplate); |
|
}); |
|
|
|
it("should return the template itself", function() { |
|
expect(simpleTpl.compile()).toEqual(simpleTpl); |
|
}); |
|
|
|
}); |
|
}); |
|
|
|
describe("formats", function() { |
|
var tpl, |
|
ellipsisSpy, |
|
htmlEncodeSpy, |
|
appliedObject; |
|
|
|
beforeEach(function() { |
|
appliedObject = {a: "123", b: "456789"}; |
|
|
|
ellipsisSpy = spyOn(Ext.util.Format, "ellipsis"); |
|
htmlEncodeSpy = spyOn(Ext.util.Format, "htmlEncode"); |
|
}); |
|
|
|
describe("enabled", function() { |
|
beforeEach(function() { |
|
tpl = new Ext.Template( |
|
'{a:ellipsis(2)}', |
|
'{b:htmlEncode}' |
|
); |
|
}); |
|
|
|
it("should call Ext.util.Format.ellipsis with a non compiled template", function() { |
|
tpl.apply(appliedObject); |
|
|
|
expect(ellipsisSpy).toHaveBeenCalledWith(appliedObject.a, 2); |
|
expect(htmlEncodeSpy).toHaveBeenCalledWith(appliedObject.b); |
|
}); |
|
|
|
it("should call Ext.util.Format.ellipsis with compiled template", function() { |
|
tpl.compile(); |
|
tpl.apply(appliedObject); |
|
|
|
expect(ellipsisSpy).toHaveBeenCalledWith(appliedObject.a, 2); |
|
expect(htmlEncodeSpy).toHaveBeenCalledWith(appliedObject.b); |
|
}); |
|
}); |
|
|
|
describe("disabled", function() { |
|
beforeEach(function() { |
|
tpl = new Ext.Template( |
|
'{a:ellipsis(2)}', |
|
{disableFormats: true} |
|
); |
|
}); |
|
|
|
it("should not call Ext.util.Format.ellipsis with a non compiled template", function() { |
|
tpl.apply(appliedObject); |
|
|
|
expect(ellipsisSpy).not.toHaveBeenCalled(); |
|
}); |
|
|
|
it("should not call Ext.util.Format.ellipsis with compiled template", function() { |
|
tpl.compile(); |
|
tpl.apply(appliedObject); |
|
|
|
expect(ellipsisSpy).not.toHaveBeenCalled(); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("members functions", function() { |
|
var tpl, |
|
memberFn, |
|
appliedObject; |
|
|
|
beforeEach(function() { |
|
memberFn = jasmine.createSpy().andCallFake(function(a, inc) { |
|
return a + inc; |
|
}); |
|
|
|
var obj = { |
|
referenceHolder: true, |
|
controller: 'foo', |
|
|
|
fmt: function () { |
|
|
|
}, |
|
promote: function () { |
|
// |
|
}, |
|
|
|
items: [{ |
|
items: [{ |
|
xtype: 'button', |
|
reference: 'btn', |
|
listeners: { |
|
click: 'promote' |
|
}, |
|
bind: { |
|
text: 'Promote {user.name:this.fmt}' |
|
} |
|
}] |
|
}] |
|
} |
|
|
|
tpl = new Ext.Template( |
|
'{a:this.increment(7)}', |
|
{increment: memberFn} |
|
); |
|
|
|
appliedObject = {a: 1}; |
|
}); |
|
|
|
it("should call members functions with a non compiled template", function() { |
|
tpl.apply(appliedObject); |
|
expect(memberFn).toHaveBeenCalledWith(1, 7); |
|
}); |
|
|
|
it("should call members functions with a compiled template", function() { |
|
tpl.compile(); |
|
tpl.apply(appliedObject); |
|
expect(memberFn).toHaveBeenCalledWith(1, 7); |
|
}); |
|
|
|
it("should add member function in initialConfig", function() { |
|
expect(tpl.initialConfig).toEqual({increment: memberFn}); |
|
}); |
|
}); |
|
|
|
describe("Ext.Template.from", function() { |
|
var elWithHtml, elWithValue; |
|
|
|
beforeEach(function() { |
|
elWithHtml = Ext.fly(document.body).createChild({tag: "div", html:"FOO {0}."}); |
|
elWithValue = Ext.fly(document.body).createChild({tag: "input"}); |
|
elWithValue.dom.value = "BAR {0}."; |
|
|
|
}); |
|
|
|
afterEach(function() { |
|
elWithHtml.remove(); |
|
elWithValue.remove(); |
|
}); |
|
|
|
it("should create a template with dom element innerHTML", function() { |
|
var tpl = Ext.Template.from(elWithHtml); |
|
|
|
expect(tpl.apply(['BAR'])).toEqual('FOO BAR.'); |
|
}); |
|
|
|
it("should create a template with dom element value", function() { |
|
var tpl = Ext.Template.from(elWithValue); |
|
|
|
expect(tpl.apply(['FOO'])).toEqual('BAR FOO.'); |
|
}); |
|
}); |
|
|
|
function testTemplate(compiled) { |
|
describe('Using numeric tokens and a values array', function() { |
|
it('should use Ext.util.Format formatting functions by default', function() { |
|
expect(new Ext.Template('Value: {0:number("0.00")}', {compiled: compiled}).apply([3.257])).toBe("Value: 3.26"); |
|
}); |
|
it('should use member formatting functions when prepended with "this."', function() { |
|
var tpl = [ |
|
'Warning: {0:this.bold}', |
|
{ |
|
bold: function(v){ |
|
return '<b>' + v + '</b>'; |
|
}, |
|
compiled: compiled |
|
} |
|
]; |
|
expect(new Ext.Template(tpl).apply(['Warning message'])).toBe("Warning: <b>Warning message</b>"); |
|
}); |
|
it('should not see "{margin:0} as a token', function() { |
|
expect(new Ext.Template('p{margin:0}body{direction:{0}}', {compiled: compiled}).apply(['rtl'])).toBe('p{margin:0}body{direction:rtl}'); |
|
}); |
|
it('should not see "{1:someText} as a token', function() { |
|
expect(new Ext.Template('{0}{1:sometext}{1}', {compiled: compiled}).apply(['foo', 'bar'])).toBe('foo{1:sometext}bar'); |
|
}); |
|
}); |
|
|
|
describe('Using alphanumeric tokens and a values object', function() { |
|
it('should use Ext.util.Format formatting functions by default', function() { |
|
expect(new Ext.Template('Value: {prop0:number("0.00")}', {compiled: compiled}).apply({prop0:3.257})).toBe("Value: 3.26"); |
|
}); |
|
it('should use member formatting functions when prepended with "this."', function() { |
|
var tpl = [ |
|
'Warning: {prop0:this.bold}', |
|
{ |
|
bold: function(v){ |
|
return '<b>' + v + '</b>'; |
|
}, |
|
compiled: compiled |
|
} |
|
] |
|
expect(new Ext.Template(tpl).apply({prop0:'Warning message'})).toBe("Warning: <b>Warning message</b>"); |
|
}); |
|
it('should not see "{margin:0} as a token', function() { |
|
expect(new Ext.Template('p{margin:0}body{direction:{prop0}}', {compiled: compiled}).apply({prop0:'rtl'})).toBe('p{margin:0}body{direction:rtl}'); |
|
}); |
|
it('should not see "{1:someText} as a token', function() { |
|
expect(new Ext.Template('{prop0}{1:sometext}{prop1}', {compiled: compiled}).apply({prop0:'foo', prop1:'bar'})).toBe('foo{1:sometext}bar'); |
|
}); |
|
}); |
|
} |
|
|
|
describe('Non-compiled', function() { |
|
testTemplate(false); |
|
}); |
|
|
|
describe('Compiled', function() { |
|
testTemplate(true); |
|
}); |
|
});
|
|
|