|  | // 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(); | 
|  | } |