// Copyright (c) 2016, 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.

import 'dart:io';

import 'package:path/path.dart' as p;
import 'package:test/test.dart';

import 'package:package_resolver/package_resolver.dart';

void main() {
  var resolver;
  setUp(() {
    resolver = SyncPackageResolver.root("file:///foo/bar");
  });

  group("constructor", () {
    test("with a URI object", () {
      var resolver = SyncPackageResolver.root(Uri.parse("file:///foo/bar/"));
      expect(resolver.packageRoot, equals(Uri.parse("file:///foo/bar/")));
    });

    test("with a URI without a path component", () {
      var resolver =
          SyncPackageResolver.root(Uri.parse("http://localhost:1234"));
      expect(resolver.packageRoot, equals(Uri.parse("http://localhost:1234/")));
    });

    test("with an invalid URI type", () {
      expect(() => SyncPackageResolver.root(12), throwsArgumentError);
    });
  });

  test("exposes a null config map", () {
    expect(resolver.packageConfigMap, isNull);
  });

  test("exposes a null config URI", () {
    expect(resolver.packageConfigUri, isNull);
  });

  test("exposes the root root", () {
    expect(resolver.packageRoot, equals(Uri.parse("file:///foo/bar/")));
  });

  test("processArgument uses --package-root", () {
    expect(resolver.processArgument, equals("--package-root=file:///foo/bar/"));
  });

  group("resolveUri", () {
    test("with a package", () {
      expect(resolver.resolveUri("package:baz/bang/qux.dart"),
          equals(Uri.parse("file:///foo/bar/baz/bang/qux.dart")));
    });

    test("with a package with no path", () {
      expect(resolver.resolveUri("package:baz"), isNull);
    });

    test("with a package with an empty path", () {
      expect(resolver.resolveUri("package:baz/"),
          equals(Uri.parse("file:///foo/bar/baz/")));
    });

    test("with a URI object", () {
      expect(resolver.resolveUri(Uri.parse("package:baz/bang/qux.dart")),
          equals(Uri.parse("file:///foo/bar/baz/bang/qux.dart")));
    });

    test("with an invalid argument type", () {
      expect(() => resolver.resolveUri(12), throwsArgumentError);
    });

    test("with a non-package URI", () {
      expect(
          () => resolver.resolveUri("file:///zip/zap"), throwsFormatException);
    });

    test("with an invalid package URI", () {
      expect(() => resolver.resolveUri("package:"), throwsFormatException);
    });
  });

  group("urlFor", () {
    test("with no path", () {
      expect(resolver.urlFor("baz"), equals(Uri.parse("file:///foo/bar/baz/")));
    });

    test("with a path", () {
      expect(resolver.urlFor("baz", "bang/qux.dart"),
          equals(Uri.parse("file:///foo/bar/baz/bang/qux.dart")));
    });
  });

  group("packageUriFor", () {
    test("converts a matching URI to a package:", () {
      expect(resolver.packageUriFor("file:///foo/bar/bang/qux.dart"),
          equals(Uri.parse("package:bang/qux.dart")));
    });

    test("converts a matching URI with no path", () {
      expect(resolver.packageUriFor("file:///foo/bar/baz"),
          equals(Uri.parse("package:baz/")));
      expect(resolver.packageUriFor("file:///foo/bar/baz/"),
          equals(Uri.parse("package:baz/")));
    });

    test("with a URI object", () {
      expect(resolver.packageUriFor(Uri.parse("file:///foo/bar/bang/qux.dart")),
          equals(Uri.parse("package:bang/qux.dart")));
    });

    test("with an invalid argument type", () {
      expect(() => resolver.packageUriFor(12), throwsArgumentError);
    });
  });

  group("packagePath", () {
    var sandbox;
    setUp(() async {
      sandbox =
          (await Directory.systemTemp.createTemp("package_resolver_test")).path;
    });

    tearDown(() async {
      await Directory(sandbox).delete(recursive: true);
    });

    test("with a file: scheme", () async {
      var packageLib = p.join(sandbox, "foo/lib");
      await Directory(packageLib).create(recursive: true);

      var packagesDir = p.join(sandbox, "packages");
      var fooLink = p.join(packagesDir, "foo");
      await Link(fooLink).create(packageLib, recursive: true);

      var packagesLink = p.join(sandbox, "foo/packages");
      await Link(packagesLink).create(packagesDir);

      var resolver = SyncPackageResolver.root(p.toUri(packagesLink));

      expect(resolver.packagePath("foo"),
          equals(Directory(p.join(sandbox, "foo")).resolveSymbolicLinksSync()));
      expect(resolver.packagePath("bar"), isNull);
    });

    test("without a file: scheme", () {
      var resolver = SyncPackageResolver.root("http://dartlang.org/bar");
      expect(resolver.packagePath("foo"), isNull);
    });
  }, testOn: "vm");
}
