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

import 'dart:async';

import 'package:expect/expect.dart';

typedef FunctionType = void Function();
typedef GenericFunctionType<T> = T Function(T);

test<T>(o) {
  if (o case FunctionType(:var hashCode)) {
    print(hashCode);
    return 1;
  }
  if (o case GenericFunctionType<int>(:var hashCode)) {
    print(hashCode);
    return 2;
  }
  if (o case GenericFunctionType<String>(:var hashCode)) {
    print(hashCode);
    return 3;
  }
  if (o case GenericFunctionType<T>(:var hashCode)) {
    print(hashCode);
    return 4;
  }
  if (o case GenericFunctionType(:var hashCode)) {
    print(hashCode);
    return 5;
  }
  if (o case Null(:var hashCode)) {
    print(hashCode);
    return 6;
  }
  if (o case FutureOr<int>(:var hashCode)) {
    print(hashCode);
    return 7;
  }
  if (o case dynamic(:var hashCode)) {
    print(hashCode);
    return 0;
  }
  return -1;
}

void function() {}
int intFunction(int i) => i;
String stringFunction(String s) => s;
bool boolFunction(bool b) => b;
dynamic dynamicFunction(dynamic d) => d;
void multiArgFunction(int i, String s) {}

main() {
  Expect.equals(1, test(function));
  Expect.equals(2, test(intFunction));
  Expect.equals(3, test(stringFunction));
  Expect.equals(4, test<bool>(boolFunction));
  Expect.equals(0, test(boolFunction));
  Expect.equals(0, test<num>(boolFunction));
  Expect.equals(4, test(dynamicFunction));
  Expect.equals(4, test<dynamic>(dynamicFunction));
  Expect.equals(5, test<bool>(dynamicFunction));
  Expect.equals(0, test(multiArgFunction));
  Expect.equals(6, test(null));
  Expect.equals(7, test(0));
  Expect.equals(7, test(new Future<int>.value(0)));
}
