// 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<int> readInto(List<int> buffer, [int start = 0, int end])
/// Reads into an existing List<int> from the file. If start is present, the
/// bytes will be filled into buffer from at index start, otherwise index 0. If
/// end is present, the end - start bytes will be read into buffer, otherwise up
/// to buffer.length. If end == start nothing happens.
///
/// @description Checks that method readInto reads into an existing List<int>
/// from the file, and if start is not set the bytes are filled into buffer at
/// index 0.
/// @author ngl@unipro.ru

import "dart:async";
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

main() {
  File file = getTempFileSync();
  asyncStart();
  Future<RandomAccessFile> raFile = file.open(mode: FileMode.write);
  raFile.then((RandomAccessFile rf) {
    Expect.isNotNull(rf);
    for (int i = 0; i < 10; i++) {
      rf.writeByteSync((i + 1) & 0xff);
    }
    List<int> list = new List<int>.filled(20, 0);
    rf.setPositionSync(0);
    var num = rf.readInto(list);
    Expect.isTrue(num is Future<int>);

    num.then((int n) {
      Expect.isTrue(n is int);
      for (int i = 0; i < n; i++) {
        Expect.equals((i + 1) & 0xff, list[i]);
      }
      asyncEnd();
    }).whenComplete(() {
      rf.closeSync();
      file.deleteSync();
    });
  });
}
