// Copyright (c) 2023, 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<File> rename(String newPath)
/// Renames this file. Returns a `Future<File>` that completes with a [File]
/// instance for the renamed file.
///
/// If [newPath] is a relative path, it is resolved against the current working
/// directory ([Directory.current]). This means that simply changing the name of
/// a file, but keeping it the original directory, requires creating a new
/// complete path with the new name at the end. Example:
/// ```dart
/// Future<File> changeFileNameOnly(File file, String newFileName) {
///   var path = file.path;
///   var lastSeparator = path.lastIndexOf(Platform.pathSeparator);
///   var newPath = path.substring(0, lastSeparator + 1) + newFileName;
///   return file.rename(newPath);
/// }
/// ```
/// On some platforms, a rename operation cannot move a file between different
/// file systems. If that is the case, instead [copy] the file to the new
/// location and then remove the original.
///
/// If [newPath] identifies an existing file or link, that entity is removed
/// first. If [newPath] identifies an existing directory, the operation fails
/// and the future completes with a [FileSystemException]
///
/// @note Shortly:
/// - [File]/[Link] `rename/renameSync` can replace other [File]/[Link] but not
///   [Directory]
/// - [Directory] `rename/renameSync` can not replace an existing
///   [File]/[Link]/[Directory] except on POSIX where it can replace an empty
///   [Directory]
///
/// @description Checks that if [newPath] identifies an existing link to a
/// directory, that link is replaced
/// @author sgrekhov22@gmail.com
/// @issue 53583

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

main() async {
  await inSandbox(_main);
}

void _main(Directory sandbox) async {
  File file = getTempFileSync(parent: sandbox);
  Link link = getTempLinkSync(parent: sandbox, target: sandbox.path);
  file.writeAsStringSync("Source");

  asyncStart();
  await file.rename(link.path).then((renamed) {
    Expect.equals(link.path, renamed.path);
    Expect.isTrue(renamed.existsSync());
    Expect.equals("Source", renamed.readAsStringSync());
    Expect.isFalse(file.existsSync());
    Expect.isFalse(link.existsSync());
    asyncEnd();
  });
}
