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

import "dart:async";
import "dart:io";

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

void testPauseResumeCancelStream() {
  asyncStart();
  Directory.systemTemp.createTemp('dart_file_stream').then((d) {
    var file = new File("${d.path}/file");
    new File(Platform.executable)
        .openRead()
        .cast<List<int>>()
        .pipe(file.openWrite())
        .then((_) {
      var subscription;
      subscription = file.openRead().listen((data) {
        subscription.pause();
        subscription.resume();
        void close() {
          d.deleteSync(recursive: true);
          asyncEnd();
        }

        var future = subscription.cancel();
        if (future != null) {
          future.whenComplete(close);
        } else {
          close();
        }
      }, onDone: () {
        Expect.fail('the stream was canceled, onDone should not happen');
      });
    });
  });
}

void testStreamIsEmpty() {
  asyncStart();
  Directory.systemTemp.createTemp('dart_file_stream').then((d) {
    var file = new File("${d.path}/file");
    new File(Platform.executable)
        .openRead()
        .cast<List<int>>()
        .pipe(file.openWrite())
        .then((_) {
      // isEmpty will cancel the stream after first data event.
      file.openRead().isEmpty.then((empty) {
        Expect.isFalse(empty);
        d.deleteSync(recursive: true);
        asyncEnd();
      });
    });
  });
}

Future<void> testStreamAppendedToAfterOpen() async {
  asyncStart();

  final pipe = Pipe.createSync();
  pipe.write.add("Hello World".codeUnits);
  int i = 0;
  await pipe.read.listen((event) {
    Expect.listEquals("Hello World".codeUnits, event);
    if (i < 10) {
      pipe.write.add("Hello World".codeUnits);
      ++i;
    } else {
      pipe.write.close();
    }
  }).asFuture();

  asyncEnd();
}

void main() async {
  testPauseResumeCancelStream();
  testStreamIsEmpty();
  await testStreamAppendedToAfterOpen();
}
