| // 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. |
| |
| // @dart = 2.9 |
| |
| 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(); |
| } |