// Copyright (c) 2011, 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

// Test the Stream.single method.
library stream_single_test;

import 'dart:async';

import 'package:expect/expect.dart';
import 'package:async_helper/async_minitest.dart';

import 'event_helper.dart';

main() {
  test("single", () {
    StreamController c = new StreamController(sync: true);
    Future f = c.stream.single;
    f.then(expectAsync((v) {
      Expect.equals(42, v);
    }));
    new Events.fromIterable([42]).replay(c);
  });

  test("single empty", () {
    StreamController c = new StreamController(sync: true);
    Future f = c.stream.single;
    f.catchError(expectAsync((error) {
      Expect.isTrue(error is StateError);
    }));
    new Events.fromIterable([]).replay(c);
  });

  test("single error", () {
    StreamController c = new StreamController(sync: true);
    Future f = c.stream.single;
    f.catchError(expectAsync((error) {
      Expect.equals("error", error);
    }));
    Events errorEvents = new Events()
      ..error("error")
      ..close();
    errorEvents.replay(c);
  });

  test("single error 2", () {
    StreamController c = new StreamController(sync: true);
    Future f = c.stream.single;
    f.catchError(expectAsync((error) {
      Expect.equals("error", error);
    }));
    Events errorEvents = new Events()
      ..error("error")
      ..error("error2")
      ..close();
    errorEvents.replay(c);
  });

  test("single error 3", () {
    StreamController c = new StreamController(sync: true);
    Future f = c.stream.single;
    f.catchError(expectAsync((error) {
      Expect.equals("error", error);
    }));
    Events errorEvents = new Events()
      ..add(499)
      ..error("error")
      ..close();
    errorEvents.replay(c);
  });
}
