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

// Test the basic StreamController and StreamController.singleSubscription.
library stream_join_test;

import 'dart:async';
import 'event_helper.dart';
import 'package:test/test.dart';
import "package:expect/expect.dart";

main() {
  test("join-empty", () {
    StreamController c = new StreamController();
    c.stream.join("X").then(expectAsync((String s) => expect(s, equals(""))));
    c.close();
  });

  test("join-single", () {
    StreamController c = new StreamController();
    c.stream
        .join("X")
        .then(expectAsync((String s) => expect(s, equals("foo"))));
    c.add("foo");
    c.close();
  });

  test("join-three", () {
    StreamController c = new StreamController();
    c.stream
        .join("X")
        .then(expectAsync((String s) => expect(s, equals("fooXbarXbaz"))));
    c.add("foo");
    c.add("bar");
    c.add("baz");
    c.close();
  });

  test("join-three-non-string", () {
    StreamController c = new StreamController();
    c.stream
        .join("X")
        .then(expectAsync((String s) => expect(s, equals("fooXbarXbaz"))));
    c.add(new Foo("foo"));
    c.add(new Foo("bar"));
    c.add(new Foo("baz"));
    c.close();
  });

  test("join-error", () {
    StreamController c = new StreamController();
    c.stream
        .join("X")
        .catchError(expectAsync((String s) => expect(s, equals("BAD!"))));
    c.add(new Foo("foo"));
    c.add(new Foo("bar"));
    c.add(new Bad());
    c.add(new Foo("baz"));
    c.close();
  });
}

class Foo {
  String value;
  Foo(this.value);
  String toString() => value;
}

class Bad {
  Bad();
  String toString() => throw "BAD!";
}
