OLD | NEW |
---|---|
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 // Unit test of the [NativeBehavior.processSpecString] method. | 5 // Unit test of the [NativeBehavior.processSpecString] method. |
6 | 6 |
7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
8 import 'package:compiler/src/native/native.dart'; | 8 import 'package:compiler/src/native/native.dart'; |
9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; | 9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; |
10 import 'package:compiler/src/diagnostics/messages.dart'; | 10 import 'package:compiler/src/diagnostics/messages.dart'; |
11 import 'package:compiler/src/universe/side_effects.dart' | 11 import 'package:compiler/src/universe/side_effects.dart' show SideEffects; |
12 show SideEffects; | |
13 | 12 |
14 const OBJECT = 'Object'; | 13 const OBJECT = 'Object'; |
15 const NULL = 'Null'; | 14 const NULL = 'Null'; |
16 | 15 |
17 class Listener extends DiagnosticReporter { | 16 class Listener extends DiagnosticReporter { |
18 String errorMessage; | 17 String errorMessage; |
19 internalError(spannable, message) { | 18 internalError(spannable, message) { |
20 errorMessage = message; | 19 errorMessage = message; |
21 throw "error"; | 20 throw "error"; |
22 } | 21 } |
23 | 22 |
24 reportError(message, [infos = const <DiagnosticMessage>[]]) { | 23 reportError(message, [infos = const <DiagnosticMessage>[]]) { |
25 errorMessage = | 24 errorMessage = |
26 '${message.message.arguments}'; // E.g. "{text: Duplicate tag 'new'.}" | 25 '${message.message.arguments}'; // E.g. "{text: Duplicate tag 'new'.}" |
27 throw "error"; | 26 throw "error"; |
28 } | 27 } |
29 | 28 |
30 @override | 29 @override |
31 DiagnosticMessage createMessage(spannable, messageKind, | 30 DiagnosticMessage createMessage(spannable, messageKind, |
32 [arguments = const {}]) { | 31 [arguments = const {}]) { |
33 return new DiagnosticMessage(null, spannable, | 32 return new DiagnosticMessage(null, spannable, |
34 MessageTemplate.TEMPLATES[messageKind].message(arguments)); | 33 MessageTemplate.TEMPLATES[messageKind].message(arguments)); |
35 } | 34 } |
36 | 35 |
37 noSuchMethod(_) => null; | 36 noSuchMethod(_) => null; |
38 } | 37 } |
39 | 38 |
40 void test(String specString, | 39 void test(String specString, |
41 {List returns, | 40 {List returns, |
42 List creates, | 41 List creates, |
43 SideEffects expectedSideEffects, | 42 SideEffects expectedSideEffects, |
44 NativeThrowBehavior expectedThrows, | 43 NativeThrowBehavior expectedThrows, |
45 bool expectedNew, | 44 bool expectedNew, |
46 bool expectedGvn, | 45 bool expectedGvn, |
47 bool expectError: false}) { | 46 bool expectError: false}) { |
48 List actualReturns = []; | 47 List actualReturns = []; |
49 List actualCreates = []; | 48 List actualCreates = []; |
50 SideEffects actualSideEffects; | 49 SideEffects actualSideEffects; |
51 NativeThrowBehavior actualThrows; | 50 NativeThrowBehavior actualThrows; |
52 bool actualNew; | 51 bool actualNew; |
53 bool actualGvn; | 52 bool actualGvn; |
54 Listener listener = new Listener(); | 53 Listener listener = new Listener(); |
55 try { | 54 try { |
56 NativeBehavior.processSpecString( | 55 NativeBehavior.processSpecString(listener, null, specString, |
57 listener, | 56 setSideEffects: (effects) { |
Siggi Cherem (dart-lang)
2016/09/16 20:55:24
:( - maybe use => notation instead?
setThrows: (b
Harry Terkelsen
2016/09/16 21:44:04
Done.
| |
58 null, | 57 actualSideEffects = effects; |
59 specString, | 58 }, setThrows: (b) { |
60 setSideEffects: (effects) { actualSideEffects = effects; }, | 59 actualThrows = b; |
61 setThrows: (b) { actualThrows = b; }, | 60 }, setIsAllocation: (b) { |
62 setIsAllocation: (b) { actualNew = b; }, | 61 actualNew = b; |
63 setUseGvn: (b) { actualGvn = b; }, | 62 }, setUseGvn: (b) { |
63 actualGvn = b; | |
64 }, | |
64 resolveType: (t) => t, | 65 resolveType: (t) => t, |
65 typesReturned: actualReturns, typesInstantiated: actualCreates, | 66 typesReturned: actualReturns, |
66 objectType: OBJECT, nullType: NULL); | 67 typesInstantiated: actualCreates, |
68 objectType: OBJECT, | |
69 nullType: NULL); | |
67 } catch (e) { | 70 } catch (e) { |
68 Expect.isTrue(expectError, 'Unexpected error "$specString"'); | 71 Expect.isTrue(expectError, 'Unexpected error "$specString"'); |
69 Expect.isNotNull(listener.errorMessage, 'Error message expected.'); | 72 Expect.isNotNull(listener.errorMessage, 'Error message expected.'); |
70 return; | 73 return; |
71 } | 74 } |
72 Expect.isFalse(expectError, 'Missing error for "$specString".'); | 75 Expect.isFalse(expectError, 'Missing error for "$specString".'); |
73 Expect.isNull(listener.errorMessage, 'Unexpected error.'); | 76 Expect.isNull(listener.errorMessage, 'Unexpected error.'); |
74 if (returns != null) { | 77 if (returns != null) { |
75 Expect.listEquals(returns, actualReturns, 'Unexpected returns.'); | 78 Expect.listEquals(returns, actualReturns, 'Unexpected returns.'); |
76 } | 79 } |
77 if (creates != null) { | 80 if (creates != null) { |
78 Expect.listEquals(creates, actualCreates, 'Unexpected creates.'); | 81 Expect.listEquals(creates, actualCreates, 'Unexpected creates.'); |
79 } | 82 } |
80 Expect.equals(expectedSideEffects, actualSideEffects); | 83 Expect.equals(expectedSideEffects, actualSideEffects); |
81 Expect.equals(expectedThrows, actualThrows); | 84 Expect.equals(expectedThrows, actualThrows); |
82 Expect.equals(expectedNew, actualNew); | 85 Expect.equals(expectedNew, actualNew); |
83 Expect.equals(expectedGvn, actualGvn); | 86 Expect.equals(expectedGvn, actualGvn); |
84 } | 87 } |
85 | 88 |
86 void testWithSideEffects(String specString, | 89 void testWithSideEffects(String specString, |
87 {List returns, | 90 {List returns, List creates, bool expectError: false}) { |
88 List creates, | |
89 bool expectError: false}) { | |
90 | |
91 void sideEffectsTest(String newSpecString, SideEffects expectedSideEffects, | 91 void sideEffectsTest(String newSpecString, SideEffects expectedSideEffects, |
92 {bool sideEffectsExpectError}) { | 92 {bool sideEffectsExpectError}) { |
93 test(newSpecString, | 93 test(newSpecString, |
94 returns: returns, | 94 returns: returns, |
95 creates: creates, | 95 creates: creates, |
96 expectedSideEffects: expectedSideEffects, | 96 expectedSideEffects: expectedSideEffects, |
97 expectError: sideEffectsExpectError == null | 97 expectError: sideEffectsExpectError == null |
98 ? expectError | 98 ? expectError |
99 : sideEffectsExpectError); | 99 : sideEffectsExpectError); |
100 } | 100 } |
101 | 101 |
102 SideEffects emptySideEffects = new SideEffects.empty(); | 102 SideEffects emptySideEffects = new SideEffects.empty(); |
103 sideEffectsTest(specString + "effects:none;depends:none;", | 103 sideEffectsTest(specString + "effects:none;depends:none;", emptySideEffects); |
104 emptySideEffects); | 104 sideEffectsTest(specString + "depends:none;effects:none;", emptySideEffects); |
105 sideEffectsTest(specString + "depends:none;effects:none;", | 105 sideEffectsTest("effects:none;depends:none;" + specString, emptySideEffects); |
106 emptySideEffects); | 106 sideEffectsTest("depends:none;effects:none;" + specString, emptySideEffects); |
107 sideEffectsTest("effects:none;depends:none;" + specString, | |
108 emptySideEffects); | |
109 sideEffectsTest("depends:none;effects:none;" + specString, | |
110 emptySideEffects); | |
111 | 107 |
112 SideEffects effects = new SideEffects(); | 108 SideEffects effects = new SideEffects(); |
113 effects.clearChangesIndex(); | 109 effects.clearChangesIndex(); |
114 effects.clearAllDependencies(); | 110 effects.clearAllDependencies(); |
115 sideEffectsTest(specString + "effects:no-index;depends:none;", effects); | 111 sideEffectsTest(specString + "effects:no-index;depends:none;", effects); |
116 | 112 |
117 effects = new SideEffects(); | 113 effects = new SideEffects(); |
118 effects.clearAllSideEffects(); | 114 effects.clearAllSideEffects(); |
119 effects.clearDependsOnIndexStore(); | 115 effects.clearDependsOnIndexStore(); |
120 sideEffectsTest(specString + "effects:none;depends:no-index;", effects); | 116 sideEffectsTest(specString + "effects:none;depends:no-index;", effects); |
121 | 117 |
122 effects = new SideEffects(); | 118 effects = new SideEffects(); |
123 effects.clearChangesInstanceProperty(); | 119 effects.clearChangesInstanceProperty(); |
124 effects.clearChangesStaticProperty(); | 120 effects.clearChangesStaticProperty(); |
125 effects.clearAllDependencies(); | 121 effects.clearAllDependencies(); |
126 sideEffectsTest(specString + "effects:no-instance,no-static;depends:none;", | 122 sideEffectsTest( |
127 effects); | 123 specString + "effects:no-instance,no-static;depends:none;", effects); |
128 | 124 |
129 effects = new SideEffects(); | 125 effects = new SideEffects(); |
130 effects.clearAllSideEffects(); | 126 effects.clearAllSideEffects(); |
131 effects.clearDependsOnInstancePropertyStore(); | 127 effects.clearDependsOnInstancePropertyStore(); |
132 effects.clearDependsOnStaticPropertyStore(); | 128 effects.clearDependsOnStaticPropertyStore(); |
133 sideEffectsTest(specString + "effects:none;depends:no-instance,no-static;", | 129 sideEffectsTest( |
134 effects); | 130 specString + "effects:none;depends:no-instance,no-static;", effects); |
135 | 131 |
136 effects = new SideEffects(); | 132 effects = new SideEffects(); |
137 effects.clearChangesInstanceProperty(); | 133 effects.clearChangesInstanceProperty(); |
138 effects.clearChangesStaticProperty(); | 134 effects.clearChangesStaticProperty(); |
139 effects.clearDependsOnIndexStore(); | 135 effects.clearDependsOnIndexStore(); |
140 sideEffectsTest( | 136 sideEffectsTest( |
141 specString + "effects:no-instance,no-static;depends:no-index;", effects); | 137 specString + "effects:no-instance,no-static;depends:no-index;", effects); |
142 | 138 |
143 effects = new SideEffects(); | 139 effects = new SideEffects(); |
144 effects.clearChangesIndex(); | 140 effects.clearChangesIndex(); |
145 effects.clearDependsOnInstancePropertyStore(); | 141 effects.clearDependsOnInstancePropertyStore(); |
146 effects.clearDependsOnStaticPropertyStore(); | 142 effects.clearDependsOnStaticPropertyStore(); |
147 sideEffectsTest( | 143 sideEffectsTest( |
148 specString + "effects:no-index;depends:no-instance,no-static;", effects); | 144 specString + "effects:no-index;depends:no-instance,no-static;", effects); |
149 | 145 |
150 effects = new SideEffects(); | 146 effects = new SideEffects(); |
151 effects.clearChangesIndex(); | 147 effects.clearChangesIndex(); |
152 sideEffectsTest(specString + "effects:no-index;depends:all;", effects); | 148 sideEffectsTest(specString + "effects:no-index;depends:all;", effects); |
153 | 149 |
154 effects = new SideEffects(); | 150 effects = new SideEffects(); |
155 effects.clearDependsOnIndexStore(); | 151 effects.clearDependsOnIndexStore(); |
156 sideEffectsTest(specString + "effects:all;depends:no-index;", effects); | 152 sideEffectsTest(specString + "effects:all;depends:no-index;", effects); |
157 | 153 |
158 effects = new SideEffects(); | 154 effects = new SideEffects(); |
159 effects.clearChangesInstanceProperty(); | 155 effects.clearChangesInstanceProperty(); |
160 effects.clearChangesStaticProperty(); | 156 effects.clearChangesStaticProperty(); |
161 sideEffectsTest(specString + "effects:no-instance,no-static;depends:all;", | 157 sideEffectsTest( |
162 effects); | 158 specString + "effects:no-instance,no-static;depends:all;", effects); |
163 | 159 |
164 effects = new SideEffects(); | 160 effects = new SideEffects(); |
165 effects.clearDependsOnInstancePropertyStore(); | 161 effects.clearDependsOnInstancePropertyStore(); |
166 effects.clearDependsOnStaticPropertyStore(); | 162 effects.clearDependsOnStaticPropertyStore(); |
167 sideEffectsTest(specString + "effects:all;depends:no-instance,no-static;", | 163 sideEffectsTest( |
168 effects); | 164 specString + "effects:all;depends:no-instance,no-static;", effects); |
169 | 165 |
170 sideEffectsTest(specString + "effects:no-instance,no-static;", | 166 sideEffectsTest(specString + "effects:no-instance,no-static;", effects, |
171 effects, | 167 sideEffectsExpectError: true); |
172 sideEffectsExpectError: true); | |
173 | 168 |
174 sideEffectsTest(specString + "depends:no-instance,no-static;", | 169 sideEffectsTest(specString + "depends:no-instance,no-static;", effects, |
175 effects, | 170 sideEffectsExpectError: true); |
176 sideEffectsExpectError: true); | |
177 | 171 |
178 sideEffectsTest(specString + "effects:none;", | 172 sideEffectsTest(specString + "effects:none;", effects, |
179 effects, | 173 sideEffectsExpectError: true); |
180 sideEffectsExpectError: true); | |
181 | 174 |
182 sideEffectsTest(specString + "depends:all;", | 175 sideEffectsTest(specString + "depends:all;", effects, |
183 effects, | 176 sideEffectsExpectError: true); |
184 sideEffectsExpectError: true); | |
185 | 177 |
186 sideEffectsTest(specString + "effects:no-instance,no-static;depends:foo;", | 178 sideEffectsTest( |
187 effects, | 179 specString + "effects:no-instance,no-static;depends:foo;", effects, |
188 sideEffectsExpectError: true); | 180 sideEffectsExpectError: true); |
189 | 181 |
190 sideEffectsTest(specString + "effects:foo;depends:no-instance,no-static;", | 182 sideEffectsTest( |
191 effects, | 183 specString + "effects:foo;depends:no-instance,no-static;", effects, |
192 sideEffectsExpectError: true); | 184 sideEffectsExpectError: true); |
193 | 185 |
194 sideEffectsTest(specString + "effects:all;depends:foo", | 186 sideEffectsTest(specString + "effects:all;depends:foo", effects, |
195 effects, | 187 sideEffectsExpectError: true); |
196 sideEffectsExpectError: true); | |
197 | 188 |
198 sideEffectsTest(specString + "effects:foo;depends:none;", | 189 sideEffectsTest(specString + "effects:foo;depends:none;", effects, |
199 effects, | 190 sideEffectsExpectError: true); |
200 sideEffectsExpectError: true); | |
201 | 191 |
202 sideEffectsTest(specString + "effects:;depends:none;", | 192 sideEffectsTest(specString + "effects:;depends:none;", effects, |
203 effects, | 193 sideEffectsExpectError: true); |
204 sideEffectsExpectError: true); | |
205 | 194 |
206 sideEffectsTest(specString + "effects:all;depends:;", | 195 sideEffectsTest(specString + "effects:all;depends:;", effects, |
207 effects, | 196 sideEffectsExpectError: true); |
208 sideEffectsExpectError: true); | |
209 } | 197 } |
210 | 198 |
211 void main() { | 199 void main() { |
212 test('void', returns: [], creates: []); | 200 test('void', returns: [], creates: []); |
213 test('', returns: [OBJECT, NULL], creates: []); | 201 test('', returns: [OBJECT, NULL], creates: []); |
214 test('var', returns: [OBJECT, NULL], creates: []); | 202 test('var', returns: [OBJECT, NULL], creates: []); |
215 test('A', returns: ['A'], creates: ['A']); | 203 test('A', returns: ['A'], creates: ['A']); |
216 test('A|B', returns: ['A', 'B'], creates: ['A', 'B']); | 204 test('A|B', returns: ['A', 'B'], creates: ['A', 'B']); |
217 test('A|B|C', returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 205 test('A|B|C', returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
218 | 206 |
(...skipping 16 matching lines...) Expand all Loading... | |
235 test('returns:var;creates:', returns: [OBJECT, NULL], creates: []); | 223 test('returns:var;creates:', returns: [OBJECT, NULL], creates: []); |
236 test('returns:A;creates:', returns: ['A'], creates: []); | 224 test('returns:A;creates:', returns: ['A'], creates: []); |
237 test('returns:A|B;creates:;', returns: ['A', 'B'], creates: []); | 225 test('returns:A|B;creates:;', returns: ['A', 'B'], creates: []); |
238 test('returns:A|B|C;creates:;', returns: ['A', 'B', 'C'], creates: []); | 226 test('returns:A|B|C;creates:;', returns: ['A', 'B', 'C'], creates: []); |
239 | 227 |
240 test('returns:void;creates:A;', returns: [], creates: ['A']); | 228 test('returns:void;creates:A;', returns: [], creates: ['A']); |
241 test('returns:;creates:A|B;', returns: [OBJECT, NULL], creates: ['A', 'B']); | 229 test('returns:;creates:A|B;', returns: [OBJECT, NULL], creates: ['A', 'B']); |
242 test('returns:var;creates:A|B|C;', | 230 test('returns:var;creates:A|B|C;', |
243 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); | 231 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); |
244 test('returns:A; creates:A|B|C; ', returns: ['A'], creates: ['A', 'B', 'C']); | 232 test('returns:A; creates:A|B|C; ', returns: ['A'], creates: ['A', 'B', 'C']); |
245 test(' returns:A|B; creates:A|C;', | 233 test(' returns:A|B; creates:A|C;', returns: ['A', 'B'], creates: ['A', 'C']); |
246 returns: ['A', 'B'], creates: ['A', 'C']); | |
247 test(' returns:A|B|C; creates:A; ', | 234 test(' returns:A|B|C; creates:A; ', |
248 returns: ['A', 'B', 'C'], creates: ['A']); | 235 returns: ['A', 'B', 'C'], creates: ['A']); |
249 | 236 |
250 testWithSideEffects('returns:void;', returns: [], creates: []); | 237 testWithSideEffects('returns:void;', returns: [], creates: []); |
251 testWithSideEffects('returns:void;', returns: [], creates: []); | 238 testWithSideEffects('returns:void;', returns: [], creates: []); |
252 testWithSideEffects('returns:;', returns: [OBJECT, NULL], creates: []); | 239 testWithSideEffects('returns:;', returns: [OBJECT, NULL], creates: []); |
253 testWithSideEffects('returns:var;', returns: [OBJECT, NULL], creates: []); | 240 testWithSideEffects('returns:var;', returns: [OBJECT, NULL], creates: []); |
254 testWithSideEffects('returns:A;', returns: ['A'], creates: ['A']); | 241 testWithSideEffects('returns:A;', returns: ['A'], creates: ['A']); |
255 testWithSideEffects('returns:A|B;', | 242 testWithSideEffects('returns:A|B;', returns: ['A', 'B'], creates: ['A', 'B']); |
256 returns: ['A', 'B'], creates: ['A', 'B']); | |
257 testWithSideEffects('returns:A|B|C;', | 243 testWithSideEffects('returns:A|B|C;', |
258 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 244 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
259 testWithSideEffects('returns: A| B |C ;', | 245 testWithSideEffects('returns: A| B |C ;', |
260 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 246 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
261 | 247 |
262 testWithSideEffects('creates:void;', expectError: true); | 248 testWithSideEffects('creates:void;', expectError: true); |
263 testWithSideEffects('creates:;', creates: []); | 249 testWithSideEffects('creates:;', creates: []); |
264 testWithSideEffects('creates:var;', creates: []); | 250 testWithSideEffects('creates:var;', creates: []); |
265 testWithSideEffects('creates:A;', returns: [], creates: ['A']); | 251 testWithSideEffects('creates:A;', returns: [], creates: ['A']); |
266 testWithSideEffects('creates:A|B;', returns: [], creates: ['A', 'B']); | 252 testWithSideEffects('creates:A|B;', returns: [], creates: ['A', 'B']); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
306 test('gvn:false', expectedGvn: false); | 292 test('gvn:false', expectedGvn: false); |
307 test('returns:A;gvn:true', returns: ['A'], expectedGvn: true); | 293 test('returns:A;gvn:true', returns: ['A'], expectedGvn: true); |
308 test(' gvn : true ; returns:A;', returns: ['A'], expectedGvn: true); | 294 test(' gvn : true ; returns:A;', returns: ['A'], expectedGvn: true); |
309 test('gvn:true;returns:A;gvn:true', expectError: true); | 295 test('gvn:true;returns:A;gvn:true', expectError: true); |
310 | 296 |
311 test('gvn: true; new: true', expectError: true); | 297 test('gvn: true; new: true', expectError: true); |
312 test('gvn: true; new: false', expectedGvn: true, expectedNew: false); | 298 test('gvn: true; new: false', expectedGvn: true, expectedNew: false); |
313 test('gvn: false; new: true', expectedGvn: false, expectedNew: true); | 299 test('gvn: false; new: true', expectedGvn: false, expectedNew: true); |
314 test('gvn: false; new: false', expectedGvn: false, expectedNew: false); | 300 test('gvn: false; new: false', expectedGvn: false, expectedNew: false); |
315 } | 301 } |
OLD | NEW |