// 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.runtimeIsType<int>(n);
    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();
  });
}
