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

// @dart = 2.9

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