index.test.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. var assert = require('assert');
  3. var utils = require('util');
  4. var attrs = require('../');
  5. var options;
  6. function test(input, expected, locals) {
  7. var opts = options;
  8. locals = locals || {};
  9. locals.pug = locals.pug || require('pug-runtime');
  10. it(utils.inspect(input).replace(/\n/g, '') + ' => ' + utils.inspect(expected), function () {
  11. var src = attrs(input, opts);
  12. var localKeys = Object.keys(locals).sort();
  13. var output = Function(localKeys.join(', '), 'return (' + src + ');').apply(null, localKeys.map(function (key) { return locals[key]; }));
  14. if (opts.format === 'html') {
  15. expect(output).toBe(expected);
  16. } else {
  17. expect(output).toEqual(expected);
  18. }
  19. });
  20. }
  21. function withOptions(opts, fn) {
  22. describe('options: ' + utils.inspect(opts), function () {
  23. options = opts;
  24. fn();
  25. });
  26. }
  27. withOptions({terse: true, format: 'html', runtime: function (name) { return 'pug.' + name; }}, function () {
  28. test([], '');
  29. test([{name: 'foo', val: 'false', mustEscape: true}], '');
  30. test([{name: 'foo', val: 'true', mustEscape: true}], ' foo');
  31. test([{name: 'foo', val: false, mustEscape: true}], '');
  32. test([{name: 'foo', val: true, mustEscape: true}], ' foo');
  33. test([{name: 'foo', val: 'foo', mustEscape: true}], '', {foo: false});
  34. test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo', {foo: true});
  35. test([{name: 'foo', val: '"foo"', mustEscape: true}], ' foo="foo"');
  36. test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'bar', val: '"bar"', mustEscape: true}], ' foo="foo" bar="bar"');
  37. test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo="fooo"', {foo: 'fooo'});
  38. test([{name: 'foo', val: 'foo', mustEscape: true}, {name: 'bar', val: 'bar', mustEscape: true}], ' foo="fooo" bar="baro"', {foo: 'fooo', bar: 'baro'});
  39. test([{name: 'style', val: '{color: "red"}', mustEscape: true}], ' style="color:red;"');
  40. test([{name: 'style', val: '{color: color}', mustEscape: true}], ' style="color:red;"', {color: 'red'});
  41. test([{name: 'class', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="foo bar baz"');
  42. test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="foo bar baz"', {foo: true});
  43. test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="bar baz"', {foo: false});
  44. test([{name: 'class', val: 'foo', mustEscape: true}, {name: 'class', val: '"<str>"', mustEscape: true}], ' class="&lt;foo&gt; &lt;str&gt;"', {foo: '<foo>'});
  45. test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="bar baz" foo="foo"');
  46. test([{name: 'class', val: '["bar", "baz"]', mustEscape: true}, {name: 'foo', val: '"foo"', mustEscape: true}], ' class="bar baz" foo="foo"');
  47. test([{name: 'foo', val: '"<foo>"', mustEscape: false}], ' foo="<foo>"');
  48. test([{name: 'foo', val: '"<foo>"', mustEscape: true}], ' foo="&lt;foo&gt;"');
  49. test([{name: 'foo', val: 'foo', mustEscape: false}], ' foo="<foo>"', {foo: '<foo>'});
  50. test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo="&lt;foo&gt;"', {foo: '<foo>'});
  51. });
  52. withOptions({terse: false, format: 'html', runtime: function (name) { return 'pug.' + name; }}, function () {
  53. test([{name: 'foo', val: 'false', mustEscape: true}], '');
  54. test([{name: 'foo', val: 'true', mustEscape: true}], ' foo="foo"');
  55. test([{name: 'foo', val: false, mustEscape: true}], '');
  56. test([{name: 'foo', val: true, mustEscape: true}], ' foo="foo"');
  57. test([{name: 'foo', val: 'foo', mustEscape: true}], '', {foo: false});
  58. test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo="foo"', {foo: true});
  59. });
  60. withOptions({terse: true, format: 'object', runtime: function (name) { return 'pug.' + name; }}, function () {
  61. test([], {});
  62. test([{name: 'foo', val: 'false', mustEscape: true}], {foo: false});
  63. test([{name: 'foo', val: 'true', mustEscape: true}], {foo: true});
  64. test([{name: 'foo', val: false, mustEscape: true}], {foo: false});
  65. test([{name: 'foo', val: true, mustEscape: true}], {foo: true});
  66. test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: false}, {foo: false});
  67. test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: true}, {foo: true});
  68. test([{name: 'foo', val: '"foo"', mustEscape: true}], {foo: 'foo'});
  69. test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'bar', val: '"bar"', mustEscape: true}], {foo: 'foo', bar: 'bar'});
  70. test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: 'fooo'}, {foo: 'fooo'});
  71. test([{name: 'foo', val: 'foo', mustEscape: true}, {name: 'bar', val: 'bar', mustEscape: true}], {foo: 'fooo', bar: 'baro'}, {foo: 'fooo', bar: 'baro'});
  72. test([{name: 'style', val: '{color: "red"}', mustEscape: true}], {style: 'color:red;'});
  73. test([{name: 'style', val: '{color: color}', mustEscape: true}], {style: 'color:red;'}, {color: 'red'});
  74. test([{name: 'class', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'foo bar baz'});
  75. test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'foo bar baz'}, {foo: true});
  76. test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'bar baz'}, {foo: false});
  77. test([{name: 'class', val: 'foo', mustEscape: true}, {name: 'class', val: '"<str>"', mustEscape: true}], {'class': '&lt;foo&gt; &lt;str&gt;'}, {foo: '<foo>'});
  78. test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'bar baz', foo: 'foo'});
  79. test([{name: 'class', val: '["bar", "baz"]', mustEscape: true}, {name: 'foo', val: '"foo"', mustEscape: true}], {'class': 'bar baz', foo: 'foo'});
  80. test([{name: 'foo', val: '"<foo>"', mustEscape: false}], {foo: "<foo>"});
  81. test([{name: 'foo', val: '"<foo>"', mustEscape: true}], {foo: "&lt;foo&gt;"});
  82. test([{name: 'foo', val: 'foo', mustEscape: false}], {foo: "<foo>"}, {foo: '<foo>'});
  83. test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: "&lt;foo&gt;"}, {foo: '<foo>'});
  84. });
  85. withOptions({terse: false, format: 'object', runtime: function (name) { return 'pug.' + name; }}, function () {
  86. test([{name: 'foo', val: 'false', mustEscape: true}], {foo: false});
  87. test([{name: 'foo', val: 'true', mustEscape: true}], {foo: true});
  88. test([{name: 'foo', val: false, mustEscape: true}], {foo: false});
  89. test([{name: 'foo', val: true, mustEscape: true}], {foo: true});
  90. test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: false}, {foo: false});
  91. test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: true}, {foo: true});
  92. });