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

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

import 'dart:async';

import 'package:expect/expect.dart';
import 'package:expect/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);
  });
}
