UNPKG

4.63 kBtext/coffeescriptView Raw
1should = require 'should'
2escodegen = require 'escodegen'
3esprima = require 'esprima'
4expander = require('./coverage').require 'expander'
5jscov = require('./coverage').require 'jscov'
6
7cases = [{
8 name: 'if'
9 input: '''
10 if (a) {
11 f();
12 }
13 '''
14 output: '''
15 var __noop__ = function() { return null; };
16 if (a) {
17 f();
18 } else
19 __noop__();
20 '''
21}, {
22 name: 'ternary'
23 input: '''
24 var result = predicate ? v1 : v2;
25 '''
26 output: '''
27 var result = ((function(arguments) {
28 if (predicate)
29 return v1;
30 else
31 return v2;
32 }).call(this, arguments));
33 '''
34}, {
35 name: 'complex-ternary'
36 input: '''
37 var result = predicate ? x+y : pred2 ? f(g(1, 2, 3)) : v3;
38 '''
39 output: '''
40 var result = ((function(arguments) {
41 if (predicate)
42 return x+y;
43 else
44 return ((function(arguments) {
45 if (pred2)
46 return f(g(1, 2, 3));
47 else
48 return v3;
49 }).call(this, arguments));
50 }).call(this, arguments));
51 '''
52}, {
53 name: 'ifelse'
54 input: '''
55 if (a) {
56 f();
57 } else {
58 g();
59 }
60 '''
61 output: '''
62 if (a) {
63 f();
64 } else {
65 g();
66 }
67 '''
68}, {
69 name: 'ifelseif'
70 input: '''
71 if (a) {
72 f();
73 } else if (b) {
74 g();
75 }
76 '''
77 output: '''
78 var __noop__ = function() { return null; };
79 if (a) {
80 f();
81 } else if (b) {
82 g();
83 } else
84 __noop__();
85 '''
86}, {
87 name: 'and-assign'
88 input: '''
89 var x = a() && b();
90 '''
91 output: '''
92 var x = ((function(arguments) {
93 var __lhs__ = a();
94 if (__lhs__)
95 return b();
96 else
97 return __lhs__;
98 }).call(this, arguments));
99 '''
100}, {
101 name: 'and-assign-constant'
102 input: '''
103 var x = 5 && b();
104 '''
105 output: '''
106 var x = ((function(arguments) {
107 if (5)
108 return b();
109 else
110 return 5;
111 }).call(this, arguments));
112 '''
113}, {
114 name: 'and-assign-literal'
115 input: '''
116 var x = variable && b();
117 '''
118 output: '''
119 var x = ((function(arguments) {
120 if (variable)
121 return b();
122 else
123 return variable;
124 }).call(this, arguments));
125 '''
126}, {
127 name: 'or-assign-constant'
128 input: '''
129 var x = 5 || b();
130 '''
131 output: '''
132 var x = ((function(arguments) {
133 if (5)
134 return 5;
135 else
136 return b();
137 }).call(this, arguments));
138 '''
139}, {
140 name: 'or-assign-literal'
141 input: '''
142 var x = variable || b();
143 '''
144 output: '''
145 var x = ((function(arguments) {
146 if (variable)
147 return variable;
148 else
149 return b();
150 }).call(this, arguments));
151 '''
152}, {
153 name: 'or-assign'
154 input: '''
155 var x = a() || b();
156 '''
157 output: '''
158 var x = ((function(arguments) {
159 var __lhs__ = a();
160 if (__lhs__)
161 return __lhs__;
162 else
163 return b();
164 }).call(this, arguments));
165 '''
166}, {
167 name: 'this-and-arguments-variable'
168 input: '''
169 var x = this || arguments;
170 '''
171 output: '''
172 var x = ((function(arguments) {
173 var __lhs__ = this;
174 if (__lhs__)
175 return __lhs__;
176 else
177 return arguments;
178 }).call(this, arguments));
179 '''
180}, {
181 name: 'andor-complex'
182 input: '''
183 if ((a() || b()) && !c()) {
184 f();
185 }
186 '''
187 output: '''
188 var __noop__ = function() { return null; };
189 if (((function(arguments) {
190 var __lhs__ = ((function(arguments) {
191 var __lhs__ = a();
192 if (__lhs__)
193 return __lhs__;
194 else
195 return b();
196 }).call(this, arguments));
197 if (__lhs__)
198 return !c();
199 else
200 return __lhs__;
201 }).call(this, arguments))) {
202 f();
203 } else
204 __noop__();
205 '''
206}]
207
208
209
210cases.forEach (data) ->
211 it "should transform #{data.name} properly", (done) ->
212 ast = esprima.parse(data.input)
213 expandedAst = expander.expand(ast)
214 expandedCode = escodegen.generate(expandedAst, { indent: " " })
215 expectedCode = escodegen.generate(esprima.parse(data.output), { indent: " " })
216 expandedCode.should.eql expectedCode
217 done()
218
219
220
221it "should tranform strings too", (done) ->
222 data = cases[0]
223 output = expander.expand(data.input)
224 output.should.be.a.string
225 expandedCode = escodegen.generate(esprima.parse(output), { indent: " " })
226 expectedCode = escodegen.generate(esprima.parse(data.output), { indent: " " })
227 expandedCode.should.eql expectedCode
228 done()
229
230
231
232it "should work on all testfiles", (done) ->
233 jscov.rewriteFolder 'spec/scaffolding/scaffold', 'spec/.output/expanded', { expand: true }, (err) ->
234 should.not.exist err
235 done()