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

// Test that the compiler can handle imports when package root has not been set.

library dart2js.test.package_root;

import 'dart:async';

import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/compiler.dart'
       show DiagnosticHandler, Diagnostic, PackagesDiscoveryProvider;
import 'package:compiler/src/diagnostics/messages.dart'
       show MessageKind;
import 'package:package_config/packages.dart';

import 'memory_compiler.dart';
import 'memory_source_file_helper.dart';

const MEMORY_SOURCE_FILES = const {
  'main.dart': '''

import 'package:foo/foo.dart';

main() {}
''',
  'package.config': '''
''',
};

final Uri PACKAGE_CONFIG_URI = Uri.parse('memory:package.config');

Future runTest(Uri main,
               MessageKind expectedMessageKind,
               {Uri packageRoot,
                Uri packageConfig,
                PackagesDiscoveryProvider packagesDiscoveryProvider}) async {
  DiagnosticCollector collector = new DiagnosticCollector();
  await runCompiler(
      entryPoint: main,
      memorySourceFiles: MEMORY_SOURCE_FILES,
      diagnosticHandler: collector,
      packageRoot: packageRoot,
      packageConfig: packageConfig,
      packagesDiscoveryProvider: packagesDiscoveryProvider);
  Expect.equals(1, collector.errors.length,
      "Unexpected errors: ${collector.errors}");
  Expect.equals(expectedMessageKind, collector.errors.first.message.kind,
      "Unexpected error: ${collector.errors.first}");
}

void main() {
  asyncTest(() async {
    Uri script = currentDirectory.resolveUri(Platform.script);
    Uri packageRoot = script.resolve('./packages/');

    PackagesDiscoveryProvider noPackagesDiscovery = (Uri uri) {
      return new Future.value(Packages.noPackages);
    };

    await runTest(
        Uri.parse('memory:main.dart'),
        MessageKind.READ_SCRIPT_ERROR,
        packageRoot: packageRoot);
    await runTest(
        Uri.parse('memory:main.dart'),
        MessageKind.LIBRARY_NOT_FOUND,
        packageConfig: PACKAGE_CONFIG_URI);
    await runTest(
        Uri.parse('memory:main.dart'),
        MessageKind.LIBRARY_NOT_FOUND,
        packagesDiscoveryProvider: noPackagesDiscovery);

    await runTest(
        Uri.parse('package:foo/foo.dart'),
        MessageKind.READ_SELF_ERROR,
        packageRoot: packageRoot);
    await runTest(
        Uri.parse('package:foo/foo.dart'),
        MessageKind.LIBRARY_NOT_FOUND,
        packageConfig: PACKAGE_CONFIG_URI);
    await runTest(
        Uri.parse('package:foo/foo.dart'),
        MessageKind.LIBRARY_NOT_FOUND,
        packagesDiscoveryProvider: noPackagesDiscovery);
  });
}
