UNPKG

4.22 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4var assert = require('assert');
5var test = require('testit');
6var rimraf = require('rimraf').sync;
7var htmlparser = require('htmlparser2');
8var mockDom = require('./mock-dom.js');
9var jade = require('../');
10
11var outputDir = __dirname + '/output';
12var inputDir = __dirname + '/jade/test/cases';
13
14rimraf(outputDir);
15fs.mkdirSync(outputDir);
16try {
17 fs.statSync(inputDir);
18} catch (ex) {
19 throw new Error('You must first download jade before you can run tests. This is done automatically if you use "npm test" to run tests.');
20}
21
22fs.readdirSync(inputDir).filter(function (name) {
23 return /\.jade$/.test(name) &&
24 !/doctype/.test(name) &&
25 !/mixin/.test(name) &&
26 !/filter/.test(name) &&
27 !/case/.test(name) &&
28 'xml.jade' !== name &&
29 'tag.interpolation.jade' !== name &&
30 'scripts.non-js.jade' !== name &&
31 'namespaces.jade' !== name &&
32 'html.jade' !== name &&
33 'html5.jade' !== name &&
34 'escape-test.jade' !== name &&
35 'attrs.unescaped.jade' !== name &&
36 'regression.784.jade' !== name &&
37 'tags.self-closing.jade' !== name &&
38 'interpolation.escape.jade' !== name &&
39 'include.yield.nested.jade' !== name &&
40 'escaping-class-attribute.jade' !== name &&
41 'each.else.jade' !== name &&
42 'includes.jade' !== name &&
43 'code.iteration.jade' !== name &&
44 'code.escape.jade' !== name &&
45 'blockquote.jade' !== name &&
46 'attrs.js.jade' !== name &&
47 'attrs.jade' !== name &&
48 'attrs.interpolation.jade' !== name &&
49 'attrs-data.jade' !== name;
50}).forEach(function (name) {
51 name = name.replace(/\.jade$/, '');
52 test(name, function () {
53 var src = fs.readFileSync(inputDir + '/' + name + '.jade', 'utf8');
54 var expected = htmlparser.parseDOM(fs.readFileSync(inputDir + '/' + name + '.html', 'utf8'));
55 fs.writeFileSync(outputDir + '/' + name + '.jade', src);
56 var js = jade.compileFileClient(inputDir + '/' + name + '.jade', {
57 outputFile: outputDir + '/' + name + '.js',
58 basedir: inputDir
59 });
60 fs.writeFileSync(outputDir + '/' + name + '.js', js);
61 mockDom.mock();
62 var fn = jade.compileFile(inputDir + '/' + name + '.jade', {
63 outputFile: outputDir + '/' + name + '.js',
64 basedir: inputDir
65 });
66 var actual = fn({title: 'Jade'}).children;
67 mockDom.reset();
68
69 if (domToString(expected) !== domToString(actual)) {
70 fs.writeFileSync(outputDir + '/' + name + '.expected.dom', domToString(expected) + '\n');
71 fs.writeFileSync(outputDir + '/' + name + '.actual.dom', domToString(actual) + '\n');
72 assert(domToString(expected) === domToString(actual), 'Expected output dom to match expected dom (see /test/output/' + name + '.actual.dom and /test/output/' + name + '.expected.dom for details.');
73 }
74 });
75});
76
77function domToString(dom, indent) {
78 if (Array.isArray(dom)) {
79 return joinStrings(dom).map(function (child) {
80 return domToString(child, indent);
81 }).join('\n');
82 }
83 indent = indent || '';
84 if (dom.type === 'script' || dom.type === 'style' || dom.type === 'tag' && (dom.name === 'script' || dom.name === 'style')) {
85 return indent + dom.name + ' ' + JSON.stringify(dom.attribs);
86 } else if (dom.type === 'tag') {
87 return indent + dom.name + ' ' + JSON.stringify(dom.attribs) + joinStrings(dom.children).map(function (child) {
88 return '\n' + domToString(child, indent + ' ');
89 }).join('');
90 } else if (typeof dom === 'string') {
91 return indent + JSON.stringify(dom + '');
92 }
93 return indent + '[' + dom.type + ']';
94}
95function joinStrings(elements) {
96 var result = [];
97 for (var i = 0; i < elements.length; i++) {
98 var el = elements[i];
99 if (el === null || el === undefined) el = '';
100 if (el.type === 'text') {
101 el = el.data;
102 }
103 if (typeof el !== 'function' && typeof el !== 'object') {
104 el = (el + '').replace(/\s+/g, '');
105 }
106 if (el.type === 'comment' || (typeof el === 'string' && el === '')) {
107 // ignore
108 } else if (typeof el === 'string' && typeof result[result.length - 1] === 'string') {
109 result[result.length - 1] = (result[result.length - 1] + el).replace(/\s+/g, '');
110 } else {
111 result.push(el);
112 }
113 }
114 return result;
115}