// 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 static methods
/// @author a.semenov@unipro.ru

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

// f() async => expression;
class A {
  static Future<String> a1() async => 'a1';

  static Future a2() async => 0;

  static Future<int> a3() async => 1;
}

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

  static Future b2() async {
    return 2;
  }

  static Future<int> b3() async {
    return 3;
  }
}
// f(arg) async => expression;
class C {
  static Future<String> c1(int x) async => 'c' + x.toString();

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

  static Future c3(z) async => z;
}

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

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

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