// 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

import 'dart:io';

import 'package:expect/expect.dart';
import 'package:path/path.dart' as path;

import 'test_utils.dart' show withTempDir;

main() async {
  await withTempDir('issue_30687', (Directory tempDir) async {
    final link1 = Link(tempDir.path + Platform.pathSeparator + 'link1.lnk');
    final link2 = Link(tempDir.path + Platform.pathSeparator + 'link2.lnk');

    final target1 = Directory(path.join(tempDir.path, 'target1'));
    final target2 = Directory(path.join(tempDir.path, 'target2'));

    target1.createSync();
    target2.createSync();

    Expect.isTrue(target1.existsSync());
    Expect.isTrue(target2.existsSync());

    link1.createSync(target1.path);
    link2.createSync(target2.path);
    Expect.isTrue(link1.existsSync());
    Expect.isTrue(link2.existsSync());

    try {
      Link renamed = await link1.rename(link2.path);
      Expect.isFalse(link1.existsSync());
      Expect.isTrue(renamed.existsSync());
      Expect.equals(renamed.path, link2.path);
    } finally {
      target1.deleteSync();
      target2.deleteSync();
      link2.deleteSync();
      if (link1.existsSync()) {
        link1.deleteSync();
      }
    }
  });
}
