// 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 'package:expect/async_minitest.dart';

import 'stream_state_helper.dart';

const ms5 = const Duration(milliseconds: 5);

// Testing pause/resume, some with non-zero duration. This only makes sense for
// non-broadcast streams, since broadcast stream subscriptions handle their
// own pauses.

main() {
  var p = "StreamController";

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

  test("$p-sub-data/pause-done", () {
    var t = new StreamProtocolTest();
    t
      ..expectListen()
      ..expectData(42, () {
        t.pause(new Future.delayed(ms5, () => null));
      })
      ..expectPause()
      ..expectCancel()
      ..expectDone(t.terminate);
    // 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();
    t
      ..expectListen()
      ..expectData(42, () {
        t.pause(new Future.delayed(ms5, () => null));
      })
      ..expectPause()
      ..expectResume(t.close)
      ..expectCancel()
      ..expectDone(t.terminate);
    t
      ..listen()
      ..add(42);
  });

  test("$p-sub-data/data+pause-data-resume-done", () {
    var t = new StreamProtocolTest();
    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)
      ..expectCancel()
      ..expectDone(t.terminate);
    t
      ..listen()
      ..add(42);
  });

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