// Copyright (c) 2013, 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:async_helper/async_helper.dart";
import "package:expect/expect.dart";

void testFromUri() {
  asyncStart();
  Directory originalWorkingDirectory = Directory.current;
  Directory.systemTemp.createTemp('dart_file').then((temp) {
    File target = new File(temp.path + '/target');
    target.createSync();

    String linkname = temp.path + '/from_uri';
    Uri linkUri = new Uri.file(linkname);
    Link link = new Link.fromUri(linkUri);
    Expect.isTrue(linkUri.isAbsolute);
    Expect.isTrue(linkUri.path.startsWith('/'));
    link.createSync(target.path);
    Expect.isTrue(new Link.fromUri(linkUri).existsSync());
    Expect.isTrue(new Link.fromUri(Uri.base.resolveUri(linkUri)).existsSync());
    Directory.current = temp.path;
    Expect.isTrue(new Link.fromUri(Uri.parse('from_uri')).existsSync());
    Expect.isTrue(new Link.fromUri(Uri.base.resolve('from_uri')).existsSync());
    Directory.current = originalWorkingDirectory;
    link.deleteSync();
    target.deleteSync();
    temp.deleteSync();
    asyncEnd();
  });
}

void testFromUriUnsupported() {
  Expect.throwsUnsupportedError(
      () => new Link.fromUri(Uri.parse('http://localhost:8080/index.html')));
  Expect.throwsUnsupportedError(
      () => new Link.fromUri(Uri.parse('ftp://localhost/tmp/xxx')));
  Expect.throwsUnsupportedError(
      () => new Link.fromUri(Uri.parse('name#fragment')));
}

void main() {
  testFromUri();
  testFromUriUnsupported();
}
