// Copyright (c) 2016, 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

/// @assertion Functions include function declarations, methods, getters,
/// setters, constructors and function literals.
/// All functions have a signature and a body.
/// functionSignature:
///   metadata returnType? identifier formalParameterList
/// ;
/// returnType: void | type
/// ;
/// functionBody:
///   async? '=>' expression ';' | (async | async* | sync*)? block
/// ;
/// block:
///   '{' statements '}'
/// ;
///
/// @description Checks different valid variants of asynchronous functions
/// @author a.semenov@unipro.ru

import 'dart:async';
import '../../Utils/expect.dart';

// f() async => expression;
Future<String> a1() async => 'a1';

Future a2() async => 0;

Future a3() async => 1;

// f() { statements }
Future<String> b1() async {
  return 'b1';
}

Future b2() async {
  return 2;
}

Future b3() async {
  return 3;
}

// f(arg) async => expression;
Future<String> c1(int x) async => 'c' + x.toString();

Future c2(String y) async => y.length;

Future c3(z) async => z;

// f(arg) { statements }
Future<String> d1(int x) async {
  return 'd' + x.toString();
}

Future d2(String y) async {
  return y.length;
}

Future d3(z) async {
  return z;
}

main() {
  asyncStart();
  Future.wait([
    a1(), a2(), a3(),
    b1(), b2(), b3(),
    c1(10), c2('hello'), c3(c3),
    d1(15), d2('world'), d3(d3)
  ]).then((_) { asyncEnd(); } );
}
