OLD | NEW |
---|---|
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Note: This test relies on LF line endings in the source file. | 5 // Note: This test relies on LF line endings in the source file. |
6 | 6 |
7 // Test that JS printer callbacks occur when expected. | 7 // Test that JS printer callbacks occur when expected. |
8 | 8 |
9 library js_ast.printer.callback_test; | 9 library js_ast.printer.callback_test; |
10 | 10 |
11 import 'package:js_ast/js_ast.dart'; | 11 import 'package:js_ast/js_ast.dart'; |
12 import 'package:unittest/unittest.dart'; | 12 import 'package:unittest/unittest.dart'; |
13 | 13 |
14 enum TestMode { | 14 enum TestMode { |
15 INPUT, | |
15 NONE, | 16 NONE, |
16 ENTER, | 17 ENTER, |
17 DELIMITER, | 18 DELIMITER, |
18 EXIT, | 19 EXIT, |
19 } | 20 } |
20 | 21 |
21 const DATA = const [ | 22 class TestCase { |
22 const { | 23 final Map<TestMode, String> data; |
24 | |
25 /// The used template names. | |
26 final List<String> environment; | |
27 | |
28 const TestCase( | |
29 this.data, | |
30 [this.environment = const []]); | |
31 } | |
32 | |
33 const List<TestCase> DATA = const <TestCase>[ | |
34 const TestCase(const { | |
23 TestMode.NONE: """ | 35 TestMode.NONE: """ |
24 function(a, b) { | 36 function(a, b) { |
25 return null; | 37 return null; |
26 }""", | 38 }""", |
27 TestMode.ENTER: """ | 39 TestMode.ENTER: """ |
28 @0function(@1a, @2b) @3{ | 40 @0function(@1a, @2b) @3{ |
29 @4return @5null; | 41 @4return @5null; |
30 }""", | 42 }""", |
31 TestMode.DELIMITER: """ | 43 TestMode.DELIMITER: """ |
32 function(a, b) { | 44 function(a, b) { |
33 return null; | 45 return null; |
34 @0}""", | 46 @0}""", |
35 TestMode.EXIT: """ | 47 TestMode.EXIT: """ |
36 function(a@1, b@2) { | 48 function(a@1, b@2) { |
37 return null@5; | 49 return null@5; |
38 @4}@3@0""" | 50 @4}@3@0""" |
39 }, | 51 }), |
40 | 52 |
41 const { | 53 const TestCase(const { |
42 TestMode.NONE: """ | 54 TestMode.NONE: """ |
43 function() { | 55 function() { |
44 if (true) { | 56 if (true) { |
45 foo1(); | 57 foo1(); |
46 foo2(); | 58 foo2(); |
47 } else { | 59 } else if (false) { |
48 bar1(); | 60 bar1(); |
49 bar2(); | 61 bar2(); |
50 } | 62 } |
51 while (false) { | 63 while (false) { |
52 baz3(); | 64 baz3(); |
53 baz4(); | 65 baz4(); |
54 } | 66 } |
55 }""", | 67 }""", |
56 TestMode.ENTER: """ | 68 TestMode.ENTER: """ |
57 @0function() @1{ | 69 @0function() @1{ |
58 @2if (@3true) @4{ | 70 @2if (@3true) @4{ |
59 @5@6@7foo1(); | 71 @5@6@7foo1(); |
60 @8@9@10foo2(); | 72 @8@9@10foo2(); |
61 } else @11{ | 73 } else @11if (@12false) @13{ |
62 @12@13@14bar1(); | 74 @14@15@16bar1(); |
63 @15@16@17bar2(); | 75 @17@18@19bar2(); |
64 } | 76 } |
65 @18while (@19false) @20{ | 77 @20while (@21false) @22{ |
66 @21@22@23baz3(); | 78 @23@24@25baz3(); |
67 @24@25@26baz4(); | 79 @26@27@28baz4(); |
68 } | 80 } |
69 }""", | 81 }""", |
70 TestMode.DELIMITER: """ | 82 TestMode.DELIMITER: """ |
71 function() { | 83 function() { |
72 if (true) { | 84 if (true) { |
73 foo1(); | 85 foo1(); |
74 foo2(); | 86 foo2(); |
75 } else { | 87 } else if (false) { |
76 bar1(); | 88 bar1(); |
77 bar2(); | 89 bar2(); |
78 } | 90 } |
79 while (false) { | 91 while (false) { |
80 baz3(); | 92 baz3(); |
81 baz4(); | 93 baz4(); |
82 } | 94 } |
83 @0}""", | 95 @0}""", |
84 TestMode.EXIT: """ | 96 TestMode.EXIT: """ |
85 function() { | 97 function() { |
86 if (true@3) { | 98 if (true@3) { |
87 foo1@7()@6; | 99 foo1@7()@6; |
88 @5 foo2@10()@9; | 100 @5 foo2@10()@9; |
89 @8 }@4 else { | 101 @8 }@4 else if (false@12) { |
90 bar1@14()@13; | 102 bar1@16()@15; |
91 @12 bar2@17()@16; | 103 @14 bar2@19()@18; |
92 @15 }@11 | 104 @17 }@13 |
93 @2 while (false@19) { | 105 @11@2 while (false@21) { |
94 baz3@23()@22; | 106 baz3@25()@24; |
95 @21 baz4@26()@25; | 107 @23 baz4@28()@27; |
96 @24 }@20 | 108 @26 }@22 |
97 @18}@1@0""", | 109 @20}@1@0""", |
98 }, | 110 }), |
111 | |
112 const TestCase(const { | |
113 TestMode.NONE: """ | |
114 function() { | |
115 function foo() { | |
116 } | |
117 }""", | |
118 TestMode.ENTER: """ | |
119 @0function() @1{ | |
120 @2@3function @4foo() @5{ | |
121 } | |
122 }""", | |
123 TestMode.DELIMITER: """ | |
124 function() { | |
125 function foo() { | |
126 @3} | |
127 @0}""", | |
128 TestMode.EXIT: """ | |
129 function() { | |
130 function foo@4() { | |
131 }@5@3 | |
132 @2}@1@0""" | |
133 }), | |
134 | |
135 const TestCase(const { | |
136 TestMode.INPUT: """ | |
137 function() { | |
138 a['b']; | |
139 [1,, 2]; | |
140 }""", | |
141 TestMode.NONE: """ | |
142 function() { | |
143 a.b; | |
144 [1,, 2]; | |
145 }""", | |
146 TestMode.ENTER: """ | |
147 @0function() @1{ | |
148 @2@3@4a.@5b; | |
149 @6@7[@81,@9, @102]; | |
150 }""", | |
151 TestMode.DELIMITER: """ | |
152 function() { | |
153 a.b; | |
154 [1,, 2]; | |
155 @0}""", | |
156 TestMode.EXIT: """ | |
157 function() { | |
158 a@4.b@5@3; | |
159 @2 [1@8,,@9 2@10]@7; | |
160 @6}@1@0""", | |
161 }), | |
162 | |
163 const TestCase(const { | |
164 TestMode.INPUT: "a.#foo", | |
165 TestMode.NONE: "a.foo", | |
166 TestMode.ENTER: "@0@1a.@2foo", | |
167 TestMode.DELIMITER: "a.foo", | |
168 TestMode.EXIT: "a@1.foo@2@0", | |
169 }, const ['foo']), | |
floitsch
2015/06/29 16:30:44
maybe give it different names, to make it clearer,
Johnni Winther
2015/07/02 12:43:05
Done.
| |
99 ]; | 170 ]; |
100 | 171 |
101 void check(Map<TestMode, String> map) { | 172 class FixedName extends Name { |
102 String code = map[TestMode.NONE]; | 173 final String name; |
174 | |
175 FixedName(this.name); | |
176 | |
177 @override | |
178 int compareTo(other) => 0; | |
179 } | |
180 | |
181 void check(TestCase testCase) { | |
182 Map<TestMode, String> map = testCase.data; | |
183 String code = map[TestMode.INPUT]; | |
184 if (code == null) { | |
185 // Input is the same as output. | |
186 code = map[TestMode.NONE]; | |
187 } | |
103 JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(); | 188 JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(); |
104 Node node = js.parseForeignJS(code).instantiate({}); | 189 Map arguments = {}; |
190 testCase.environment.forEach((String name) { | |
191 arguments[name] = new FixedName(name); | |
192 }); | |
193 Node node = js.parseForeignJS(code).instantiate(arguments); | |
194 print('$code:${node.runtimeType}'); | |
floitsch
2015/06/29 16:30:44
debug print.
Johnni Winther
2015/07/02 08:38:09
Removed.
| |
105 map.forEach((TestMode mode, String expectedOutput) { | 195 map.forEach((TestMode mode, String expectedOutput) { |
196 if (mode == TestMode.INPUT) return; | |
106 Context context = new Context(mode); | 197 Context context = new Context(mode); |
107 new Printer(options, context).visit(node); | 198 new Printer(options, context).visit(node); |
108 expect(context.getText(), equals(expectedOutput), | 199 expect(context.getText(), equals(expectedOutput), |
109 reason: "Unexpected output for $code in $mode"); | 200 reason: "Unexpected output for $code in $mode"); |
110 }); | 201 }); |
111 } | 202 } |
112 | 203 |
113 class Context extends SimpleJavaScriptPrintingContext { | 204 class Context extends SimpleJavaScriptPrintingContext { |
114 final TestMode mode; | 205 final TestMode mode; |
115 final Map<Node, int> idMap = {}; | 206 final Map<Node, int> idMap = {}; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
154 if (offset < text.length) { | 245 if (offset < text.length) { |
155 sb.write(text.substring(offset)); | 246 sb.write(text.substring(offset)); |
156 } | 247 } |
157 return sb.toString(); | 248 return sb.toString(); |
158 } | 249 } |
159 } | 250 } |
160 | 251 |
161 void main() { | 252 void main() { |
162 DATA.forEach(check); | 253 DATA.forEach(check); |
163 } | 254 } |
OLD | NEW |