test.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /*
  2. * JavaScript Templates Test
  3. * https://github.com/blueimp/JavaScript-Templates
  4. *
  5. * Copyright 2011, Sebastian Tschan
  6. * https://blueimp.net
  7. *
  8. * Licensed under the MIT license:
  9. * http://www.opensource.org/licenses/MIT
  10. */
  11. /*global beforeEach, afterEach, describe, it, require */
  12. ;(function (context, expect, tmpl) {
  13. 'use strict'
  14. if (context.require === undefined) {
  15. // Override the template loading method:
  16. tmpl.load = function (id) {
  17. switch (id) {
  18. case 'template':
  19. return '{%=o.value%}'
  20. }
  21. }
  22. }
  23. var data
  24. beforeEach(function () {
  25. // Initialize the sample data:
  26. data = {
  27. value: 'value',
  28. nullValue: null,
  29. falseValue: false,
  30. zeroValue: 0,
  31. special: '<>&"\'\x00',
  32. list: [1, 2, 3, 4, 5],
  33. func: function () {
  34. return this.value
  35. },
  36. deep: {
  37. value: 'value'
  38. }
  39. }
  40. })
  41. afterEach(function () {
  42. // Purge the template cache:
  43. tmpl.cache = {}
  44. })
  45. describe('Template loading', function () {
  46. it('String template', function () {
  47. expect(
  48. tmpl('{%=o.value%}', data)
  49. ).to.be(
  50. 'value'
  51. )
  52. })
  53. it('Load template by id', function () {
  54. expect(
  55. tmpl('template', data)
  56. ).to.be(
  57. 'value'
  58. )
  59. })
  60. it('Retun function when called without data parameter', function () {
  61. expect(
  62. tmpl('{%=o.value%}')(data)
  63. ).to.be(
  64. 'value'
  65. )
  66. })
  67. it('Cache templates loaded by id', function () {
  68. tmpl('template')
  69. expect(
  70. tmpl.cache.template
  71. ).to.be.a('function')
  72. })
  73. })
  74. describe('Interpolation', function () {
  75. it('Escape HTML special characters with {%=o.prop%}', function () {
  76. expect(
  77. tmpl('{%=o.special%}', data)
  78. ).to.be(
  79. '&lt;&gt;&amp;&quot;&#39;'
  80. )
  81. })
  82. it('Allow HTML special characters with {%#o.prop%}', function () {
  83. expect(
  84. tmpl('{%#o.special%}', data)
  85. ).to.be(
  86. '<>&"\'\x00'
  87. )
  88. })
  89. it('Function call', function () {
  90. expect(
  91. tmpl('{%=o.func()%}', data)
  92. ).to.be(
  93. 'value'
  94. )
  95. })
  96. it('Dot notation', function () {
  97. expect(
  98. tmpl('{%=o.deep.value%}', data)
  99. ).to.be(
  100. 'value'
  101. )
  102. })
  103. it('Handle single quotes', function () {
  104. expect(
  105. tmpl('\'single quotes\'{%=": \'"%}', data)
  106. ).to.be(
  107. "'single quotes': &#39;"
  108. )
  109. })
  110. it('Handle double quotes', function () {
  111. expect(
  112. tmpl('"double quotes"{%=": \\""%}', data)
  113. ).to.be(
  114. '"double quotes": &quot;'
  115. )
  116. })
  117. it('Handle backslashes', function () {
  118. expect(
  119. tmpl('\\backslashes\\{%=": \\\\"%}', data)
  120. ).to.be(
  121. '\\backslashes\\: \\'
  122. )
  123. })
  124. it('Interpolate escaped falsy values except undefined or null', function () {
  125. expect(
  126. tmpl(
  127. '{%=o.undefinedValue%}' +
  128. '{%=o.nullValue%}' +
  129. '{%=o.falseValue%}' +
  130. '{%=o.zeroValue%}',
  131. data
  132. )
  133. ).to.be(
  134. 'false0'
  135. )
  136. })
  137. it('Interpolate unescaped falsy values except undefined or null', function () {
  138. expect(
  139. tmpl(
  140. '{%#o.undefinedValue%}' +
  141. '{%#o.nullValue%}' +
  142. '{%#o.falseValue%}' +
  143. '{%#o.zeroValue%}',
  144. data
  145. )
  146. ).to.be(
  147. 'false0'
  148. )
  149. })
  150. it('Preserve whitespace', function () {
  151. expect(
  152. tmpl(
  153. '\n\r\t{%=o.value%} \n\r\t{%=o.value%} ',
  154. data
  155. )
  156. ).to.be(
  157. '\n\r\tvalue \n\r\tvalue '
  158. )
  159. })
  160. })
  161. describe('Evaluation', function () {
  162. it('Escape HTML special characters with print(data)', function () {
  163. expect(
  164. tmpl('{% print(o.special); %}', data)
  165. ).to.be(
  166. '&lt;&gt;&amp;&quot;&#39;'
  167. )
  168. })
  169. it('Allow HTML special characters with print(data, true)', function () {
  170. expect(
  171. tmpl('{% print(o.special, true); %}', data)
  172. ).to.be(
  173. '<>&"\'\x00'
  174. )
  175. })
  176. it('Print out escaped falsy values except undefined or null', function () {
  177. expect(
  178. tmpl(
  179. '{% print(o.undefinedValue); %}' +
  180. '{% print(o.nullValue); %}' +
  181. '{% print(o.falseValue); %}' +
  182. '{% print(o.zeroValue); %}',
  183. data
  184. )
  185. ).to.be(
  186. 'false0'
  187. )
  188. })
  189. it('Print out unescaped falsy values except undefined or null', function () {
  190. expect(
  191. tmpl(
  192. '{% print(o.undefinedValue, true); %}' +
  193. '{% print(o.nullValue, true); %}' +
  194. '{% print(o.falseValue, true); %}' +
  195. '{% print(o.zeroValue, true); %}',
  196. data
  197. )
  198. ).to.be(
  199. 'false0'
  200. )
  201. })
  202. it('Include template', function () {
  203. expect(
  204. tmpl('{% include("template", {value: "value"}); %}', data)
  205. ).to.be(
  206. 'value'
  207. )
  208. })
  209. it('If condition', function () {
  210. expect(
  211. tmpl('{% if (o.value) { %}true{% } else { %}false{% } %}', data)
  212. ).to.be(
  213. 'true'
  214. )
  215. })
  216. it('Else condition', function () {
  217. expect(
  218. tmpl(
  219. '{% if (o.undefinedValue) { %}false{% } else { %}true{% } %}',
  220. data
  221. )
  222. ).to.be(
  223. 'true'
  224. )
  225. })
  226. it('For loop', function () {
  227. expect(
  228. tmpl(
  229. '{% for (var i=0; i<o.list.length; i++) { %}' +
  230. '{%=o.list[i]%}{% } %}',
  231. data
  232. )
  233. ).to.be(
  234. '12345'
  235. )
  236. })
  237. it('For loop print call', function () {
  238. expect(
  239. tmpl(
  240. '{% for (var i=0; i<o.list.length; i++) {' +
  241. 'print(o.list[i]);} %}',
  242. data
  243. )
  244. ).to.be(
  245. '12345'
  246. )
  247. })
  248. it('For loop include template', function () {
  249. expect(
  250. tmpl(
  251. '{% for (var i=0; i<o.list.length; i++) {' +
  252. 'include("template", {value: o.list[i]});} %}',
  253. data
  254. ).replace(/[\r\n]/g, '')
  255. ).to.be(
  256. '12345'
  257. )
  258. })
  259. it('Modulo operator', function () {
  260. expect(
  261. tmpl(
  262. '{% if (o.list.length % 5 === 0) { %}5 list items{% } %}',
  263. data
  264. ).replace(/[\r\n]/g, '')
  265. ).to.be(
  266. '5 list items'
  267. )
  268. })
  269. })
  270. }(
  271. this,
  272. this.expect || require('expect.js'),
  273. this.tmpl || require('../js/tmpl')
  274. ))