Index: tests/compiler/dart2js/constant_expression_evaluate_test.dart |
diff --git a/tests/compiler/dart2js/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/constant_expression_evaluate_test.dart |
index 2e8241207981331f8139f189cd290971261f05ca..94a0213eaacb2ea6aba5b4dfb5c37746a40afbe2 100644 |
--- a/tests/compiler/dart2js/constant_expression_evaluate_test.dart |
+++ b/tests/compiler/dart2js/constant_expression_evaluate_test.dart |
@@ -1,237 +1,237 @@ |
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library dart2js.constants.expressions.evaluate_test; |
- |
-import 'dart:async'; |
-import 'package:async_helper/async_helper.dart'; |
-import 'package:expect/expect.dart'; |
-import 'package:compiler/src/constants/expressions.dart'; |
-import 'package:compiler/src/constants/values.dart'; |
-import 'package:compiler/src/constant_system_dart.dart'; |
-import 'package:compiler/src/core_types.dart'; |
-import 'package:compiler/src/dart2jslib.dart'; |
-import 'package:compiler/src/elements/elements.dart'; |
-import 'memory_compiler.dart'; |
- |
-class TestData { |
- /// Declarations needed for the [constants]. |
- final String declarations; |
- /// Tested constants. |
- final List constants; |
- |
- const TestData(this.declarations, this.constants); |
-} |
- |
-class ConstantData { |
- /// Source code for the constant expression. |
- final String code; |
- /// Map from environment to expected constant value as structured text. |
- final Map<Map<String, String>, String> expectedValues; |
- |
- const ConstantData(this.code, |
- this.expectedValues); |
-} |
- |
-class MemoryEnvironment implements Environment { |
- final Compiler compiler; |
- final Map<String, String> env; |
- |
- MemoryEnvironment(this.compiler, |
- [this.env = const <String, String>{}]); |
- |
- @override |
- String readFromEnvironment(String name) => env[name]; |
-} |
- |
-const List<TestData> DATA = const [ |
- const TestData('', const [ |
- const ConstantData('null', const { const {} : 'NullConstant' }), |
- const ConstantData('false', const { const {} : 'BoolConstant(false)' }), |
- const ConstantData('true', const { const {} : 'BoolConstant(true)' }), |
- const ConstantData('0', const { const {} : 'IntConstant(0)' }), |
- const ConstantData('0.0', const { const {} : 'DoubleConstant(0.0)' }), |
- const ConstantData('"foo"', const { const {} : 'StringConstant("foo")' }), |
- const ConstantData('1 + 2', const { const {} : 'IntConstant(3)' }), |
- const ConstantData('-(1)', const { const {} : 'IntConstant(-1)' }), |
- const ConstantData('"foo".length', const { const {} : 'IntConstant(3)' }), |
- const ConstantData('identical(0, 1)', |
- const { const {} : 'BoolConstant(false)' }), |
- const ConstantData('"a" "b"', const { const {} : 'StringConstant("ab")' }), |
- const ConstantData('identical', |
- const { const {} : 'FunctionConstant(identical)' }), |
- const ConstantData('true ? 0 : 1', const { const {} : 'IntConstant(0)' }), |
- const ConstantData('proxy', |
- const { const {} : 'ConstructedConstant(_Proxy())' }), |
- const ConstantData('Object', const { const {} : 'TypeConstant(Object)' }), |
- const ConstantData('const [0, 1]', |
- const { const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }), |
- const ConstantData('const <int>[0, 1]', const { |
- const {} : 'ListConstant(<int>[IntConstant(0), IntConstant(1)])' }), |
- const ConstantData('const {0: 1, 2: 3}', |
- const { const {} : |
- 'MapConstant({IntConstant(0): IntConstant(1), ' |
- 'IntConstant(2): IntConstant(3)})' }), |
- const ConstantData('const <int, int>{0: 1, 2: 3}', |
- const { const {} : |
- 'MapConstant(<int, int>{IntConstant(0): IntConstant(1), ' |
- 'IntConstant(2): IntConstant(3)})' }), |
- const ConstantData( |
- 'const bool.fromEnvironment("foo", defaultValue: false)', |
- const { const {} : 'BoolConstant(false)', |
- const {'foo': 'true'} : 'BoolConstant(true)'}), |
- const ConstantData( |
- 'const int.fromEnvironment("foo", defaultValue: 42)', |
- const { const {} : 'IntConstant(42)', |
- const {'foo': '87'} : 'IntConstant(87)'}), |
- const ConstantData( |
- 'const String.fromEnvironment("foo", defaultValue: "bar")', |
- const { const {} : 'StringConstant("bar")', |
- const {'foo': 'foo'} : 'StringConstant("foo")'}), |
- ]), |
- const TestData(''' |
-const a = const bool.fromEnvironment("foo", defaultValue: true); |
-const b = const int.fromEnvironment("bar", defaultValue: 42); |
- |
-class A { |
- const A(); |
-} |
-class B { |
- final field1; |
- const B(this.field1); |
-} |
-class C extends B { |
- final field2; |
- const C({field1: 42, this.field2: false}) : super(field1); |
- const C.named([field = false]) : this(field1: field, field2: field); |
-} |
-''', const [ |
- const ConstantData('const Object()', |
- const { const {} : 'ConstructedConstant(Object())' }), |
- const ConstantData('const A()', |
- const { const {} : 'ConstructedConstant(A())' }), |
- const ConstantData('const B(0)', |
- const { const {} : 'ConstructedConstant(B(field1=IntConstant(0)))' }), |
- const ConstantData('const B(const A())', |
- const { const {} : |
- 'ConstructedConstant(B(field1=ConstructedConstant(A())))' }), |
- const ConstantData('const C()', const { const {} : |
- 'ConstructedConstant(C(field1=IntConstant(42),' |
- 'field2=BoolConstant(false)))' }), |
- const ConstantData('const C(field1: 87)', const { const {} : |
- 'ConstructedConstant(C(field1=IntConstant(87),' |
- 'field2=BoolConstant(false)))' }), |
- const ConstantData('const C(field2: true)', const { const {} : |
- 'ConstructedConstant(C(field1=IntConstant(42),' |
- 'field2=BoolConstant(true)))' }), |
- const ConstantData('const C.named()', const { const {} : |
- 'ConstructedConstant(C(field1=BoolConstant(false),' |
- 'field2=BoolConstant(false)))' }), |
- const ConstantData('const C.named(87)', const { const {} : |
- 'ConstructedConstant(C(field1=IntConstant(87),' |
- 'field2=IntConstant(87)))' }), |
- const ConstantData('const C(field1: a, field2: b)', const { |
- const {} : |
- 'ConstructedConstant(C(field1=BoolConstant(true),' |
- 'field2=IntConstant(42)))', |
- const {'foo': 'false', 'bar': '87'} : |
- 'ConstructedConstant(C(field1=BoolConstant(false),' |
- 'field2=IntConstant(87)))', }), |
- ]), |
- const TestData(''' |
-class A<T> implements B { |
- final field1; |
- const A({this.field1:42}); |
-} |
-class B<S> implements C { |
- const factory B({field1}) = A<B<S>>; |
- const factory B.named() = A<S>; |
-} |
-class C<U> { |
- const factory C({field1}) = A<B<double>>; |
-} |
-''', const [ |
- const ConstantData('const A()', |
- const { const {} : |
- 'ConstructedConstant(A<dynamic>(field1=IntConstant(42)))' }), |
- const ConstantData('const A<int>(field1: 87)', |
- const { const {} : |
- 'ConstructedConstant(A<int>(field1=IntConstant(87)))' }), |
- const ConstantData('const B()', |
- const { const {} : |
- 'ConstructedConstant(A<B<dynamic>>(field1=IntConstant(42)))' }), |
- const ConstantData('const B<int>()', |
- const { const {} : |
- 'ConstructedConstant(A<B<int>>(field1=IntConstant(42)))' }), |
- const ConstantData('const B<int>(field1: 87)', |
- const { const {} : |
- 'ConstructedConstant(A<B<int>>(field1=IntConstant(87)))' }), |
- const ConstantData('const C<int>(field1: 87)', |
- const { const {} : |
- 'ConstructedConstant(A<B<double>>(field1=IntConstant(87)))' }), |
- const ConstantData('const B<int>.named()', |
- const { const {} : |
- 'ConstructedConstant(A<int>(field1=IntConstant(42)))' }), |
- ]), |
- const TestData(''' |
-const c = const int.fromEnvironment("foo", defaultValue: 5); |
-const d = const int.fromEnvironment("bar", defaultValue: 10); |
- |
-class A { |
- final field; |
- const A(a, b) : field = a + b; |
-} |
- |
-class B extends A { |
- const B(a) : super(a, a * 2); |
-} |
-''', const [ |
- const ConstantData('const A(c, d)', const { |
- const {} : |
- 'ConstructedConstant(A(field=IntConstant(15)))', |
- const {'foo': '7', 'bar': '11'} : |
- 'ConstructedConstant(A(field=IntConstant(18)))', }), |
- const ConstantData('const B(d)', const { |
- const {} : |
- 'ConstructedConstant(B(field=IntConstant(30)))', |
- const {'bar': '42'} : |
- 'ConstructedConstant(B(field=IntConstant(126)))', }), |
- ]), |
-]; |
- |
-main() { |
- asyncTest(() => Future.forEach(DATA, testData)); |
-} |
- |
-Future testData(TestData data) { |
- StringBuffer sb = new StringBuffer(); |
- sb.write('${data.declarations}\n'); |
- Map constants = {}; |
- data.constants.forEach((ConstantData constantData) { |
- String name = 'c${constants.length}'; |
- sb.write('const $name = ${constantData.code};\n'); |
- constants[name] = constantData; |
- }); |
- sb.write('main() {}\n'); |
- String source = sb.toString(); |
- Compiler compiler = compilerFor( |
- {'main.dart': source}, options: ['--analyze-all']); |
- return compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) { |
- var library = compiler.mainApp; |
- constants.forEach((String name, ConstantData data) { |
- FieldElement field = library.localLookup(name); |
- ConstantExpression constant = field.constant; |
- data.expectedValues.forEach( |
- (Map<String, String> env, String expectedText) { |
- Environment environment = new MemoryEnvironment(compiler, env); |
- ConstantValue value = |
- constant.evaluate(environment, DART_CONSTANT_SYSTEM); |
- String valueText = value.toStructuredString(); |
- Expect.equals(expectedText, valueText, |
- "Unexpected value '${valueText}' for contant " |
- "`${constant.getText()}`, expected '${expectedText}'."); |
- }); |
- }); |
- }); |
-} |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library dart2js.constants.expressions.evaluate_test; |
+ |
+import 'dart:async'; |
+import 'package:async_helper/async_helper.dart'; |
+import 'package:expect/expect.dart'; |
+import 'package:compiler/src/constants/expressions.dart'; |
+import 'package:compiler/src/constants/values.dart'; |
+import 'package:compiler/src/constant_system_dart.dart'; |
+import 'package:compiler/src/core_types.dart'; |
+import 'package:compiler/src/dart2jslib.dart'; |
+import 'package:compiler/src/elements/elements.dart'; |
+import 'memory_compiler.dart'; |
+ |
+class TestData { |
+ /// Declarations needed for the [constants]. |
+ final String declarations; |
+ /// Tested constants. |
+ final List constants; |
+ |
+ const TestData(this.declarations, this.constants); |
+} |
+ |
+class ConstantData { |
+ /// Source code for the constant expression. |
+ final String code; |
+ /// Map from environment to expected constant value as structured text. |
+ final Map<Map<String, String>, String> expectedValues; |
+ |
+ const ConstantData(this.code, |
+ this.expectedValues); |
+} |
+ |
+class MemoryEnvironment implements Environment { |
+ final Compiler compiler; |
+ final Map<String, String> env; |
+ |
+ MemoryEnvironment(this.compiler, |
+ [this.env = const <String, String>{}]); |
+ |
+ @override |
+ String readFromEnvironment(String name) => env[name]; |
+} |
+ |
+const List<TestData> DATA = const [ |
+ const TestData('', const [ |
+ const ConstantData('null', const { const {} : 'NullConstant' }), |
+ const ConstantData('false', const { const {} : 'BoolConstant(false)' }), |
+ const ConstantData('true', const { const {} : 'BoolConstant(true)' }), |
+ const ConstantData('0', const { const {} : 'IntConstant(0)' }), |
+ const ConstantData('0.0', const { const {} : 'DoubleConstant(0.0)' }), |
+ const ConstantData('"foo"', const { const {} : 'StringConstant("foo")' }), |
+ const ConstantData('1 + 2', const { const {} : 'IntConstant(3)' }), |
+ const ConstantData('-(1)', const { const {} : 'IntConstant(-1)' }), |
+ const ConstantData('"foo".length', const { const {} : 'IntConstant(3)' }), |
+ const ConstantData('identical(0, 1)', |
+ const { const {} : 'BoolConstant(false)' }), |
+ const ConstantData('"a" "b"', const { const {} : 'StringConstant("ab")' }), |
+ const ConstantData('identical', |
+ const { const {} : 'FunctionConstant(identical)' }), |
+ const ConstantData('true ? 0 : 1', const { const {} : 'IntConstant(0)' }), |
+ const ConstantData('proxy', |
+ const { const {} : 'ConstructedConstant(_Proxy())' }), |
+ const ConstantData('Object', const { const {} : 'TypeConstant(Object)' }), |
+ const ConstantData('const [0, 1]', |
+ const { const {} : 'ListConstant([IntConstant(0), IntConstant(1)])' }), |
+ const ConstantData('const <int>[0, 1]', const { |
+ const {} : 'ListConstant(<int>[IntConstant(0), IntConstant(1)])' }), |
+ const ConstantData('const {0: 1, 2: 3}', |
+ const { const {} : |
+ 'MapConstant({IntConstant(0): IntConstant(1), ' |
+ 'IntConstant(2): IntConstant(3)})' }), |
+ const ConstantData('const <int, int>{0: 1, 2: 3}', |
+ const { const {} : |
+ 'MapConstant(<int, int>{IntConstant(0): IntConstant(1), ' |
+ 'IntConstant(2): IntConstant(3)})' }), |
+ const ConstantData( |
+ 'const bool.fromEnvironment("foo", defaultValue: false)', |
+ const { const {} : 'BoolConstant(false)', |
+ const {'foo': 'true'} : 'BoolConstant(true)'}), |
+ const ConstantData( |
+ 'const int.fromEnvironment("foo", defaultValue: 42)', |
+ const { const {} : 'IntConstant(42)', |
+ const {'foo': '87'} : 'IntConstant(87)'}), |
+ const ConstantData( |
+ 'const String.fromEnvironment("foo", defaultValue: "bar")', |
+ const { const {} : 'StringConstant("bar")', |
+ const {'foo': 'foo'} : 'StringConstant("foo")'}), |
+ ]), |
+ const TestData(''' |
+const a = const bool.fromEnvironment("foo", defaultValue: true); |
+const b = const int.fromEnvironment("bar", defaultValue: 42); |
+ |
+class A { |
+ const A(); |
+} |
+class B { |
+ final field1; |
+ const B(this.field1); |
+} |
+class C extends B { |
+ final field2; |
+ const C({field1: 42, this.field2: false}) : super(field1); |
+ const C.named([field = false]) : this(field1: field, field2: field); |
+} |
+''', const [ |
+ const ConstantData('const Object()', |
+ const { const {} : 'ConstructedConstant(Object())' }), |
+ const ConstantData('const A()', |
+ const { const {} : 'ConstructedConstant(A())' }), |
+ const ConstantData('const B(0)', |
+ const { const {} : 'ConstructedConstant(B(field1=IntConstant(0)))' }), |
+ const ConstantData('const B(const A())', |
+ const { const {} : |
+ 'ConstructedConstant(B(field1=ConstructedConstant(A())))' }), |
+ const ConstantData('const C()', const { const {} : |
+ 'ConstructedConstant(C(field1=IntConstant(42),' |
+ 'field2=BoolConstant(false)))' }), |
+ const ConstantData('const C(field1: 87)', const { const {} : |
+ 'ConstructedConstant(C(field1=IntConstant(87),' |
+ 'field2=BoolConstant(false)))' }), |
+ const ConstantData('const C(field2: true)', const { const {} : |
+ 'ConstructedConstant(C(field1=IntConstant(42),' |
+ 'field2=BoolConstant(true)))' }), |
+ const ConstantData('const C.named()', const { const {} : |
+ 'ConstructedConstant(C(field1=BoolConstant(false),' |
+ 'field2=BoolConstant(false)))' }), |
+ const ConstantData('const C.named(87)', const { const {} : |
+ 'ConstructedConstant(C(field1=IntConstant(87),' |
+ 'field2=IntConstant(87)))' }), |
+ const ConstantData('const C(field1: a, field2: b)', const { |
+ const {} : |
+ 'ConstructedConstant(C(field1=BoolConstant(true),' |
+ 'field2=IntConstant(42)))', |
+ const {'foo': 'false', 'bar': '87'} : |
+ 'ConstructedConstant(C(field1=BoolConstant(false),' |
+ 'field2=IntConstant(87)))', }), |
+ ]), |
+ const TestData(''' |
+class A<T> implements B { |
+ final field1; |
+ const A({this.field1:42}); |
+} |
+class B<S> implements C { |
+ const factory B({field1}) = A<B<S>>; |
+ const factory B.named() = A<S>; |
+} |
+class C<U> { |
+ const factory C({field1}) = A<B<double>>; |
+} |
+''', const [ |
+ const ConstantData('const A()', |
+ const { const {} : |
+ 'ConstructedConstant(A<dynamic>(field1=IntConstant(42)))' }), |
+ const ConstantData('const A<int>(field1: 87)', |
+ const { const {} : |
+ 'ConstructedConstant(A<int>(field1=IntConstant(87)))' }), |
+ const ConstantData('const B()', |
+ const { const {} : |
+ 'ConstructedConstant(A<B<dynamic>>(field1=IntConstant(42)))' }), |
+ const ConstantData('const B<int>()', |
+ const { const {} : |
+ 'ConstructedConstant(A<B<int>>(field1=IntConstant(42)))' }), |
+ const ConstantData('const B<int>(field1: 87)', |
+ const { const {} : |
+ 'ConstructedConstant(A<B<int>>(field1=IntConstant(87)))' }), |
+ const ConstantData('const C<int>(field1: 87)', |
+ const { const {} : |
+ 'ConstructedConstant(A<B<double>>(field1=IntConstant(87)))' }), |
+ const ConstantData('const B<int>.named()', |
+ const { const {} : |
+ 'ConstructedConstant(A<int>(field1=IntConstant(42)))' }), |
+ ]), |
+ const TestData(''' |
+const c = const int.fromEnvironment("foo", defaultValue: 5); |
+const d = const int.fromEnvironment("bar", defaultValue: 10); |
+ |
+class A { |
+ final field; |
+ const A(a, b) : field = a + b; |
+} |
+ |
+class B extends A { |
+ const B(a) : super(a, a * 2); |
+} |
+''', const [ |
+ const ConstantData('const A(c, d)', const { |
+ const {} : |
+ 'ConstructedConstant(A(field=IntConstant(15)))', |
+ const {'foo': '7', 'bar': '11'} : |
+ 'ConstructedConstant(A(field=IntConstant(18)))', }), |
+ const ConstantData('const B(d)', const { |
+ const {} : |
+ 'ConstructedConstant(B(field=IntConstant(30)))', |
+ const {'bar': '42'} : |
+ 'ConstructedConstant(B(field=IntConstant(126)))', }), |
+ ]), |
+]; |
+ |
+main() { |
+ asyncTest(() => Future.forEach(DATA, testData)); |
+} |
+ |
+Future testData(TestData data) { |
+ StringBuffer sb = new StringBuffer(); |
+ sb.write('${data.declarations}\n'); |
+ Map constants = {}; |
+ data.constants.forEach((ConstantData constantData) { |
+ String name = 'c${constants.length}'; |
+ sb.write('const $name = ${constantData.code};\n'); |
+ constants[name] = constantData; |
+ }); |
+ sb.write('main() {}\n'); |
+ String source = sb.toString(); |
+ Compiler compiler = compilerFor( |
+ {'main.dart': source}, options: ['--analyze-all']); |
+ return compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) { |
+ var library = compiler.mainApp; |
+ constants.forEach((String name, ConstantData data) { |
+ FieldElement field = library.localLookup(name); |
+ ConstantExpression constant = field.constant; |
+ data.expectedValues.forEach( |
+ (Map<String, String> env, String expectedText) { |
+ Environment environment = new MemoryEnvironment(compiler, env); |
+ ConstantValue value = |
+ constant.evaluate(environment, DART_CONSTANT_SYSTEM); |
+ String valueText = value.toStructuredString(); |
+ Expect.equals(expectedText, valueText, |
+ "Unexpected value '${valueText}' for contant " |
+ "`${constant.getText()}`, expected '${expectedText}'."); |
+ }); |
+ }); |
+ }); |
+} |