// 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.

// SharedOptions=--enable-experiment=patterns

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