Chromium Code Reviews| 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 |