blob: b1cb1db2687731529c69e0f5b143a75dfc27dddd [file] [log] [blame]
// 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();
}
'''),
]),
const Group('Try-catch', const <TestSpec>[
const TestSpec('''
main() {
try {} catch (e) {}
}
''',
// TODO(kmillikin): Remove the unused stack trace parameter.
'''
main() {
try {} catch (e, v0) {}
}
'''),
const TestSpec('''
main() {
try {
return;
} catch (e) {}
}
''',
// TODO(kmillikin): Remove the unused stack trace parameter and unneeded return
// statement(s).
'''
main() {
try {
return null;
} catch (e, v0) {
return null;
}
}
'''),
]),
];