|  | // Copyright (c) 2012, 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"; | 
|  |  | 
|  | /** | 
|  | * Test various forms of function literals. | 
|  | */ | 
|  | typedef int IntFunc(int); | 
|  |  | 
|  | class FunctionLiteralsTest { | 
|  | static void checkIntFunction<T>(expected, int f(T x), arg) { | 
|  | Expect.equals(expected, f(arg)); | 
|  | } | 
|  |  | 
|  | static void checkIntFuncFunction<T>(expected, IntFunc f(T x), arg) { | 
|  | Expect.equals(expected, f(arg)(arg)); | 
|  | } | 
|  |  | 
|  | int func1(int x) => x; | 
|  |  | 
|  | int func2(x) => x; | 
|  |  | 
|  | int func3(int x) { | 
|  | return x; | 
|  | } | 
|  |  | 
|  | int func4(x) { | 
|  | return x; | 
|  | } | 
|  |  | 
|  | FunctionLiteralsTest() {} | 
|  |  | 
|  | static void testMain() { | 
|  | var test = new FunctionLiteralsTest(); | 
|  | test.testArrow(); | 
|  | test.testArrowArrow(); | 
|  | test.testArrowBlock(); | 
|  | test.testBlock(); | 
|  | test.testBlockArrow(); | 
|  | test.testBlockBlock(); | 
|  | test.testFunctionRef(); | 
|  | } | 
|  |  | 
|  | void testArrow() { | 
|  | checkIntFunction(42, (x) => x, 42); | 
|  | checkIntFunction(42, (dynamic x) => x, 42); | 
|  | } | 
|  |  | 
|  | void testArrowArrow() { | 
|  | checkIntFuncFunction(84, (x) => (y) => x + y, 42); | 
|  | checkIntFuncFunction(84, (dynamic x) => (y) => x + y, 42); | 
|  | } | 
|  |  | 
|  | void testArrowBlock() { | 
|  | checkIntFuncFunction( | 
|  | 84, | 
|  | (x) => (y) { | 
|  | return x + y; | 
|  | }, | 
|  | 42); | 
|  | checkIntFuncFunction( | 
|  | 84, | 
|  | (int x) => (y) { | 
|  | return x + y; | 
|  | }, | 
|  | 42); | 
|  | } | 
|  |  | 
|  | void testBlock() { | 
|  | checkIntFunction(42, (x) { | 
|  | return x; | 
|  | }, 42); | 
|  | checkIntFunction(42, (int x) { | 
|  | return x; | 
|  | }, 42); | 
|  | } | 
|  |  | 
|  | void testBlockArrow() { | 
|  | checkIntFuncFunction(84, (x) { | 
|  | return (y) => x + y; | 
|  | }, 42); | 
|  | checkIntFuncFunction(84, (int x) { | 
|  | return (y) => (x + y) as int; | 
|  | }, 42); | 
|  | } | 
|  |  | 
|  | void testBlockBlock() { | 
|  | checkIntFuncFunction(84, (x) { | 
|  | return (y) { | 
|  | return x + y; | 
|  | }; | 
|  | }, 42); | 
|  | checkIntFuncFunction(84, (int x) { | 
|  | return (y) { | 
|  | return x + y; | 
|  | }; | 
|  | }, 42); | 
|  | } | 
|  |  | 
|  | void testFunctionRef() { | 
|  | checkIntFunction(42, func1, 42); | 
|  | checkIntFunction(42, func2, 42); | 
|  | checkIntFunction(42, func3, 42); | 
|  | checkIntFunction(42, func4, 42); | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | FunctionLiteralsTest.testMain(); | 
|  | } |