// 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)));
}
