// Copyright (c) 2020, 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
import 'dart:async';
import 'dart:isolate';

import 'package:expect/expect.dart';

class A<T> {}

main(args) async {
  final x = A<void Function()>();

  {
    final caughtErrorCompleter = Completer<String>();
    await runZonedGuarded(() {
      Isolate.spawn(isolate, x);
    }, (e, s) {
      caughtErrorCompleter.complete(e.toString());
    });
    Expect.equals(
        await caughtErrorCompleter.future,
        "Invalid argument(s): Illegal argument in isolate message : "
        "(object is a FunctionType)");
  }

  void genericFunc<T>() async {
    final y = A<void Function(T)>();
    final caughtErrorCompleter = Completer<String>();
    await runZoned(() {
      Isolate.spawn(isolate, y);
    }, onError: (e) {
      caughtErrorCompleter.complete(e.toString());
    });
    Expect.equals(
        await caughtErrorCompleter.future,
        "Invalid argument(s): Illegal argument in isolate message : "
        "(object is a FunctionType)");
  }

  await genericFunc<int>();
}

void isolate(A foo) async {
  print('Tick: ${foo}');
}
