// 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.
// Uses a non-zero timer so it fails on d8.

library stream_state_nonzero_timer_test;

import "dart:async";
import "../../../pkg/unittest/lib/unittest.dart";
import "stream_state_helper.dart";

const ms5 = const Duration(milliseconds: 5);

main() {
  mainTest(false);
  // TODO(floitsch): reenable?
  // mainTest(true);
}

mainTest(bool broadcast) {
  var p = broadcast ? "BC" : "SC";

  test("$p-sub-data/pause/resume/pause/resume-done", () {
    var t = new StreamProtocolTest(broadcast: broadcast);
    t..expectListen()
     ..expectData(42, () {
         t.pause();
       })
     ..expectPause(() { t.resume(); })
     ..expectResume(() { t.pause(); })
     ..expectPause(() { t.resume(); })
     ..expectResume(() { t.close(); })
     ..expectDone()
     ..expectCancel();
    t..listen()..add(42);
  });

  test("$p-sub-data/pause-done", () {
    var t = new StreamProtocolTest(broadcast: broadcast);
    t..expectListen()
     ..expectData(42, () {
         t.pause(new Future.delayed(ms5, () => null));
       })
     ..expectPause()
     ..expectDone()
     ..expectCancel();
     // We are calling "close" while the controller is actually paused,
     // and it will stay paused until the pending events are sent.
    t..listen()..add(42)..close();
  });

  test("$p-sub-data/pause-resume/done", () {
    var t = new StreamProtocolTest(broadcast: broadcast);
    t..expectListen()
     ..expectData(42, () {
         t.pause(new Future.delayed(ms5, () => null));
       })
     ..expectPause()
     ..expectResume(t.close)
     ..expectDone()
     ..expectCancel();
    t..listen()..add(42);
  });

  test("$p-sub-data/data+pause-data-resume-done", () {
    var t = new StreamProtocolTest(broadcast: broadcast);
    t..expectListen()
     ..expectData(42, () {
         t.add(43);
         t.pause(new Future.delayed(ms5, () => null));
         // Should now be paused until the future finishes.
         // After that, the controller stays paused until the pending queue
         // is empty.
       })
     ..expectPause()
     ..expectData(43)
     ..expectResume(t.close)
     ..expectDone()
     ..expectCancel();
    t..listen()..add(42);
  });

  test("$p-pause-during-callback", () {
    var t = new StreamProtocolTest(broadcast: broadcast);
    t..expectListen()
     ..expectData(42, () {
       t.pause();
     })
     ..expectPause(() {
       t.resume();
     })
     ..expectResume(() {
       t.pause();
       t.resume();
       t.close();
     })
     ..expectDone()
     ..expectCancel();
    t..listen()
     ..add(42);
  });
}
