// 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 int writeByteSync(int value)
/// Synchronously writes a single byte to the file. Returns the number of bytes
/// successfully written.
///
/// Throws a FileSystemException if the operation fails.
///
/// @description Checks that method writeByteSync synchronously writes a single
/// byte to the file and returns the number of bytes successfully written.
/// @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.equals(0, file.lengthSync());
    List<int> list = new List<int>.filled(10, 0);
    var n = rf.writeByteSync(0);
    Expect.isTrue(n is int);
    Expect.equals(1, n);
    Expect.equals(1, rf.lengthSync());
    for (int i = 1; i < 10; i++) {
      n = rf.writeByteSync(i);
      Expect.equals(1, n);
      Expect.equals(i + 1, rf.lengthSync());
    }
    rf.setPositionSync(0);
    rf.readIntoSync(list);
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], list);
    asyncEnd();
    rf.closeSync();
  }).whenComplete(() {
    file.deleteSync();
  });
}
