/*
 * Copyright (c) 2017, 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.
 */
/**
 * @assertion
 * Future<RandomAccessFile> writeFrom(
 *     List<int> buffer, [
 *     int start = 0,
 *     int end
 * ])
 * Writes from a List<int> to the file. It will read the buffer from index start
 * to index end. If start is omitted, it'll start from index 0. If end is
 * omitted, it will write to end of buffer.
 *
 * @description Checks that method writeFrom writes from a List<int> to file
 * from index start to index end and if start is omitted, it starts from
 * index 0.
 * @author ngl@unipro.ru
 */
import "dart:async";
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

void check(int len) {
  List<int> list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  File file = getTempFileSync();
  asyncStart();
  Future<RandomAccessFile> raFile = file.open(mode: FileMode.write);
  raFile.then((RandomAccessFile rf) {
    Expect.equals(0, file.lengthSync());
    var f = rf.writeFrom(list.sublist(0, len));
    f.then((RandomAccessFile file) {
      Expect.equals(len, file.lengthSync());
      rf.setPositionSync(0);
      List<int> l = file.readSync(len);
      for (int i = 0; i < len; i++) {
        Expect.isTrue(i == l[i]);
      }
      asyncEnd();
    }).whenComplete(() {
      rf.closeSync();
      file.deleteSync();
    });
  });
}

main() {
  for (int i = 0; i < 11; i++) {
    check(i);
  }
}
