// 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<String> resolveSymbolicLinks()
/// Resolves the path of a file system object relative to the current working
/// directory, resolving all symbolic links on the path and resolving
/// all .. and . path segments.
///
/// resolveSymbolicLinks uses the operating system's native file system API to
/// resolve the path, using the realpath function on linux and OS X, and the
/// GetFinalPathNameByHandle function on Windows. If the path does not point to
/// an existing file system object, resolveSymbolicLinks throws a
/// FileSystemException.
///
/// On Windows the .. segments are resolved before resolving the symbolic link,
/// and on other platforms the symbolic links are resolved to their target before
/// applying a .. that follows.
/// @description Check that this method resolves the path of a file system object
/// relative to the current working directory, resolving all symbolic links on
/// the path and resolving all .. and . path segments
/// @author sgrekhov@unipro.ru

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

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

_main(Directory sandbox) async {
  // create 2 Directories
  Directory dir1 = getTempDirectorySync(parent: sandbox);
  Directory dir2 = getTempDirectorySync(parent: sandbox);
  String dir2Name = getEntityName(dir2);

  // create file in dir2
  File file = getTempFileSync(parent: dir2);

  var rnd = new Random(new DateTime.now().microsecondsSinceEpoch);
  // create link to the directory dir1
  Link link1 = getTempLinkSync(
      parent: sandbox,
      target: dir1.path,
      name: "link1.lnk");
  // in dir1 create link to dir1
  Link link2 = getTempLinkSync(
      parent: dir1,
      target: ".",
      name: "link2.lnk");
  // in dir1 create link to dir2
  Link link3 = getTempLinkSync(
      parent: dir1,
      target: ".." + Platform.pathSeparator + dir2Name,
      name: "link3.lnk");

  // Try to access file following the links
  String path = link1.path +
      Platform.pathSeparator +
      getEntityName(link2) +
      Platform.pathSeparator +
      getEntityName(link3) +
      Platform.pathSeparator +
      getEntityName(file);
  File f = new File(path);

  asyncStart();
  await f.resolveSymbolicLinks().then((String path) {
    Expect.equals(file.path, path);
    asyncEnd();
  });
}
