1 | 'use strict';
|
2 |
|
3 | var fs = require('fs');
|
4 | var assert = require('assert');
|
5 | var test = require('testit');
|
6 | var rimraf = require('rimraf').sync;
|
7 | var htmlparser = require('htmlparser2');
|
8 | var mockDom = require('./mock-dom.js');
|
9 | var jade = require('../');
|
10 |
|
11 | var outputDir = __dirname + '/output';
|
12 | var inputDir = __dirname + '/jade/test/cases';
|
13 |
|
14 | rimraf(outputDir);
|
15 | fs.mkdirSync(outputDir);
|
16 | try {
|
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 |
|
22 | fs.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 |
|
77 | function 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 | }
|
95 | function 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 |
|
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 | }
|