// 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 StreamSubscription.cancel return Future.
library stream_subscription_cancel;

import 'dart:async';

import 'package:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use

void main() {
  test('subscription.cancel', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    expect(
      controller.stream.listen(null).cancel().then((_) => done),
      completion(equals(true)),
    );

    Timer.run(() {
      done = true;
      completer.complete();
    });
  });

  test('subscription.cancel after close', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () {
        completer.complete();
        return completer.future;
      },
    );

    controller.close();

    var completer2 = new Completer();
    var sub;
    void onDone() {
      sub.cancel().then(completer2.complete);
    }

    sub = controller.stream.listen(null, onDone: onDone);
    expect(completer.future, completes);
    expect(completer2.future, completes);
  });

  test('subscription.cancel after error', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    controller.addError("error");

    bool done = false;

    var subscription;
    var doneCompleter = new Completer();
    void onError(e) {
      subscription.cancel().then((_) => doneCompleter.complete(done));
      done = true;
      completer.complete();
    }

    subscription = controller.stream.listen(null, onError: onError);
    expect(doneCompleter.future, completion(equals(true)));
  });

  test('subscription.cancel after error (cancelOnError)', () {
    bool called = false;
    StreamController controller = new StreamController(
      onCancel: () {
        called = true;
      },
    );

    controller.addError("error");

    var doneCompleter = new Completer();
    void onError(e) {
      expect(called, equals(true));
      doneCompleter.complete(true);
    }

    controller.stream.listen(null, onError: onError, cancelOnError: true);
    expect(doneCompleter.future, completion(equals(true)));
  });

  test('subscription.cancel before error (cancelOnError)', () {
    var doneCompleter = new Completer();
    StreamController controller = new StreamController(
      onCancel: () {
        doneCompleter.complete(true);
      },
    );

    controller.addError("error");

    void onError(e) {
      fail("onError is unexpected");
    }

    controller.stream
        .listen(null, onError: onError, cancelOnError: true)
        .cancel();
    expect(doneCompleter.future, completion(equals(true)));
  });

  test('subscription.cancel on error (cancelOnError)', () {
    bool called = false;
    StreamController controller = new StreamController(
      onCancel: () {
        expect(called, isFalse);
        called = true;
      },
    );

    controller.addError("error");

    var doneCompleter = new Completer();
    var sub;
    void onError(e) {
      expect(called, equals(true));
      sub.cancel();
      doneCompleter.complete(true);
    }

    sub = controller.stream.listen(null, onError: onError, cancelOnError: true);
    expect(doneCompleter.future, completion(equals(true)));
  });

  test('subscription.cancel before done', () {
    var doneCompleter = new Completer();
    StreamController controller = new StreamController(
      onCancel: () {
        doneCompleter.complete(true);
      },
    );

    controller.close();

    void onDone() {
      fail("onDone is unexpected");
    }

    controller.stream.listen(null, onDone: onDone).cancel();
    expect(doneCompleter.future, completion(equals(true)));
  });

  test('subscription.cancel through map', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.map((x) => x).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through asyncMap', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.asyncMap((x) => x).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through asyncExpand', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.asyncExpand((x) => x).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through handleError', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.handleError((x) => x).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through skip', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.skip(1).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through take', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.take(1).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through skipWhile', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.skipWhile((x) => true).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through takeWhile', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.takeWhile((x) => true).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through timeOut', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var duration = const Duration(hours: 5);
    var future = controller.stream.timeout(duration).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through transform', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var transformer = new StreamTransformer.fromHandlers(handleData: (x, y) {});
    var future = controller.stream.transform(transformer).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });

  test('subscription.cancel through where', () {
    var completer = new Completer();
    StreamController controller = new StreamController(
      onCancel: () => completer.future,
    );

    bool done = false;
    var future = controller.stream.where((x) => true).listen(null).cancel();

    expect(future.then((_) => done = true), completion(equals(true)));

    Timer.run(() {
      expect(done, isFalse);
      completer.complete();
    });
  });
}
