// 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 void createSync(
///  String target, {
///  bool recursive: false
///  })
///  Synchronously create the link. Calling createSync on an existing link will
///  throw an exception.
///
///  If recursive is false, the default, the link is created only if all
///  directories in its path exist. If recursive is true, all non-existing path
///  components are created. The directories in the path of target are not
///  affected, unless they are also in path.
///
///  On the Windows platform, this will only work with directories, and the
///  target directory must exist. The link will be created as a Junction. Only
///  absolute links will be created, and relative paths to the target will be
///  converted to absolute paths.
///
///  On other platforms, the posix symlink() call is used to make a symbolic link
///  containing the string target. If target is a relative path, it will be
///  interpreted relative to the directory containing the link.
/// @description Checks that on the Windows platform, this will only work with
/// directories, and the target directory must exist. Test existing file
/// @author sgrekhov@unipro.ru
/// @issue 30665

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

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

_main(Directory sandbox) async {
  if (Platform.isWindows) {
    File target = getTempFileSync(parent: sandbox);
    Link link = new Link(getTempFilePath(parent: sandbox));
    Expect.throws(() {
      link.createSync(target.path);
    });
  }
}
