986ce5c39c
BUG= R=paulberry@google.com, sigurdm@google.com Review URL: https://codereview.chromium.org//900403003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43652 260f80e4-7a28-3924-810f-c04153c831b5
871 lines
10 KiB
Dart
871 lines
10 KiB
Dart
// Copyright (c) 2014, 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.
|
|
|
|
/// Test data for the end2end test.
|
|
library test.end2end.data;
|
|
|
|
import 'test_helper.dart';
|
|
|
|
class TestSpec extends TestSpecBase {
|
|
final String output;
|
|
|
|
const TestSpec(String input, [String output])
|
|
: this.output = output != null ? output : input,
|
|
super(input);
|
|
}
|
|
|
|
const List<Group> TEST_DATA = const <Group>[
|
|
const Group('Empty main', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {}
|
|
foo() {}
|
|
''', '''
|
|
main() {}
|
|
'''),
|
|
]),
|
|
const Group('Simple call-chains', const <TestSpec>[
|
|
const TestSpec('''
|
|
foo() {}
|
|
main() {
|
|
foo();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
bar() {}
|
|
foo() {
|
|
bar();
|
|
}
|
|
main() {
|
|
foo();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
bar() {
|
|
main();
|
|
}
|
|
foo() {
|
|
bar();
|
|
}
|
|
main() {
|
|
foo();
|
|
}
|
|
'''),
|
|
|
|
]),
|
|
const Group('Literals', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
return 0;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return 1.5;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return true;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return false;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return "a";
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return "a" "b";
|
|
}
|
|
''', '''
|
|
main() {
|
|
return "ab";
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Parameters', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(args) {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a, b) {}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Typed parameters', const <TestSpec>[
|
|
const TestSpec('''
|
|
void main(args) {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(int a, String b) {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(Comparator a, List b) {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(Comparator<dynamic> a, List<dynamic> b) {}
|
|
''','''
|
|
main(Comparator a, List b) {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(Map a, Map<dynamic, List<int>> b) {}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Pass arguments', const <TestSpec>[
|
|
const TestSpec('''
|
|
foo(a) {}
|
|
main() {
|
|
foo(null);
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
bar(b, c) {}
|
|
foo(a) {}
|
|
main() {
|
|
foo(null);
|
|
bar(0, "");
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
bar(b) {}
|
|
foo(a) {
|
|
bar(a);
|
|
}
|
|
main() {
|
|
foo(null);
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Top level field', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(args) {
|
|
return deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
var field;
|
|
main(args) {
|
|
return field;
|
|
}
|
|
'''),
|
|
|
|
// TODO(johnniwinther): Eliminate unneeded `null` initializers.
|
|
const TestSpec('''
|
|
var field = null;
|
|
main(args) {
|
|
return field;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
var field = 0;
|
|
main(args) {
|
|
return field;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
var field;
|
|
main(args) {
|
|
field = args.length;
|
|
return field;
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Local variables', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
var a;
|
|
return a;
|
|
}
|
|
''','''
|
|
main() {}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
var a = 0;
|
|
return a;
|
|
}
|
|
''','''
|
|
main() {
|
|
return 0;
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Local variable writes', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
var a;
|
|
a = 10;
|
|
return a;
|
|
}
|
|
''', '''
|
|
main() {
|
|
return 10;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
var a = 0;
|
|
a = 10;
|
|
return a;
|
|
}
|
|
''', '''
|
|
main() {
|
|
return 10;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
var a = 0;
|
|
print(a);
|
|
a = "";
|
|
print(a);
|
|
return a;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
print(a);
|
|
a = "";
|
|
print(a);
|
|
return a;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
if (a) {
|
|
a = "";
|
|
}
|
|
print(a);
|
|
return a;
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Dynamic access', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a.foo;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
var a = "";
|
|
return a.foo;
|
|
}
|
|
''','''
|
|
main() {
|
|
return "".foo;
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Dynamic invocation', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a.foo(0);
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
var a = "";
|
|
return a.foo(0, 1);
|
|
}
|
|
''','''
|
|
main() {
|
|
return "".foo(0, 1);
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Binary expressions', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a + deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a - deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a * deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a / deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a ~/ deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a % deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a < deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a <= deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a > deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a >= deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a << deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a >> deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a & deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a | deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a ^ deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a == deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a != deprecated;
|
|
}
|
|
''','''
|
|
main(a) {
|
|
return !(a == deprecated);
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a && deprecated;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a || deprecated;
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('If statement', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
if (a) {
|
|
print(0);
|
|
}
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
if (a) {
|
|
print(0);
|
|
} else {
|
|
print(1);
|
|
}
|
|
}
|
|
''','''
|
|
main(a) {
|
|
a ? print(0) : print(1);
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
if (a) {
|
|
print(0);
|
|
} else {
|
|
print(1);
|
|
print(2);
|
|
}
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Conditional expression', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a ? print(0) : print(1);
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
// These test that unreachable statements are skipped within a block.
|
|
const Group('Block statements', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
return 0;
|
|
return 1;
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return 0;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
if (a) {
|
|
return 0;
|
|
return 1;
|
|
} else {
|
|
return 2;
|
|
return 3;
|
|
}
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return a ? 0 : 2;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
if (a) {
|
|
print(0);
|
|
return 0;
|
|
return 1;
|
|
} else {
|
|
print(2);
|
|
return 2;
|
|
return 3;
|
|
}
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
if (a) {
|
|
print(0);
|
|
return 0;
|
|
} else {
|
|
print(2);
|
|
return 2;
|
|
}
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('List literal', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
return [];
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return <int>[];
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return <int>[0];
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return <int>[0, 1, a];
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return [0, [1], [a, <int>[3]]];
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Constructor invocation', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
new Object();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
new Deprecated("");
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Map literal', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
return {};
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return <int, String>{};
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
return <String, int>{"a": 0};
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return <String, int>{"a": 0, "b": 1, "c": a};
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return {0: "a", 1: {2: "b"}, a: {3: "c"}};
|
|
}
|
|
'''),
|
|
]),
|
|
const Group('For loop', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
for (;;) {}
|
|
}
|
|
''', '''
|
|
main() {
|
|
while (true) {}
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
for (var i = 0; i < 10; i = i + 1) {
|
|
print(i);
|
|
}
|
|
}
|
|
''', '''
|
|
main() {
|
|
var i = 0;
|
|
while (i < 10) {
|
|
print(i);
|
|
++i;
|
|
}
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(i) {
|
|
for (i = 0; i < 10; i = i + 1) {
|
|
print(i);
|
|
}
|
|
}
|
|
''', '''
|
|
main(i) {
|
|
i = 0;
|
|
while (i < 10) {
|
|
print(i);
|
|
++i;
|
|
}
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('While loop', const <TestSpec>[
|
|
const TestSpec('''
|
|
main() {
|
|
while (true) {}
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main() {
|
|
var i = 0;
|
|
while (i < 10) {
|
|
print(i);
|
|
i = i + 1;
|
|
}
|
|
}''', '''
|
|
main() {
|
|
var i = 0;
|
|
while (i < 10) {
|
|
print(i);
|
|
++i;
|
|
}
|
|
}'''),
|
|
]),
|
|
|
|
const Group('Type operators', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a is String;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a is List<String>;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a is Comparator<String>;
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a is! String;
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return !(a is String);
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return a as String;
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('For in loop', const <TestSpec>[
|
|
// TODO(johnniwinther): Add tests for `i` as top-level, static and instance
|
|
// fields.
|
|
const TestSpec('''
|
|
main(a) {
|
|
for (var i in a) {
|
|
print(i);
|
|
}
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
var v0 = a.iterator;
|
|
while (v0.moveNext()) {
|
|
print(v0.current);
|
|
}
|
|
}'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
for (var i in a) {
|
|
print(i);
|
|
i = 0;
|
|
print(i);
|
|
}
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
var v0 = a.iterator, i;
|
|
while (v0.moveNext()) {
|
|
i = v0.current;
|
|
print(i);
|
|
i = 0;
|
|
print(i);
|
|
}
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
var i;
|
|
for (i in a) {
|
|
print(i);
|
|
}
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
var v0 = a.iterator;
|
|
while (v0.moveNext()) {
|
|
print(v0.current);
|
|
}
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Local functions', const <TestSpec>[
|
|
const TestSpec('''
|
|
main(a) {
|
|
local() {}
|
|
return local();
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return (() {})();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
local() {}
|
|
var l = local;
|
|
return l();
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return (() {})();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
return () {}();
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return (() {})();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
main(a) {
|
|
var c = a ? () { return 0; } : () { return 1; };
|
|
return c();
|
|
}
|
|
''', '''
|
|
main(a) {
|
|
return (a ? () {
|
|
return 0;
|
|
} : () {
|
|
return 1;
|
|
})();
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Constructors', const <TestSpec>[
|
|
const TestSpec('''
|
|
class C {}
|
|
main() {
|
|
return new C();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
class C {
|
|
C() {}
|
|
}
|
|
main() {
|
|
return new C();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
class B {}
|
|
class C extends B {
|
|
C() {}
|
|
}
|
|
main() {
|
|
return new C();
|
|
}
|
|
'''),
|
|
|
|
const TestSpec('''
|
|
class B {
|
|
B() {}
|
|
}
|
|
class C extends B {}
|
|
main() {
|
|
return new C();
|
|
}
|
|
'''),
|
|
]),
|
|
|
|
const Group('Instance method', const <TestSpec>[
|
|
const TestSpec('''
|
|
class C {
|
|
C() {}
|
|
foo() {}
|
|
}
|
|
main() {
|
|
return new C().foo();
|
|
}
|
|
'''),
|
|
]),
|
|
];
|