// 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 event/callback protocol of the stream implementations.
library stream_state_test;

import "package:unittest/unittest.dart";
import "stream_state_helper.dart";

const ms5 = const Duration(milliseconds: 5);

main() {
  mainTest(sync: true, asBroadcast: false);
  mainTest(sync: true, asBroadcast: true);
  mainTest(sync: false, asBroadcast: false);
  mainTest(sync: false, asBroadcast: true);
}

void terminateWithDone(t, asBroadcast) {
  if (asBroadcast) {
    t
      ..expectCancel()
      ..expectDone()
      ..expectBroadcastCancel((_) => t.terminate());
  } else {
    t
      ..expectCancel()
      ..expectDone(t.terminate);
  }
}

mainTest({bool sync, bool asBroadcast}) {
  var p = (sync ? "S" : "AS") + (asBroadcast ? "BC" : "SC");
  test("$p-sub-data-done", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42);
    terminateWithDone(t, asBroadcast);
    t
      ..listen()
      ..add(42)
      ..close();
  });

  test("$p-data-done-sub-sync", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42);
    terminateWithDone(t, asBroadcast);
    t
      ..add(42)
      ..close()
      ..listen();
  });

  test("$p-data-done-sub-async", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42);
    terminateWithDone(t, asBroadcast);
    t
      ..add(42)
      ..close()
      ..listen();
  });

  test("$p-sub-data/pause+resume-done", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42, () {
        t.pause();
        t.resume();
        t.close();
      });
    terminateWithDone(t, asBroadcast);
    t
      ..listen()
      ..add(42);
  });

  test("$p-sub-data-unsubonerror", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    if (asBroadcast) {
      t
        ..expectListen()
        ..expectBroadcastListen()
        ..expectData(42)
        ..expectError("bad")
        ..expectBroadcastCancel()
        ..expectCancel(t.terminate);
    } else {
      t
        ..expectListen()
        ..expectData(42)
        ..expectCancel()
        ..expectError("bad", t.terminate);
    }
    t
      ..listen(cancelOnError: true)
      ..add(42)
      ..error("bad")
      ..add(43)
      ..close();
  });

  test("$p-sub-data-no-unsubonerror", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42)
      ..expectError("bad")
      ..expectData(43);
    terminateWithDone(t, asBroadcast);
    t
      ..listen(cancelOnError: false)
      ..add(42)
      ..error("bad")
      ..add(43)
      ..close();
  });

  test("$p-pause-resume-during-event", () {
    var t = asBroadcast
        ? new StreamProtocolTest.broadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42, () {
        t.pause();
        t.resume();
      });
    if (!asBroadcast && !sync) {
      t..expectPause();
    }
    if (asBroadcast && sync) {
      t
        ..expectDone()
        ..expectCancel(t.terminate);
    } else {
      t
        ..expectCancel()
        ..expectDone(t.terminate);
    }
    t
      ..listen()
      ..add(42)
      ..close();
  });

  test("$p-cancel-on-data", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectData(42, t.cancel)
      ..expectBroadcastCancelOpt()
      ..expectCancel(t.terminate);
    t
      ..listen(cancelOnError: false)
      ..add(42)
      ..close();
  });

  test("$p-cancel-on-error", () {
    var t = asBroadcast
        ? new StreamProtocolTest.asBroadcast(sync: sync)
        : new StreamProtocolTest(sync: sync);
    t
      ..expectListen()
      ..expectBroadcastListenOpt()
      ..expectError(42, t.cancel)
      ..expectBroadcastCancelOpt()
      ..expectCancel(t.terminate);
    t
      ..listen(cancelOnError: false)
      ..error(42)
      ..close();
  });
}
