| // 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. | |
| // Formatting can break multitests, so don't format them. | |
| // dart format off | |
| 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(); | |
| } |