// 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<int> position()
/// Gets the current byte position in the file. Returns a Future<int> that
/// completes with the position.
///
/// @description Checks that method position returns Future<int> that completes
/// with the current byte position in the file.
/// @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);
    }
    var rfPos = rf.position();
    Expect.isTrue(rfPos is Future<int>);
    rfPos.then((int pos) {
      Expect.isTrue(pos is int);
      Expect.isTrue(pos == 10);
    }).whenComplete(() {
      rf.setPositionSync(5);
      rfPos = rf.position();
      Expect.isTrue(rfPos is Future<int>);
      rfPos.then((int pos) {
        Expect.isTrue(pos is int);
        Expect.isTrue(pos == 5);
        asyncEnd();
      }).whenComplete(() {
        rf.closeSync();
        file.deleteSync();
      });
    });
  });
}
