UNPKG

3.55 kBJavaScriptView Raw
1'use strict';
2
3/*!
4 * Snakeskin
5 * https://github.com/SnakeskinTpl/Snakeskin
6 *
7 * Released under the MIT license
8 * https://github.com/SnakeskinTpl/Snakeskin/blob/master/LICENSE
9 */
10
11const
12 $C = require('collection.js/compiled'),
13 snakeskin = global.Snakeskin = require('../snakeskin');
14
15const
16 path = require('path'),
17 fs = require('fs'),
18 assert = require('assert'),
19 glob = require('glob');
20
21const
22 from = exports.from = path.join(__dirname, 'tests'),
23 to = exports.to = path.join(__dirname, 'tmp'),
24 error = exports.error = path.join(__dirname, '../error.tmp');
25
26let prfx = -1;
27exports.run = function (params) {
28 const
29 options = JSON.stringify(params, null, 2),
30 debug = params.debug = {};
31
32 prfx++;
33 $C(glob.sync(path.join(from, '*/*.ss'))).forEach(exec);
34
35 function exec(file) {
36 let
37 txt,
38 filename,
39 dirname;
40
41 let
42 chunkSrc,
43 relativeSrc,
44 nms;
45
46 let
47 results,
48 tests;
49
50 try {
51 txt = $C(
52 fs
53 .readFileSync(file, 'utf8')
54 .replace(/^\/\*![\s\S]*?\*\//, '')
55 .split(/^===.*/m)
56
57 ).map((el) => el.trim());
58
59 filename = path.basename(file);
60 dirname = path.basename(path.dirname(file));
61
62 chunkSrc = path.join(to, `${filename}_${prfx}.${dirname}.js`);
63 relativeSrc = path.relative(process.cwd(), file);
64 nms = [dirname, path.basename(file, '.ss')];
65
66 console.log(
67 `\n###### ${nms.join('.')} :: ${options}\n`
68 );
69
70 const
71 testRgxp = /^\[\[(.*)]]===+$/gm;
72
73 results = txt[0].split(/^\[\[.*]]===+$/m).slice(1);
74 tests = [];
75
76 while (testRgxp.exec(txt[0])) {
77 tests.push(RegExp.$1);
78 }
79
80 } catch (err) {
81 log(`File: ${relativeSrc ? relativeSrc : file}\nError: ${err.message}`, 'error');
82 return;
83 }
84
85 const obj = {
86 tpl: txt[1],
87 id: path.basename(file, '.ss'),
88 js: []
89 };
90
91 /* eslint-disable no-unused-vars */
92 let tpl;
93 /* eslint-enable no-unused-vars */
94
95 try {
96 const
97 start = Date.now(),
98 res = snakeskin.compile(txt[1], params, {file});
99
100 log(`${relativeSrc} ${Date.now() - start}ms`);
101 fs.writeFileSync(chunkSrc, res);
102 tpl = $C(require(chunkSrc)).get(nms);
103
104 } catch (err) {
105 fs.writeFileSync(
106 error,
107 `File: ${file}\n\n${err.message + (debug.code ? `\n\nCode:\n\n${debug.code}` : '')}`
108 );
109
110 throw err;
111 }
112
113 $C(tests).forEach((el, i) => {
114 const
115 p = String(el).split(' ; ');
116
117 let res = '';
118 try {
119 results[i] = (results[i] || '').trim();
120 obj.js.push(
121 `equal(${p[0]}(${p.slice(1)}).trim(), '${results[i].replace(/(\\|')/g, '\\$1')}');`
122 );
123
124 res = eval(`tpl["${p[0]}"](${p.slice(1)})`);
125 res = res != null ? res.trim() : '';
126
127 assert.equal(
128 res,
129 results[i]
130 );
131
132 } catch (err) {
133 /* eslint-disable prefer-template */
134 const header =
135 `File: ${relativeSrc} (${prfx})` +
136 `\nOptions:\n\n${options}` +
137 `\n\nTpl: ${p[0]}`;
138
139 log(header, 'error');
140 const report =
141 header +
142 `\n\n${line()}` +
143 `\n\nResult:\n${res}` +
144 `\n\nExpected:\n${results[i]}` +
145 `\n\n${line()}` +
146 `\n\nTest:\n${txt[1]}` +
147 `\n\nCode:\n${debug['code']}`;
148
149 /* eslint-enable prefer-template */
150 fs.writeFileSync(error, report);
151 throw err;
152 }
153 });
154 }
155
156 function log(message, type) {
157 type = type || 'log';
158 console[type](new Date().toString());
159 console[type](message);
160 console[type](line());
161 }
162
163 function line() {
164 return new Array(80).join('~');
165 }
166};
167
168exports.exists = function (src) {
169 try {
170 fs.statSync(src);
171 return true;
172
173 } catch (err) {
174 if (err.code === 'ENOENT') {
175 return false;
176 }
177
178 throw err;
179 }
180};