// 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/src/commandline_options.dart';
import 'package:compiler/compiler.dart' show 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,
      options: [Flags.useOldFrontend]);
  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_URI_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);
  });
}
