aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Duncan <pabs@pablotron.org>2018-09-09 03:50:48 -0400
committerPaul Duncan <pabs@pablotron.org>2018-09-09 03:50:48 -0400
commit2cff700e3e59adc2bfcd4b2c536675dfdeb96312 (patch)
treedfe4eb712a521e3a4bd5d4ae3113ab6f7053684f
parentfc93b32955b3a30ad884e4a9b14ebe052b86f120 (diff)
downloadluigi-template-2cff700e3e59adc2bfcd4b2c536675dfdeb96312.tar.bz2
luigi-template-2cff700e3e59adc2bfcd4b2c536675dfdeb96312.zip
js: rm test.js, add test/{test.html,*.js} based on mocha/chai
-rw-r--r--js/test.js58
-rw-r--r--js/test/cache.js32
-rw-r--r--js/test/default-filters.js73
-rw-r--r--js/test/errors.js34
-rw-r--r--js/test/filters.js59
-rw-r--r--js/test/template.js33
-rw-r--r--js/test/test.html28
7 files changed, 259 insertions, 58 deletions
diff --git a/js/test.js b/js/test.js
deleted file mode 100644
index 0fedfcd..0000000
--- a/js/test.js
+++ /dev/null
@@ -1,58 +0,0 @@
-
-load('luigi-template.js');
-
-// define custom template filter
-function custom_filter(v) {
- return "foo" + v + "bar";
-}
-
-function custom_filter_with_args(v, args) {
- var i, l, r = [v];
-
- for (i = 0, l = args.length; i < l; i++)
- r.push(args[i]);
-
- return r.join(' and ');
-}
-
-// add custom template filters
-LuigiTemplate.FILTERS.custom = custom_filter;
-LuigiTemplate.FILTERS.custom_args = custom_filter_with_args;
-
-// build template string
-var template_str = [
- // test basic templates
- "%{greet}, %{name}!",
-
- // test filters and filters with parameters
- "Your name uppercase is: %{name|uc}",
-
- // test custom filter
- "Your custom filtered name is: %{name|custom}",
-
- // test custom filter with arguments
- "Your custom_args name is: %{name|custom_args foo bar baz}",
-
- // test whitespace in filters
- "random test: %{name | lc }",
-
- // test pluralize filter
- 'pluralize test (0): %{count_0} item%{count_0 | s}',
- 'pluralize test (1): %{count_1} item%{count_1 | s}',
- 'pluralize test (10): %{count_10} item%{count_10 | s}',
-
- // terminating newline
- ''
-].join("\n");
-
-// build template
-var t = new LuigiTemplate(template_str);
-
-// print results
-print(t.run({
- greet: 'hello',
- name: 'paul',
- count_0: 0,
- count_1: 1,
- count_10: 10
-}));
diff --git a/js/test/cache.js b/js/test/cache.js
new file mode 100644
index 0000000..39dd46d
--- /dev/null
+++ b/js/test/cache.js
@@ -0,0 +1,32 @@
+(function() {
+ 'use strict';
+ var assert = chai.assert;
+
+ it('cache', function() {
+ var cache = new LuigiTemplate.Cache({
+ foo: ['foo%{bar}'],
+ });
+
+ var r = cache.run('foo', {
+ bar: 'foo',
+ });
+
+ assert.equal(r, 'foofoo');
+ });
+
+ it('cache with custom filters', function() {
+ var cache = new LuigiTemplate.Cache({
+ foo: ['foo%{bar | barify}'],
+ }, {
+ barify: function(s) {
+ return 'bar-' + s + '-bar';
+ },
+ });
+
+ var r = cache.run('foo', {
+ bar: 'foo',
+ });
+
+ assert.equal(r, 'foobar-foo-bar');
+ });
+})();
diff --git a/js/test/default-filters.js b/js/test/default-filters.js
new file mode 100644
index 0000000..f897485
--- /dev/null
+++ b/js/test/default-filters.js
@@ -0,0 +1,73 @@
+(function() {
+ 'use strict';
+ var assert = chai.assert;
+
+ [{
+ filter: 'uc',
+ template: 'foo%{bar|uc}',
+ args: {
+ bar: 'foo',
+ },
+ expect: 'fooFOO',
+ }, {
+ filter: 'lc',
+ template: 'foo%{bar|lc}',
+ args: {
+ bar: 'FOO'
+ },
+ expect: 'foofoo',
+ }, {
+ filter: 'h',
+ template: '%{bar|h}',
+ args: {
+ bar: '<>&"\'',
+ },
+ expect: '&lt;&gt;&amp;&quot;&apos;',
+ }, {
+ filter: 'u',
+ template: '%{bar|u}',
+ args: {
+ bar: 'asdf<>&"\' \u000f',
+ },
+ expect: 'asdf%3C%3E%26%22%27+%0F'
+ }, {
+ filter: 'json',
+ template: '%{bar|json}',
+ args: {
+ bar: {
+ true: true,
+ false: false,
+ null: null,
+ number: 5,
+ string: 'foo',
+ hash: { 'foo': 'bar' },
+ array: [0, 1],
+ },
+ },
+ expect: '{"true":true,"false":false,"null":null,"number":5,"string":"foo","hash":{"foo":"bar"},"array":[0,1]}',
+ }, {
+ filter: 'trim',
+ template: '%{bar|trim}',
+ args: { bar: ' \t\v\r\nfoo \t\v\r\n' },
+ expect: 'foo'
+ }, {
+ filter: 's',
+ template: 'one foo%{foo|s}, two bar%{bar|s}',
+ args: {
+ foo: 1,
+ bar: 2,
+ },
+ expect: 'one foo, two bars'
+ }, {
+ filter: 'length',
+ template: 'length of bar: %{bar|length}',
+ args: {
+ bar: [0, 1, 2],
+ },
+ expect: 'length of bar: 3'
+ }].forEach(function(row) {
+ it('default filter: ' + row.filter, function() {
+ assert.equal(LuigiTemplate.run(row.template, row.args), row.expect);
+ });
+ });
+})();
diff --git a/js/test/errors.js b/js/test/errors.js
new file mode 100644
index 0000000..3ce96d5
--- /dev/null
+++ b/js/test/errors.js
@@ -0,0 +1,34 @@
+(function() {
+ 'use strict';
+ var assert = chai.assert;
+
+ it('unknown key error', function() {
+ assert.throws(function() {
+ var r = LuigiTemplate.run('foo%{unknown-key}', {
+ bar: 'foo',
+ });
+ }, Error, /^unknown key/);
+ });
+
+ it('unknown filter error', function() {
+ assert.throws(function() {
+ var r = LuigiTemplate.run('foo%{bar | unknown-filter}', {
+ bar: 'foo',
+ });
+ }, Error, /^unknown filter/);
+ });
+
+ it('unknown template error', function() {
+ assert.throws(function() {
+ var cache = new LuigiTemplate.Cache({
+ foo: [
+ 'foo%{bar}',
+ ],
+ });
+
+ var r = cache.run('unknown-template', {
+ bar: 'foo',
+ });
+ }, Error, /^unknown template/);
+ });
+})();
diff --git a/js/test/filters.js b/js/test/filters.js
new file mode 100644
index 0000000..c9ba21a
--- /dev/null
+++ b/js/test/filters.js
@@ -0,0 +1,59 @@
+(function() {
+ 'use strict';
+ var assert = chai.assert;
+
+ it('filter', function() {
+ var t = new LuigiTemplate('foo%{bar|h}'),
+ r = t.run({ bar: '<' });
+
+ assert.equal(r, 'foo&lt;');
+ });
+
+ it('filter chain', function() {
+ var r = LuigiTemplate.run('foo%{bar|uc|lc}', {
+ bar: 'foo'
+ });
+
+ assert.equal(r, 'foofoo');
+ });
+
+ it('custom global filter', function() {
+ LuigiTemplate.FILTERS.barify = function(s) {
+ return 'bar-' + s + '-bar';
+ };
+
+ var r = LuigiTemplate.run('foo%{bar | barify}', {
+ bar: 'foo'
+ });
+
+ assert.equal(r, 'foobar-foo-bar');
+ });
+
+ it('custom template filter', function() {
+ var r = LuigiTemplate.run('foo%{bar | barify}', {
+ bar: 'foo'
+ }, {
+ barify: function(s) {
+ return 'bar-' + s + '-bar';
+ },
+ });
+
+ assert.equal(r, 'foobar-foo-bar');
+ });
+
+ it('filter args', function() {
+ var r = LuigiTemplate.run('foo%{bar | wrap bar}', {
+ bar: 'foo'
+ }, {
+ wrap: function(s, args) {
+ if (args.length == 1) {
+ return [args[0], s, args[0]].join('-');
+ } else {
+ return s;
+ }
+ },
+ });
+
+ assert.equal(r, 'foobar-foo-bar');
+ });
+})();
diff --git a/js/test/template.js b/js/test/template.js
new file mode 100644
index 0000000..9a0018f
--- /dev/null
+++ b/js/test/template.js
@@ -0,0 +1,33 @@
+(function() {
+ 'use strict';
+ var assert = chai.assert;
+
+ it('run', function() {
+ var t = new LuigiTemplate('foo%{bar}'),
+ r = t.run({ bar: 'foo' });
+
+ assert.equal(r, 'foofoo');
+ });
+
+ it('run singleton', function() {
+ var r = LuigiTemplate.run('foo%{bar}', { bar: 'foo' });
+
+ assert.equal(r, 'foofoo');
+ });
+
+ it('run with multiple keys', function() {
+ var r = LuigiTemplate.run('foo%{bar}%{baz}', {
+ bar: 'foo',
+ baz: 'foo',
+ });
+
+ assert.equal(r, 'foofoofoo');
+ });
+
+ it('run with whitespace around key', function() {
+ var s = "%{ \t\v\r\nbar}%{ \t\v\r\nbar \t\v\r\n}%{bar \t\v\r\n}",
+ r = LuigiTemplate.run(s, { bar: 'foo' });
+
+ assert.equal(r, 'foofoofoo');
+ });
+})();
diff --git a/js/test/test.html b/js/test/test.html
new file mode 100644
index 0000000..6448e10
--- /dev/null
+++ b/js/test/test.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang='en-US'>
+ <head>
+ <meta charset='utf-8'/>
+ <title>Luigi Template Mocha Tests</title>
+ <link href='https://unpkg.com/mocha@5.2.0/mocha.css' rel='stylesheet' />
+ </head>
+
+ <body>
+ <div id='mocha'></div>
+
+ <script src='../luigi-template.js'></script>
+ <script src='https://unpkg.com/chai/chai.js'></script>
+ <script src='https://unpkg.com/mocha@5.2.0/mocha.js'></script>
+
+ <script>mocha.setup('bdd')</script>
+ <script src='template.js'></script>
+ <script src='filters.js'></script>
+ <script src='cache.js'></script>
+ <script src='errors.js'></script>
+ <script src='default-filters.js'></script>
+ <script>
+ mocha.checkLeaks();
+ mocha.run();
+ </script>
+ </body>
+</html>
+