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

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();
    });
  });
}
