// 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> unlock([int start = 0, int end = -1])
/// Unlocks the file or part of the file.
///
/// Unlocks the byte range from start to end of the file, with the byte at
/// position end not included. If no arguments are specified, the full file is
/// unlocked, If only start is specified the file is unlocked from byte position
/// start to the end of the file.
///
/// @description Checks that method unlock unlocks the byte range from start to
/// end of the file, with the byte at position end not included.
/// @author ngl@unipro.ru

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

runMain() {
  File file = getTempFileSync();
  var rf1 = file.openSync(mode: FileMode.write);
  var rf2 = file.openSync(mode: FileMode.write);
  rf1.writeFromSync(new List.filled(30, 0));
  asyncStart();
  rf1.lockSync(FileLock.exclusive, 10, 15);
  rf2.lockSync(FileLock.exclusive, 20, 25);
  String eScript = Platform.script.toString();
  var tests = [
    () => checkLocked(eScript, rf1.path, 10, 15),
    () => checkLocked(eScript, rf1.path, 20, 25),
    () => checkUnlocked(eScript, rf1.path, 0, 10),
    () => checkUnlocked(eScript, rf1.path, 15, 20),
    () => checkUnlocked(eScript, rf1.path, 25, 30)
  ];
  Future.forEach(tests, (Function f) => f()).whenComplete(() {
    var rf1Unlock = rf1.unlock(10, 15);
    rf1Unlock.then((RandomAccessFile f) {
      var tests = [
        () => checkUnlocked(eScript, rf1.path, 10, 15),
        () => checkLocked(eScript, rf1.path, 20, 25),
        () => checkUnlocked(eScript, rf1.path, 0, 20),
        () => checkUnlocked(eScript, rf1.path, 25, 30)
      ];
      Future.forEach(tests, (Function f) => f()).whenComplete(() {
        asyncEnd();
        if (Platform.isWindows) {
          rf2.unlockSync(20, 25);
        } else {
          rf2.unlockSync();
        }
        rf1.closeSync();
        rf2.closeSync();
        file.deleteSync();
      });
    });
  });
}

main(List<String> args) {
  if(args.length > 0)
    runProcess(args);
  else {
    runMain();
  }
}
