// 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('directory_uri').then((temp) {
    String dirname = temp.path + '/from_uri';
    Uri dirUri = new Uri.file(dirname);
    Directory dir = new Directory.fromUri(dirUri);
    Expect.isTrue(dirUri.isAbsolute);
    Expect.isTrue(dirUri.path.startsWith('/'));
    dir.createSync();
    Expect.isTrue(new Directory.fromUri(dirUri).existsSync());
    Expect.isTrue(
        new Directory.fromUri(Uri.base.resolveUri(dirUri)).existsSync());
    Directory.current = temp.path;
    Expect.isTrue(new Directory.fromUri(Uri.parse('from_uri')).existsSync());
    Expect.isTrue(
        new Directory.fromUri(Uri.base.resolve('from_uri')).existsSync());
    Directory.current = originalWorkingDirectory;
    dir.deleteSync();
    temp.deleteSync(recursive: true);
    asyncEnd();
  });
}

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

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