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

// @dart = 2.9

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