| 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/dart2jslib.dart' | 9 import 'package:compiler/src/dart2jslib.dart' |
| 10 show DiagnosticListener; | 10 show DiagnosticListener; |
| 11 import 'package:compiler/src/universe/universe.dart' |
| 12 show SideEffects; |
| 11 | 13 |
| 12 const OBJECT = 'Object'; | 14 const OBJECT = 'Object'; |
| 13 const NULL = 'Null'; | 15 const NULL = 'Null'; |
| 14 | 16 |
| 15 class Listener implements DiagnosticListener { | 17 class Listener implements DiagnosticListener { |
| 16 String errorMessage; | 18 String errorMessage; |
| 17 internalError(spannable, message) => errorMessage = message; | 19 internalError(spannable, message) { |
| 20 errorMessage = message; |
| 21 throw "error"; |
| 22 } |
| 18 | 23 |
| 19 noSuchMethod(_) => null; | 24 noSuchMethod(_) => null; |
| 20 } | 25 } |
| 21 | 26 |
| 22 void test(String specString, | 27 void test(String specString, |
| 23 {List returns, | 28 {List returns, |
| 24 List creates, | 29 List creates, |
| 30 SideEffects expectedSideEffects, |
| 25 bool expectError: false}) { | 31 bool expectError: false}) { |
| 26 List actualReturns = []; | 32 List actualReturns = []; |
| 27 List actualCreates = []; | 33 List actualCreates = []; |
| 34 SideEffects actualSideEffects; |
| 28 Listener listener = new Listener(); | 35 Listener listener = new Listener(); |
| 29 NativeBehavior.processSpecString( | 36 try { |
| 30 listener, | 37 NativeBehavior.processSpecString( |
| 31 null, | 38 listener, |
| 32 specString, | 39 null, |
| 33 resolveType: (t) => t, | 40 specString, |
| 34 typesReturned: actualReturns, typesInstantiated: actualCreates, | 41 setSideEffects: (effects) { actualSideEffects = effects; }, |
| 35 objectType: OBJECT, nullType: NULL); | 42 resolveType: (t) => t, |
| 36 if (expectError) { | 43 typesReturned: actualReturns, typesInstantiated: actualCreates, |
| 44 objectType: OBJECT, nullType: NULL); |
| 45 } catch (e) { |
| 46 Expect.isTrue(expectError); |
| 37 Expect.isNotNull(listener.errorMessage, 'Internal error expected.'); | 47 Expect.isNotNull(listener.errorMessage, 'Internal error expected.'); |
| 38 } else { | 48 return; |
| 39 Expect.isNull(listener.errorMessage, 'Unexpected internal error.'); | |
| 40 Expect.listEquals(returns, actualReturns, 'Unexpected returns.'); | |
| 41 Expect.listEquals(creates, actualCreates, 'Unexpected creates.'); | |
| 42 } | 49 } |
| 50 Expect.isNull(listener.errorMessage, 'Unexpected internal error.'); |
| 51 Expect.listEquals(returns, actualReturns, 'Unexpected returns.'); |
| 52 Expect.listEquals(creates, actualCreates, 'Unexpected creates.'); |
| 53 Expect.equals(expectedSideEffects, actualSideEffects); |
| 54 } |
| 55 |
| 56 void testWithSideEffects(String specString, |
| 57 {List returns, |
| 58 List creates, |
| 59 bool expectError: false}) { |
| 60 |
| 61 void sideEffectsTest(String newSpecString, SideEffects expectedSideEffects, |
| 62 {bool sideEffectsExpectError}) { |
| 63 test(newSpecString, |
| 64 returns: returns, |
| 65 creates: creates, |
| 66 expectedSideEffects: expectedSideEffects, |
| 67 expectError: sideEffectsExpectError == null |
| 68 ? expectError |
| 69 : sideEffectsExpectError); |
| 70 } |
| 71 |
| 72 SideEffects emptySideEffects = new SideEffects.empty(); |
| 73 sideEffectsTest(specString + "effects:empty;depends:empty;", |
| 74 emptySideEffects); |
| 75 sideEffectsTest(specString + "depends:empty;effects:empty;", |
| 76 emptySideEffects); |
| 77 sideEffectsTest("effects:empty;depends:empty;" + specString, |
| 78 emptySideEffects); |
| 79 sideEffectsTest("depends:empty;effects:empty;" + specString, |
| 80 emptySideEffects); |
| 81 |
| 82 SideEffects effects = new SideEffects(); |
| 83 effects.clearChangesIndex(); |
| 84 effects.clearAllDependencies(); |
| 85 sideEffectsTest(specString + "effects:-index;depends:empty;", effects); |
| 86 |
| 87 effects = new SideEffects(); |
| 88 effects.clearAllSideEffects(); |
| 89 effects.clearDependsOnIndexStore(); |
| 90 sideEffectsTest(specString + "effects:empty;depends:-index;", effects); |
| 91 |
| 92 effects = new SideEffects(); |
| 93 effects.clearChangesInstanceProperty(); |
| 94 effects.clearChangesStaticProperty(); |
| 95 effects.clearAllDependencies(); |
| 96 sideEffectsTest(specString + "effects:-instance,-static;depends:empty;", |
| 97 effects); |
| 98 |
| 99 effects = new SideEffects(); |
| 100 effects.clearAllSideEffects(); |
| 101 effects.clearDependsOnInstancePropertyStore(); |
| 102 effects.clearDependsOnStaticPropertyStore(); |
| 103 sideEffectsTest(specString + "effects:empty;depends:-instance,-static;", |
| 104 effects); |
| 105 |
| 106 effects = new SideEffects(); |
| 107 effects.clearChangesInstanceProperty(); |
| 108 effects.clearChangesStaticProperty(); |
| 109 effects.clearDependsOnIndexStore(); |
| 110 sideEffectsTest(specString + "effects:-instance,-static;depends:-index;", |
| 111 effects); |
| 112 |
| 113 effects = new SideEffects(); |
| 114 effects.clearChangesIndex(); |
| 115 effects.clearDependsOnInstancePropertyStore(); |
| 116 effects.clearDependsOnStaticPropertyStore(); |
| 117 sideEffectsTest(specString + "effects:-index;depends:-instance,-static;", |
| 118 effects); |
| 119 |
| 120 effects = new SideEffects(); |
| 121 effects.clearChangesIndex(); |
| 122 sideEffectsTest(specString + "effects:-index;depends:all;", effects); |
| 123 |
| 124 effects = new SideEffects(); |
| 125 effects.clearDependsOnIndexStore(); |
| 126 sideEffectsTest(specString + "effects:all;depends:-index;", effects); |
| 127 |
| 128 effects = new SideEffects(); |
| 129 effects.clearChangesInstanceProperty(); |
| 130 effects.clearChangesStaticProperty(); |
| 131 sideEffectsTest(specString + "effects:-instance,-static;depends:all;", |
| 132 effects); |
| 133 |
| 134 effects = new SideEffects(); |
| 135 effects.clearDependsOnInstancePropertyStore(); |
| 136 effects.clearDependsOnStaticPropertyStore(); |
| 137 sideEffectsTest(specString + "effects:all;depends:-instance,-static;", |
| 138 effects); |
| 139 |
| 140 sideEffectsTest(specString + "effects:-instance,-static;", |
| 141 effects, |
| 142 sideEffectsExpectError: true); |
| 143 |
| 144 sideEffectsTest(specString + "depends:-instance,-static;", |
| 145 effects, |
| 146 sideEffectsExpectError: true); |
| 147 |
| 148 sideEffectsTest(specString + "effects:empty;", |
| 149 effects, |
| 150 sideEffectsExpectError: true); |
| 151 |
| 152 sideEffectsTest(specString + "depends:all;", |
| 153 effects, |
| 154 sideEffectsExpectError: true); |
| 155 |
| 156 sideEffectsTest(specString + "effects:-instance,-static;depends:foo;", |
| 157 effects, |
| 158 sideEffectsExpectError: true); |
| 159 |
| 160 sideEffectsTest(specString + "effects:foo;depends:-instance,-static;", |
| 161 effects, |
| 162 sideEffectsExpectError: true); |
| 163 |
| 164 sideEffectsTest(specString + "effects:all;depends:foo", |
| 165 effects, |
| 166 sideEffectsExpectError: true); |
| 167 |
| 168 sideEffectsTest(specString + "effects:foo;depends:empty;", |
| 169 effects, |
| 170 sideEffectsExpectError: true); |
| 171 |
| 172 sideEffectsTest(specString + "effects:;depends:empty;", |
| 173 effects, |
| 174 sideEffectsExpectError: true); |
| 175 |
| 176 sideEffectsTest(specString + "effects:all;depends:;", |
| 177 effects, |
| 178 sideEffectsExpectError: true); |
| 43 } | 179 } |
| 44 | 180 |
| 45 void main() { | 181 void main() { |
| 46 test('void', returns: [], creates: []); | 182 test('void', returns: [], creates: []); |
| 47 test('', returns: [OBJECT, NULL], creates: []); | 183 test('', returns: [OBJECT, NULL], creates: []); |
| 48 test('var', returns: [OBJECT, NULL], creates: []); | 184 test('var', returns: [OBJECT, NULL], creates: []); |
| 49 test('A', returns: ['A'], creates: ['A']); | 185 test('A', returns: ['A'], creates: ['A']); |
| 50 test('A|B', returns: ['A', 'B'], creates: ['A', 'B']); | 186 test('A|B', returns: ['A', 'B'], creates: ['A', 'B']); |
| 51 test('A|B|C', returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 187 test('A|B|C', returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
| 52 | 188 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 66 | 202 |
| 67 test('returns:void;creates:A;', returns: [], creates: ['A']); | 203 test('returns:void;creates:A;', returns: [], creates: ['A']); |
| 68 test('returns:;creates:A|B;', returns: [OBJECT, NULL], creates: ['A', 'B']); | 204 test('returns:;creates:A|B;', returns: [OBJECT, NULL], creates: ['A', 'B']); |
| 69 test('returns:var;creates:A|B|C;', | 205 test('returns:var;creates:A|B|C;', |
| 70 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); | 206 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); |
| 71 test('returns:A; creates:A|B|C; ', returns: ['A'], creates: ['A', 'B', 'C']); | 207 test('returns:A; creates:A|B|C; ', returns: ['A'], creates: ['A', 'B', 'C']); |
| 72 test(' returns:A|B; creates:A|C;', | 208 test(' returns:A|B; creates:A|C;', |
| 73 returns: ['A', 'B'], creates: ['A', 'C']); | 209 returns: ['A', 'B'], creates: ['A', 'C']); |
| 74 test(' returns:A|B|C; creates:A; ', | 210 test(' returns:A|B|C; creates:A; ', |
| 75 returns: ['A', 'B', 'C'], creates: ['A']); | 211 returns: ['A', 'B', 'C'], creates: ['A']); |
| 212 |
| 213 testWithSideEffects('returns:void;', returns: [], creates: []); |
| 214 testWithSideEffects('returns:void;', returns: [], creates: []); |
| 215 testWithSideEffects('returns:;', returns: [OBJECT, NULL], creates: []); |
| 216 testWithSideEffects('returns:var;', returns: [OBJECT, NULL], creates: []); |
| 217 testWithSideEffects('returns:A;', returns: ['A'], creates: []); |
| 218 testWithSideEffects('returns:A|B;', returns: ['A', 'B'], creates: []); |
| 219 testWithSideEffects('returns:A|B|C;', returns: ['A', 'B', 'C'], creates: []); |
| 220 |
| 221 testWithSideEffects('creates:void;', expectError: true); |
| 222 testWithSideEffects('creates:;', expectError: true); |
| 223 testWithSideEffects('creates:var;', expectError: true); |
| 224 testWithSideEffects('creates:A;', returns: [], creates: ['A']); |
| 225 testWithSideEffects('creates:A|B;', returns: [], creates: ['A', 'B']); |
| 226 testWithSideEffects('creates:A|B|C;', returns: [], creates: ['A', 'B', 'C']); |
| 227 |
| 228 testWithSideEffects('returns:void;creates:A;', returns: [], creates: ['A']); |
| 229 testWithSideEffects('returns:;creates:A|B;', |
| 230 returns: [OBJECT, NULL], creates: ['A', 'B']); |
| 231 testWithSideEffects('returns:var;creates:A|B|C;', |
| 232 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); |
| 233 testWithSideEffects('returns:A; creates:A|B|C; ', |
| 234 returns: ['A'], creates: ['A', 'B', 'C']); |
| 235 testWithSideEffects(' returns:A|B; creates:A|C;', |
| 236 returns: ['A', 'B'], creates: ['A', 'C']); |
| 237 testWithSideEffects(' returns:A|B|C; creates:A; ', |
| 238 returns: ['A', 'B', 'C'], creates: ['A']); |
| 76 } | 239 } |
| OLD | NEW |