1 | should = require 'should'
|
2 | escodegen = require 'escodegen'
|
3 | esprima = require 'esprima'
|
4 | expander = require('./coverage').require 'expander'
|
5 | jscov = require('./coverage').require 'jscov'
|
6 |
|
7 | cases = [{
|
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 |
|
210 | cases.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 |
|
221 | it "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 |
|
232 | it "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()
|