| Index: tests/compiler/dart2js/js_spec_string_test.dart
|
| diff --git a/tests/compiler/dart2js/js_spec_string_test.dart b/tests/compiler/dart2js/js_spec_string_test.dart
|
| index 42d938e3fb2b4e555d08c4bc49465fc6e95fd663..8ebbfd733390b77ef4d11e26669fa41d59a94960 100644
|
| --- a/tests/compiler/dart2js/js_spec_string_test.dart
|
| +++ b/tests/compiler/dart2js/js_spec_string_test.dart
|
| @@ -8,13 +8,18 @@ import 'package:expect/expect.dart';
|
| import 'package:compiler/src/native/native.dart';
|
| import 'package:compiler/src/dart2jslib.dart'
|
| show DiagnosticListener;
|
| +import 'package:compiler/src/universe/universe.dart'
|
| + show SideEffects;
|
|
|
| const OBJECT = 'Object';
|
| const NULL = 'Null';
|
|
|
| class Listener implements DiagnosticListener {
|
| String errorMessage;
|
| - internalError(spannable, message) => errorMessage = message;
|
| + internalError(spannable, message) {
|
| + errorMessage = message;
|
| + throw "error";
|
| + }
|
|
|
| noSuchMethod(_) => null;
|
| }
|
| @@ -22,24 +27,155 @@ class Listener implements DiagnosticListener {
|
| void test(String specString,
|
| {List returns,
|
| List creates,
|
| + SideEffects expectedSideEffects,
|
| bool expectError: false}) {
|
| List actualReturns = [];
|
| List actualCreates = [];
|
| + SideEffects actualSideEffects;
|
| Listener listener = new Listener();
|
| - NativeBehavior.processSpecString(
|
| - listener,
|
| - null,
|
| - specString,
|
| - resolveType: (t) => t,
|
| - typesReturned: actualReturns, typesInstantiated: actualCreates,
|
| - objectType: OBJECT, nullType: NULL);
|
| - if (expectError) {
|
| + try {
|
| + NativeBehavior.processSpecString(
|
| + listener,
|
| + null,
|
| + specString,
|
| + setSideEffects: (effects) { actualSideEffects = effects; },
|
| + resolveType: (t) => t,
|
| + typesReturned: actualReturns, typesInstantiated: actualCreates,
|
| + objectType: OBJECT, nullType: NULL);
|
| + } catch (e) {
|
| + Expect.isTrue(expectError);
|
| Expect.isNotNull(listener.errorMessage, 'Internal error expected.');
|
| - } else {
|
| - Expect.isNull(listener.errorMessage, 'Unexpected internal error.');
|
| - Expect.listEquals(returns, actualReturns, 'Unexpected returns.');
|
| - Expect.listEquals(creates, actualCreates, 'Unexpected creates.');
|
| + return;
|
| + }
|
| + Expect.isNull(listener.errorMessage, 'Unexpected internal error.');
|
| + Expect.listEquals(returns, actualReturns, 'Unexpected returns.');
|
| + Expect.listEquals(creates, actualCreates, 'Unexpected creates.');
|
| + Expect.equals(expectedSideEffects, actualSideEffects);
|
| +}
|
| +
|
| +void testWithSideEffects(String specString,
|
| + {List returns,
|
| + List creates,
|
| + bool expectError: false}) {
|
| +
|
| + void sideEffectsTest(String newSpecString, SideEffects expectedSideEffects,
|
| + {bool sideEffectsExpectError}) {
|
| + test(newSpecString,
|
| + returns: returns,
|
| + creates: creates,
|
| + expectedSideEffects: expectedSideEffects,
|
| + expectError: sideEffectsExpectError == null
|
| + ? expectError
|
| + : sideEffectsExpectError);
|
| }
|
| +
|
| + SideEffects emptySideEffects = new SideEffects.empty();
|
| + sideEffectsTest(specString + "effects:none;depends:none;",
|
| + emptySideEffects);
|
| + sideEffectsTest(specString + "depends:none;effects:none;",
|
| + emptySideEffects);
|
| + sideEffectsTest("effects:none;depends:none;" + specString,
|
| + emptySideEffects);
|
| + sideEffectsTest("depends:none;effects:none;" + specString,
|
| + emptySideEffects);
|
| +
|
| + SideEffects effects = new SideEffects();
|
| + effects.clearChangesIndex();
|
| + effects.clearAllDependencies();
|
| + sideEffectsTest(specString + "effects:no-index;depends:none;", effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearAllSideEffects();
|
| + effects.clearDependsOnIndexStore();
|
| + sideEffectsTest(specString + "effects:none;depends:no-index;", effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearChangesInstanceProperty();
|
| + effects.clearChangesStaticProperty();
|
| + effects.clearAllDependencies();
|
| + sideEffectsTest(specString + "effects:no-instance,no-static;depends:none;",
|
| + effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearAllSideEffects();
|
| + effects.clearDependsOnInstancePropertyStore();
|
| + effects.clearDependsOnStaticPropertyStore();
|
| + sideEffectsTest(specString + "effects:none;depends:no-instance,no-static;",
|
| + effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearChangesInstanceProperty();
|
| + effects.clearChangesStaticProperty();
|
| + effects.clearDependsOnIndexStore();
|
| + sideEffectsTest(
|
| + specString + "effects:no-instance,no-static;depends:no-index;", effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearChangesIndex();
|
| + effects.clearDependsOnInstancePropertyStore();
|
| + effects.clearDependsOnStaticPropertyStore();
|
| + sideEffectsTest(
|
| + specString + "effects:no-index;depends:no-instance,no-static;", effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearChangesIndex();
|
| + sideEffectsTest(specString + "effects:no-index;depends:all;", effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearDependsOnIndexStore();
|
| + sideEffectsTest(specString + "effects:all;depends:no-index;", effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearChangesInstanceProperty();
|
| + effects.clearChangesStaticProperty();
|
| + sideEffectsTest(specString + "effects:no-instance,no-static;depends:all;",
|
| + effects);
|
| +
|
| + effects = new SideEffects();
|
| + effects.clearDependsOnInstancePropertyStore();
|
| + effects.clearDependsOnStaticPropertyStore();
|
| + sideEffectsTest(specString + "effects:all;depends:no-instance,no-static;",
|
| + effects);
|
| +
|
| + sideEffectsTest(specString + "effects:no-instance,no-static;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "depends:no-instance,no-static;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:none;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "depends:all;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:no-instance,no-static;depends:foo;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:foo;depends:no-instance,no-static;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:all;depends:foo",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:foo;depends:none;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:;depends:none;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| +
|
| + sideEffectsTest(specString + "effects:all;depends:;",
|
| + effects,
|
| + sideEffectsExpectError: true);
|
| }
|
|
|
| void main() {
|
| @@ -73,4 +209,31 @@ void main() {
|
| returns: ['A', 'B'], creates: ['A', 'C']);
|
| test(' returns:A|B|C; creates:A; ',
|
| returns: ['A', 'B', 'C'], creates: ['A']);
|
| +
|
| + testWithSideEffects('returns:void;', returns: [], creates: []);
|
| + testWithSideEffects('returns:void;', returns: [], creates: []);
|
| + testWithSideEffects('returns:;', returns: [OBJECT, NULL], creates: []);
|
| + testWithSideEffects('returns:var;', returns: [OBJECT, NULL], creates: []);
|
| + testWithSideEffects('returns:A;', returns: ['A'], creates: []);
|
| + testWithSideEffects('returns:A|B;', returns: ['A', 'B'], creates: []);
|
| + testWithSideEffects('returns:A|B|C;', returns: ['A', 'B', 'C'], creates: []);
|
| +
|
| + testWithSideEffects('creates:void;', expectError: true);
|
| + testWithSideEffects('creates:;', expectError: true);
|
| + testWithSideEffects('creates:var;', expectError: true);
|
| + testWithSideEffects('creates:A;', returns: [], creates: ['A']);
|
| + testWithSideEffects('creates:A|B;', returns: [], creates: ['A', 'B']);
|
| + testWithSideEffects('creates:A|B|C;', returns: [], creates: ['A', 'B', 'C']);
|
| +
|
| + testWithSideEffects('returns:void;creates:A;', returns: [], creates: ['A']);
|
| + testWithSideEffects('returns:;creates:A|B;',
|
| + returns: [OBJECT, NULL], creates: ['A', 'B']);
|
| + testWithSideEffects('returns:var;creates:A|B|C;',
|
| + returns: [OBJECT, NULL], creates: ['A', 'B', 'C']);
|
| + testWithSideEffects('returns:A; creates:A|B|C; ',
|
| + returns: ['A'], creates: ['A', 'B', 'C']);
|
| + testWithSideEffects(' returns:A|B; creates:A|C;',
|
| + returns: ['A', 'B'], creates: ['A', 'C']);
|
| + testWithSideEffects(' returns:A|B|C; creates:A; ',
|
| + returns: ['A', 'B', 'C'], creates: ['A']);
|
| }
|
|
|