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

// @dart = 2.9

// 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:async_helper/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);
  });
}
