// 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 "../../../pkg/unittest/lib/unittest.dart";
import "stream_state_helper.dart";

const ms5 = const Duration(milliseconds: 5);

main() {
  mainTest(false);
  mainTest(true);
}

mainTest(bool broadcast) {
  var p = broadcast ? "BC" : "SC";
  test("$p-sub-data-done", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42)
     ..expectDone()
     ..expectSubscription(false, false);
    t..subscribe()..add(42)..close();
  });

  test("$p-data-done-sub", () {
    var t = new StreamProtocolTest(broadcast);
    if (broadcast) {
      t..expectDone();
    } else {
      t..expectSubscription(true, false)
       ..expectData(42)
       ..expectDone()
       ..expectSubscription(false, false);
    }
    t..add(42)..close()..subscribe();
  });

  test("$p-sub-data/pause+resume-done", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42, () {
         t.pause();
         t.resume();
         t.close();
       })
     ..expectDone()
     ..expectSubscription(false, false);
    t..subscribe()..add(42);
  });

  test("$p-sub-data-unsubonerror", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42)
     ..expectError("bad")
     ..expectSubscription(false, !broadcast);
    t..subscribe(unsubscribeOnError: true)
     ..add(42)
     ..error("bad")
     ..add(43)
     ..close();
  });

  test("$p-sub-data-no-unsubonerror", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42)
     ..expectError("bad")
     ..expectData(43)
     ..expectDone()
     ..expectSubscription(false, false);
    t..subscribe(unsubscribeOnError: false)
     ..add(42)
     ..error("bad")
     ..add(43)
     ..close();
  });

  test("$p-pause-resume-during-event", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42, () {
       t.pause();
       t.resume();
     })
     ..expectDone()
     ..expectSubscription(false, false);
    t..subscribe()
     ..add(42)
     ..close();
  });

  test("$p-cancel-sub-during-event", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42, () {
       t.cancel();
       t.subscribe();
     })
     ..expectData(43)
     ..expectDone()
     ..expectSubscription(false, false);
    t..subscribe()
     ..add(42)
     ..add(43)
     ..close();
  });

  test("$p-cancel-sub-during-callback", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectData(42, () {
       t.pause();
     })
     ..expectPause(true, () {
       t.cancel();  // Cancels pause
       t.subscribe();
     })
     ..expectPause(false)
     ..expectData(43)
     ..expectDone()
     ..expectSubscription(false, false);
    t..subscribe()
     ..add(42)
     ..add(43)
     ..close();
  });

  test("$p-sub-after-done-is-done", () {
    var t = new StreamProtocolTest(broadcast);
    t..expectSubscription(true, false)
     ..expectDone()
     ..expectSubscription(false, false)
     ..expectDone();
    t..subscribe()
     ..close()
     ..subscribe();  // Subscribe after done does not cause callbacks at all.
  });
}
