blob: ff96445a07c3be33c68b8d94efa0dc389578023f [file] [log] [blame]
// 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();
}