1 | 'use strict';
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | const
|
12 | $C = require('collection.js/compiled'),
|
13 | snakeskin = global.Snakeskin = require('../snakeskin');
|
14 |
|
15 | const
|
16 | path = require('path'),
|
17 | fs = require('fs'),
|
18 | assert = require('assert'),
|
19 | glob = require('glob');
|
20 |
|
21 | const
|
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 |
|
26 | let prfx = -1;
|
27 | exports.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 |
|
92 | let tpl;
|
93 |
|
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 |
|
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 |
|
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 |
|
168 | exports.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 | };
|