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

library stream_transform_test;

import 'dart:async';

import 'package:expect/expect.dart';
import 'package:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use

import 'event_helper.dart';

main() {
  // Regression tests for http://dartbug.com/8310 and 8311

  test("simpleDone", () {
    StreamController c = new StreamController(sync: true);
    Stream out = c.stream.handleError((x) {}).handleError((x) {});
    out.listen((v) {}, onDone: expectAsync(() {}));
    // Should not throw.
    c.close();
  });

  test("with events", () {
    StreamController c = new StreamController(sync: true);
    Events expected = new Events.fromIterable([10, 12]);
    Events input = new Events.fromIterable([1, 2, 3, 4, 5, 6, 7]);
    Events actual = new Events.capture(
      c.stream.map((x) => x * 2).where((x) => x > 5).skip(2).take(2),
    );
    actual.onDone(
      expectAsync(() {
        Expect.listEquals(expected.events, actual.events);
      }),
    );
    input.replay(c);
  });

  test("paused events", () {
    StreamController c = new StreamController(sync: true);
    Events expected = new Events.fromIterable([10, 12]);
    Events input = new Events.fromIterable([1, 2, 3, 4, 5, 6, 7]);
    Events actual = new Events.capture(
      c.stream.map((x) => x * 2).where((x) => x > 5).skip(2).take(2),
    );
    actual.onDone(
      expectAsync(() {
        Expect.listEquals(expected.events, actual.events);
      }),
    );
    actual.pause();
    input.replay(c);
    actual.resume();
  });

  test("closing after done", () {
    var controller = new StreamController(sync: true);
    controller.stream
        .map((e) => e)
        .transform(
          new StreamTransformer.fromHandlers(
            handleData: (element, sink) {
              sink.add(element);
            },
            handleDone: (sink) {
              sink.close();
            },
          ),
        )
        .listen(expectAsync((e) => expect(e, equals("foo"))));

    controller.add("foo");
    // Should not crash.
    controller.close();
  });
}
