// Copyright (c) 2013, 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:expect/async_helper.dart";
import "package:expect/expect.dart";

import 'dart:async';

main() {
  asyncStart(2);
  () async {
    var it = new StreamIterator(new Stream.fromIterable([]));
    Expect.isFalse(await it.moveNext());

    late Future nullFuture;
    late Future falseFuture;

    runZoned(
      () {
        nullFuture =
            (new StreamController()..stream.listen(null).cancel()).done;
        falseFuture = it.moveNext();
      },
      zoneSpecification: new ZoneSpecification(
        scheduleMicrotask:
            (Zone self, ZoneDelegate parent, Zone zone, void f()) {
              Expect.fail("Should not be called");
            },
      ),
    );

    nullFuture.then((value) {
      Expect.isNull(value);
      asyncEnd();
    });

    falseFuture.then((value) {
      Expect.isFalse(value);
      asyncEnd();
    });
  }();
}
