6c757957db
DDC's codegen test copies those files to a local "gen" directory so that it can do stuff like splitting out the multitests before it compiles them to JS. I left all of that alone, so the rest of DDC's test infrastructure is unchanged. The very first step that builds the "gen" directory just copies from sdk/tests/..._strong/... instead and the rest is good to go. I did not move not_yet_strong_tests.dart somewhere more accessible yet because I'm not sure if kernel needs it or where it should go. I did not create any status files because DDC doesn't need them and there are no test suites for the new directories for the other platforms.
552 lines
12 KiB
Dart
552 lines
12 KiB
Dart
// Copyright (c) 2011, 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.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
// Tests function statement and expression syntax.
|
|
|
|
class FunctionSyntaxTest {
|
|
|
|
static void testMain
|
|
/* /// 00: compile-time error
|
|
()
|
|
*/ /// 00: continued
|
|
{
|
|
testNestedFunctions();
|
|
testFunctionExpressions();
|
|
testPrecedence();
|
|
testInitializers();
|
|
testFunctionParameter();
|
|
testFunctionIdentifierExpression();
|
|
testFunctionIdentifierStatement();
|
|
}
|
|
|
|
static void testNestedFunctions
|
|
/* /// 01: compile-time error
|
|
()
|
|
*/ /// 01: continued
|
|
{
|
|
// No types - braces.
|
|
nb0
|
|
/* /// 02: compile-time error
|
|
()
|
|
*/ /// 02: continued
|
|
{ return 42; }
|
|
nb1
|
|
/* /// 03: compile-time error
|
|
(a)
|
|
*/ /// 03: continued
|
|
{ return a; }
|
|
nb2
|
|
/* /// 04: compile-time error
|
|
(a, b)
|
|
*/ /// 04: continued
|
|
{ return a + b; }
|
|
Expect.equals(42, nb0());
|
|
Expect.equals(87, nb1(87));
|
|
Expect.equals(1 + 2, nb2(1, 2));
|
|
|
|
// No types - arrows.
|
|
na0
|
|
/* /// 05: compile-time error
|
|
()
|
|
*/ /// 05: continued
|
|
=> 42;
|
|
na1
|
|
/* /// 06: compile-time error
|
|
(a)
|
|
*/ /// 06: continued
|
|
=> a;
|
|
na2
|
|
/* /// 07: compile-time error
|
|
(a, b)
|
|
*/ /// 07: continued
|
|
=> a + b;
|
|
Expect.equals(42, na0());
|
|
Expect.equals(87, na1(87));
|
|
Expect.equals(1 + 2, na2(1, 2));
|
|
|
|
// Return type - braces.
|
|
int rb0
|
|
/* /// 08: compile-time error
|
|
()
|
|
*/ /// 08: continued
|
|
{ return 42; }
|
|
int rb1
|
|
/* /// 09: compile-time error
|
|
(a)
|
|
*/ /// 09: continued
|
|
{ return a; }
|
|
int rb2
|
|
/* /// 10: compile-time error
|
|
(a, b)
|
|
*/ /// 10: continued
|
|
{ return a + b; }
|
|
Expect.equals(42, rb0());
|
|
Expect.equals(87, rb1(87));
|
|
Expect.equals(1 + 2, rb2(1, 2));
|
|
|
|
// Return type - arrows.
|
|
int ra0
|
|
/* /// 11: compile-time error
|
|
()
|
|
*/ /// 11: continued
|
|
=> 42;
|
|
int ra1
|
|
/* /// 12: compile-time error
|
|
(a)
|
|
*/ /// 12: continued
|
|
=> a;
|
|
int ra2
|
|
/* /// 13: compile-time error
|
|
(a, b)
|
|
*/ /// 13: continued
|
|
=> a + b;
|
|
Expect.equals(42, ra0());
|
|
Expect.equals(87, ra1(87));
|
|
Expect.equals(1 + 2, ra2(1, 2));
|
|
|
|
// Fully typed - braces.
|
|
int fb1
|
|
/* /// 14: compile-time error
|
|
(int a)
|
|
*/ /// 14: continued
|
|
{ return a; }
|
|
int fb2
|
|
/* /// 15: compile-time error
|
|
(int a, int b)
|
|
*/ /// 15: continued
|
|
{ return a + b; }
|
|
Expect.equals(42, rb0());
|
|
Expect.equals(87, rb1(87));
|
|
Expect.equals(1 + 2, rb2(1, 2));
|
|
|
|
// Fully typed - arrows.
|
|
int fa1
|
|
/* /// 16: compile-time error
|
|
(int a)
|
|
*/ /// 16: continued
|
|
=> a;
|
|
int fa2
|
|
/* /// 17: compile-time error
|
|
(int a, int b)
|
|
*/ /// 17: continued
|
|
=> a + b;
|
|
Expect.equals(42, ra0());
|
|
Expect.equals(87, ra1(87));
|
|
Expect.equals(1 + 2, ra2(1, 2));
|
|
|
|
// Generic types - braces.
|
|
List<int> gb0
|
|
/* /// 18: compile-time error
|
|
()
|
|
*/ /// 18: continued
|
|
{ return [42]; }
|
|
List<int> gb1
|
|
/* /// 19: compile-time error
|
|
(List<int> a)
|
|
*/ /// 19: continued
|
|
{ return a; }
|
|
Expect.equals(42, gb0()[0]);
|
|
Expect.equals(87, gb1([87])[0]);
|
|
|
|
// Generic types - arrows.
|
|
List<int> ga0
|
|
/* /// 20: compile-time error
|
|
()
|
|
*/ /// 20: continued
|
|
=> [42];
|
|
List<int> ga1
|
|
/* /// 21: compile-time error
|
|
(List<int> a)
|
|
*/ /// 21: continued
|
|
=> a;
|
|
Expect.equals(42, ga0()[0]);
|
|
Expect.equals(87, ga1([87])[0]);
|
|
}
|
|
|
|
static void testFunctionExpressions
|
|
/* /// 22: compile-time error
|
|
()
|
|
*/ /// 22: continued
|
|
{
|
|
eval0
|
|
/* /// 23: compile-time error
|
|
(fn)
|
|
*/ /// 23: continued
|
|
=> fn();
|
|
eval1
|
|
/* /// 24: compile-time error
|
|
(fn, a)
|
|
*/ /// 24: continued
|
|
=> fn(a);
|
|
eval2
|
|
/* /// 25: compile-time error
|
|
(fn, a, b)
|
|
*/ /// 25: continued
|
|
=> fn(a, b);
|
|
|
|
// No types - braces.
|
|
Expect.equals(42, eval0(
|
|
/* /// 26: compile-time error
|
|
()
|
|
*/ /// 26: continued
|
|
{ return 42; }));
|
|
Expect.equals(87, eval1(
|
|
/* /// 27: compile-time error
|
|
(a)
|
|
*/ /// 27: continued
|
|
{ return a; }, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 28: compile-time error
|
|
(a, b)
|
|
*/ /// 28: continued
|
|
{ return a + b; }, 1, 2));
|
|
Expect.equals(42, eval0(
|
|
/* /// 29: compile-time error
|
|
()
|
|
*/ /// 29: continued
|
|
{ return 42; }));
|
|
Expect.equals(87, eval1(
|
|
/* /// 30: compile-time error
|
|
(a)
|
|
*/ /// 30: continued
|
|
{ return a; }, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 31: compile-time error
|
|
(a, b)
|
|
*/ /// 31: continued
|
|
{ return a + b; }, 1, 2));
|
|
|
|
// No types - arrows.
|
|
Expect.equals(42, eval0(
|
|
/* /// 32: compile-time error
|
|
()
|
|
*/ /// 32: continued
|
|
=> 42));
|
|
Expect.equals(87, eval1(
|
|
/* /// 33: compile-time error
|
|
(a)
|
|
*/ /// 33: continued
|
|
=> a, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 34: compile-time error
|
|
(a, b)
|
|
*/ /// 34: continued
|
|
=> a + b, 1, 2));
|
|
Expect.equals(42, eval0(
|
|
/* /// 35: compile-time error
|
|
()
|
|
*/ /// 35: continued
|
|
=> 42));
|
|
Expect.equals(87, eval1(
|
|
/* /// 36: compile-time error
|
|
(a)
|
|
*/ /// 36: continued
|
|
=> a, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 37: compile-time error
|
|
(a, b)
|
|
*/ /// 37: continued
|
|
=> a + b, 1, 2));
|
|
|
|
// Argument types - braces.
|
|
Expect.equals(42, eval0(
|
|
/* /// 44: compile-time error
|
|
()
|
|
*/ /// 44: continued
|
|
{ return 42; }));
|
|
Expect.equals(87, eval1(
|
|
/* /// 45: compile-time error
|
|
(int a)
|
|
*/ /// 45: continued
|
|
{ return a; }, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 46: compile-time error
|
|
(int a, int b)
|
|
*/ /// 46: continued
|
|
{ return a + b; }, 1, 2));
|
|
Expect.equals(42, eval0(
|
|
/* /// 47: compile-time error
|
|
()
|
|
*/ /// 47: continued
|
|
{ return 42; }));
|
|
Expect.equals(87, eval1(
|
|
/* /// 48: compile-time error
|
|
(int a)
|
|
*/ /// 48: continued
|
|
{ return a; }, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 49: compile-time error
|
|
(int a, int b)
|
|
*/ /// 49: continued
|
|
{ return a + b; }, 1, 2));
|
|
|
|
// Argument types - arrows.
|
|
Expect.equals(42, eval0(
|
|
/* /// 50: compile-time error
|
|
()
|
|
*/ /// 50: continued
|
|
=> 42));
|
|
Expect.equals(87, eval1(
|
|
/* /// 51: compile-time error
|
|
(int a)
|
|
*/ /// 51: continued
|
|
=> a, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 52: compile-time error
|
|
(int a, int b)
|
|
*/ /// 52: continued
|
|
=> a + b, 1, 2));
|
|
Expect.equals(42, eval0(
|
|
/* /// 53: compile-time error
|
|
()
|
|
*/ /// 53: continued
|
|
=> 42));
|
|
Expect.equals(87, eval1(
|
|
/* /// 54: compile-time error
|
|
(int a)
|
|
*/ /// 54: continued
|
|
=> a, 87));
|
|
Expect.equals(1 + 2, eval2(
|
|
/* /// 55: compile-time error
|
|
(int a, int b)
|
|
*/ /// 55: continued
|
|
=> a + b, 1, 2));
|
|
|
|
}
|
|
|
|
static void testPrecedence
|
|
/* /// 64: compile-time error
|
|
()
|
|
*/ /// 64: continued
|
|
{
|
|
expectEvaluatesTo
|
|
/* /// 65: compile-time error
|
|
(value, fn)
|
|
*/ /// 65: continued
|
|
{ Expect.equals(value, fn()); }
|
|
|
|
// Assignment.
|
|
var x;
|
|
expectEvaluatesTo(42, ()=> x = 42);
|
|
Expect.equals(42, x);
|
|
x = 1;
|
|
expectEvaluatesTo(100, ()=> x += 99);
|
|
Expect.equals(100, x);
|
|
x = 1;
|
|
expectEvaluatesTo(87, ()=> x *= 87);
|
|
Expect.equals(87, x);
|
|
|
|
// Conditional.
|
|
expectEvaluatesTo(42, ()=> true ? 42 : 87);
|
|
expectEvaluatesTo(87, ()=> false ? 42 : 87);
|
|
|
|
// Logical or.
|
|
expectEvaluatesTo(true, ()=> true || true);
|
|
expectEvaluatesTo(true, ()=> true || false);
|
|
expectEvaluatesTo(true, ()=> false || true);
|
|
expectEvaluatesTo(false, ()=> false || false);
|
|
|
|
// Logical and.
|
|
expectEvaluatesTo(true, ()=> true && true);
|
|
expectEvaluatesTo(false, ()=> true && false);
|
|
expectEvaluatesTo(false, ()=> false && true);
|
|
expectEvaluatesTo(false, ()=> false && false);
|
|
|
|
// Bitwise operations.
|
|
expectEvaluatesTo(3, ()=> 1 | 2);
|
|
expectEvaluatesTo(2, ()=> 3 ^ 1);
|
|
expectEvaluatesTo(1, ()=> 3 & 1);
|
|
|
|
// Equality.
|
|
expectEvaluatesTo(true, ()=> 1 == 1);
|
|
expectEvaluatesTo(false, ()=> 1 != 1);
|
|
expectEvaluatesTo(true, ()=> identical(1, 1));
|
|
expectEvaluatesTo(false, ()=> !identical(1, 1));
|
|
|
|
// Relational.
|
|
expectEvaluatesTo(true, ()=> 1 <= 1);
|
|
expectEvaluatesTo(false, ()=> 1 < 1);
|
|
expectEvaluatesTo(false, ()=> 1 > 1);
|
|
expectEvaluatesTo(true, ()=> 1 >= 1);
|
|
|
|
// Is.
|
|
expectEvaluatesTo(true, ()=> 1 is int);
|
|
expectEvaluatesTo(true, ()=> 1.0 is double);
|
|
|
|
// Shift.
|
|
expectEvaluatesTo(2, ()=> 1 << 1);
|
|
expectEvaluatesTo(1, ()=> 2 >> 1);
|
|
|
|
// Additive.
|
|
expectEvaluatesTo(2, ()=> 1 + 1);
|
|
expectEvaluatesTo(1, ()=> 2 - 1);
|
|
|
|
// Multiplicative.
|
|
expectEvaluatesTo(2, ()=> 1 * 2);
|
|
expectEvaluatesTo(2.0, ()=> 4 / 2);
|
|
expectEvaluatesTo(2, ()=> 4 ~/ 2);
|
|
expectEvaluatesTo(0, ()=> 4 % 2);
|
|
|
|
// Negate.
|
|
expectEvaluatesTo(false, ()=> !true);
|
|
|
|
// Postfix / prefix.
|
|
var y = 0;
|
|
expectEvaluatesTo(0, ()=> y++);
|
|
expectEvaluatesTo(2, ()=> ++y);
|
|
expectEvaluatesTo(1, ()=> --y);
|
|
expectEvaluatesTo(1, ()=> y--);
|
|
Expect.equals(0, y);
|
|
|
|
// Selector.
|
|
fn
|
|
/* /// 66: compile-time error
|
|
()
|
|
*/ /// 66: continued
|
|
=> 42;
|
|
var list = [87];
|
|
expectEvaluatesTo(42, ()=> fn());
|
|
expectEvaluatesTo(1, ()=> list.length);
|
|
expectEvaluatesTo(87, ()=> list[0]);
|
|
expectEvaluatesTo(87, ()=> list.removeLast());
|
|
}
|
|
|
|
static void testInitializers
|
|
/* /// 67: compile-time error
|
|
()
|
|
*/ /// 67: continued
|
|
{
|
|
Expect.equals(42, (new C.cb0().fn)());
|
|
Expect.equals(43, (new C.ca0().fn)());
|
|
Expect.equals(44, (new C.cb1().fn)());
|
|
Expect.equals(45, (new C.ca1().fn)());
|
|
Expect.equals(46, (new C.cb2().fn)());
|
|
Expect.equals(47, (new C.ca2().fn)());
|
|
Expect.equals(48, (new C.cb3().fn)());
|
|
Expect.equals(49, (new C.ca3().fn)());
|
|
|
|
Expect.equals(52, (new C.nb0().fn)());
|
|
Expect.equals(53, (new C.na0().fn)());
|
|
Expect.equals(54, (new C.nb1().fn)());
|
|
Expect.equals(55, (new C.na1().fn)());
|
|
Expect.equals(56, (new C.nb2().fn)());
|
|
Expect.equals(57, (new C.na2().fn)());
|
|
Expect.equals(58, (new C.nb3().fn)());
|
|
Expect.equals(59, (new C.na3().fn)());
|
|
|
|
Expect.equals(62, (new C.rb0().fn)());
|
|
Expect.equals(63, (new C.ra0().fn)());
|
|
Expect.equals(64, (new C.rb1().fn)());
|
|
Expect.equals(65, (new C.ra1().fn)());
|
|
Expect.equals(66, (new C.rb2().fn)());
|
|
Expect.equals(67, (new C.ra2().fn)());
|
|
Expect.equals(68, (new C.rb3().fn)());
|
|
Expect.equals(69, (new C.ra3().fn)());
|
|
}
|
|
|
|
static void testFunctionParameter
|
|
/* /// 68: compile-time error
|
|
()
|
|
*/ /// 68: continued
|
|
{
|
|
f0(fn()) => fn();
|
|
Expect.equals(42, f0(()=> 42));
|
|
|
|
f1(int fn()) => fn();
|
|
Expect.equals(87, f1(()=> 87));
|
|
|
|
f2(fn(a)) => fn(42);
|
|
Expect.equals(43, f2((a)=> a + 1));
|
|
|
|
f3(fn(int a)) => fn(42);
|
|
Expect.equals(44, f3((int a)=> a + 2));
|
|
}
|
|
|
|
static void testFunctionIdentifierExpression
|
|
/* /// 69: compile-time error
|
|
()
|
|
*/ /// 69: continued
|
|
{
|
|
Expect.equals(87, (
|
|
/* /// 70: compile-time error
|
|
()
|
|
*/ /// 70: continued
|
|
=> 87)());
|
|
}
|
|
|
|
static void testFunctionIdentifierStatement
|
|
/* /// 71: compile-time error
|
|
()
|
|
*/ /// 71: continued
|
|
{
|
|
function
|
|
/* /// 72: compile-time error
|
|
()
|
|
*/ /// 72: continued
|
|
=> 42;
|
|
Expect.equals(42, function());
|
|
Expect.equals(true, function is Function);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class C {
|
|
|
|
C.cb0() : fn = (() { return 42; }) { }
|
|
C.ca0() : fn = (() => 43) { }
|
|
|
|
C.cb1() : fn = wrap(() { return 44; }) { }
|
|
C.ca1() : fn = wrap(()=> 45) { }
|
|
|
|
C.cb2() : fn = [() { return 46; }][0] { }
|
|
C.ca2() : fn = [() => 47][0] { }
|
|
|
|
C.cb3() : fn = {'x': () { return 48; }}['x'] { }
|
|
C.ca3() : fn = {'x': () => 49}['x'] { }
|
|
|
|
C.nb0() : fn = (() { return 52; }) { }
|
|
C.na0() : fn = (() => 53) { }
|
|
|
|
C.nb1() : fn = wrap(() { return 54; }) { }
|
|
C.na1() : fn = wrap(()=> 55) { }
|
|
|
|
C.nb2() : fn = [() { return 56; }][0] { }
|
|
C.na2() : fn = [() => 57][0] { }
|
|
|
|
C.nb3() : fn = {'x': () { return 58; }}['x'] { }
|
|
C.na3() : fn = {'x': () => 59}['x'] { }
|
|
|
|
C.rb0() : fn = (() { return 62; }) { }
|
|
C.ra0() : fn = (() => 63) { }
|
|
|
|
C.rb1() : fn = wrap(() { return 64; }) { }
|
|
C.ra1() : fn = wrap(()=> 65) { }
|
|
|
|
C.rb2() : fn = [() { return 66; }][0] { }
|
|
C.ra2() : fn = [() => 67][0] { }
|
|
|
|
C.rb3() : fn = {'x': () { return 68; }}['x'] { }
|
|
C.ra3() : fn = {'x': () => 69}['x'] { }
|
|
|
|
static wrap
|
|
/* /// 73: compile-time error
|
|
(fn)
|
|
*/ /// 73: continued
|
|
{ return fn; }
|
|
|
|
final fn;
|
|
|
|
}
|
|
|
|
main
|
|
/* /// 74: compile-time error
|
|
()
|
|
*/ /// 74: continued
|
|
{
|
|
FunctionSyntaxTest.testMain();
|
|
}
|