// Copyright (c) 2021, 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 'package:async_helper/async_helper.dart';
import "package:expect/expect.dart";
import 'dart:async' show Completer, runZonedGuarded, unawaited;
import 'dart:async' as prefix;
import '../../language/static_type_helper.dart';

void main() {
  testUnawaited();
}

void testUnawaited() {
  // Exists where expected.
  prefix.unawaited.expectStaticType<Exactly<void Function(Future<Object?>)>>();

  var future = Future<int>.value(42);
  captureStaticType(unawaited(future), <T>(value) {
    Expect.equals(typeOf<void>(), T);
  });

  asyncStart();
  // Unawaited futures still throw.
  {
    var c = Completer<int>();
    var f = c.future;
    unawaited(f);
    asyncStart();
    f.catchError((e) {
      Expect.equals("ERROR1", e);
      asyncEnd();
      return 0;
    });
    c.completeError("ERROR1");
  }
  // Unawaited futures are still uncaught errors.
  {
    asyncStart();
    runZonedGuarded(() {
      var c = Completer<int>();
      var f = c.future;
      unawaited(f);
      c.completeError("ERROR2");
    }, (e, s) {
      Expect.equals("ERROR2", e);
      asyncEnd();
    });
  }
  asyncEnd();
}
