// 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;
import '../../language/static_type_helper.dart';

void main() {
  testIgnore();
}

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

  asyncStart();
  // Ignored futures can still be listened to.
  {
    var c = Completer<int>.sync();
    var f = c.future;
    f.ignore();
    asyncStart();
    f.catchError((e) {
      Expect.equals("ERROR1", e);
      asyncEnd();
      return 0;
    });
    c.completeError("ERROR1");
  }

  // Ignored futures are not uncaught errors.
  {
    asyncStart();
    bool threw = false;
    runZonedGuarded(() {
      var c = Completer<int>.sync();
      var f = c.future;
      f.ignore();
      c.completeError("ERROR2");
    }, (e, s) {
      threw = true;
      Expect.fail("Should not happen: $e");
    });
    Future.delayed(Duration.zero, () {
      if (threw) Expect.fail("Future not ignored.");
      asyncEnd();
    });
  }
  asyncEnd();
}
