blob: 3baf2dfc5cf92060d39fb0cc19bc4569a0acc001 [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: syntax error
()
*/ //# 00: continued
{
testNestedFunctions();
testFunctionExpressions();
testPrecedence();
testInitializers();
testFunctionParameter();
testFunctionIdentifierExpression();
testFunctionIdentifierStatement();
}
static void testNestedFunctions
/* //# 01: syntax error
()
*/ //# 01: continued
{
// No types - braces.
nb0
/* //# 02: syntax error
()
*/ //# 02: continued
{
return 42;
}
nb1
/* //# 03: syntax error
(a)
*/ //# 03: continued
{
return a;
}
nb2
/* //# 04: syntax 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: syntax error
()
*/ //# 05: continued
=>
42;
na1
/* //# 06: syntax error
(a)
*/ //# 06: continued
=>
a;
na2
/* //# 07: syntax 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: syntax error
()
*/ //# 08: continued
{
return 42;
}
int rb1
/* //# 09: syntax error
(a)
*/ //# 09: continued
{
return a;
}
int rb2
/* //# 10: syntax 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: syntax error
()
*/ //# 11: continued
=>
42;
int ra1
/* //# 12: syntax error
(a)
*/ //# 12: continued
=>
a;
int ra2
/* //# 13: syntax 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: syntax error
(int a)
*/ //# 14: continued
{
return a;
}
int fb2
/* //# 15: syntax 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: syntax error
(int a)
*/ //# 16: continued
=>
a;
int fa2
/* //# 17: syntax 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: syntax error
()
*/ //# 18: continued
{
return [42];
}
List<int> gb1
/* //# 19: syntax 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: syntax error
()
*/ //# 20: continued
=>
[42];
List<int> ga1
/* //# 21: syntax error
(List<int> a)
*/ //# 21: continued
=>
a;
Expect.equals(42, ga0()[0]);
Expect.equals(87, ga1([87])[0]);
}
static void testFunctionExpressions
/* //# 22: syntax error
()
*/ //# 22: continued
{
eval0
/* //# 23: syntax error
(fn)
*/ //# 23: continued
=>
fn();
eval1
/* //# 24: syntax error
(fn, a)
*/ //# 24: continued
=>
fn(a);
eval2
/* //# 25: syntax error
(fn, a, b)
*/ //# 25: continued
=>
fn(a, b);
// No types - braces.
Expect.equals(42, eval0(
/* //# 26: syntax error
()
*/ //# 26: continued
{
return 42;
}));
Expect.equals(
87,
eval1(
/* //# 27: syntax error
(a)
*/ //# 27: continued
{
return a;
}, 87));
Expect.equals(
1 + 2,
eval2(
/* //# 28: syntax error
(a, b)
*/ //# 28: continued
{
return a + b;
}, 1, 2));
Expect.equals(42, eval0(
/* //# 29: syntax error
()
*/ //# 29: continued
{
return 42;
}));
Expect.equals(
87,
eval1(
/* //# 30: syntax error
(a)
*/ //# 30: continued
{
return a;
}, 87));
Expect.equals(
1 + 2,
eval2(
/* //# 31: syntax error
(a, b)
*/ //# 31: continued
{
return a + b;
}, 1, 2));
// No types - arrows.
Expect.equals(
42,
eval0(
/* //# 32: syntax error
()
*/ //# 32: continued
=>
42));
Expect.equals(
87,
eval1(
/* //# 33: syntax error
(a)
*/ //# 33: continued
=>
a,
87));
Expect.equals(
1 + 2,
eval2(
/* //# 34: syntax error
(a, b)
*/ //# 34: continued
=>
a + b,
1,
2));
Expect.equals(
42,
eval0(
/* //# 35: syntax error
()
*/ //# 35: continued
=>
42));
Expect.equals(
87,
eval1(
/* //# 36: syntax error
(a)
*/ //# 36: continued
=>
a,
87));
Expect.equals(
1 + 2,
eval2(
/* //# 37: syntax error
(a, b)
*/ //# 37: continued
=>
a + b,
1,
2));
// Argument types - braces.
Expect.equals(42, eval0(
/* //# 44: syntax error
()
*/ //# 44: continued
{
return 42;
}));
Expect.equals(
87,
eval1(
/* //# 45: syntax error
(int a)
*/ //# 45: continued
{
return a;
}, 87));
Expect.equals(
1 + 2,
eval2(
/* //# 46: syntax error
(int a, int b)
*/ //# 46: continued
{
return a + b;
}, 1, 2));
Expect.equals(42, eval0(
/* //# 47: syntax error
()
*/ //# 47: continued
{
return 42;
}));
Expect.equals(
87,
eval1(
/* //# 48: syntax error
(int a)
*/ //# 48: continued
{
return a;
}, 87));
Expect.equals(
1 + 2,
eval2(
/* //# 49: syntax error
(int a, int b)
*/ //# 49: continued
{
return a + b;
}, 1, 2));
// Argument types - arrows.
Expect.equals(
42,
eval0(
/* //# 50: syntax error
()
*/ //# 50: continued
=>
42));
Expect.equals(
87,
eval1(
/* //# 51: syntax error
(int a)
*/ //# 51: continued
=>
a,
87));
Expect.equals(
1 + 2,
eval2(
/* //# 52: syntax error
(int a, int b)
*/ //# 52: continued
=>
a + b,
1,
2));
Expect.equals(
42,
eval0(
/* //# 53: syntax error
()
*/ //# 53: continued
=>
42));
Expect.equals(
87,
eval1(
/* //# 54: syntax error
(int a)
*/ //# 54: continued
=>
a,
87));
Expect.equals(
1 + 2,
eval2(
/* //# 55: syntax error
(int a, int b)
*/ //# 55: continued
=>
a + b,
1,
2));
}
static void testPrecedence
/* //# 64: syntax error
()
*/ //# 64: continued
{
expectEvaluatesTo
/* //# 65: syntax 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: syntax 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: syntax 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: syntax 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: syntax error
()
*/ //# 69: continued
{
Expect.equals(
87,
(
/* //# 70: syntax error
()
*/ //# 70: continued
=>
87)());
}
static void testFunctionIdentifierStatement
/* //# 71: syntax error
()
*/ //# 71: continued
{
function
/* //# 72: syntax 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: syntax error
(fn)
*/ //# 73: continued
{
return fn;
}
final fn;
}
main
/* //# 74: syntax error
()
*/ //# 74: continued
{
FunctionSyntaxTest.testMain();
}