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

import 'dart:async';
import 'package:async_helper/async_helper.dart';
import "package:compiler/src/diagnostics/messages.dart";
import 'package:expect/expect.dart';
import 'memory_compiler.dart';

const MEMORY_SOURCE_FILES = const {
  'main.dart': '''
import 'foo.dart';
main() {}
''',

'bar.dart': '''
import 'dart:foo';
main() {}
''',

'baz.dart': '''
import 'dart:io';
main() {}
''',
};

Future runTest(Uri main,
               {MessageKind error,
                MessageKind info}) async {
  print("----\nentry-point: $main\n");

  DiagnosticCollector diagnostics = new DiagnosticCollector();
  OutputCollector output = new OutputCollector();
  await runCompiler(
      entryPoint: main,
      memorySourceFiles: MEMORY_SOURCE_FILES,
      diagnosticHandler: diagnostics,
      outputProvider: output);

  Expect.isFalse(output.hasExtraOutput);
  Expect.equals(error != null ? 1 : 0, diagnostics.errors.length);
  if (error != null) {
    Expect.equals(error, diagnostics.errors.first.message.kind);
  }
  Expect.equals(info != null ? 1 : 0, diagnostics.infos.length);
  if (info != null) {
    Expect.equals(info, diagnostics.infos.first.message.kind);
  }
  Expect.equals(0, diagnostics.warnings.length);
  Expect.equals(0, diagnostics.hints.length);
}

void main() {
  asyncTest(() async {
    await runTest(
        Uri.parse('memory:main.dart'),
        error: MessageKind.READ_SCRIPT_ERROR);

    await runTest(
        Uri.parse('memory:foo.dart'),
        error: MessageKind.READ_SELF_ERROR);

    await runTest(
        Uri.parse('dart:foo'),
        error: MessageKind.LIBRARY_NOT_FOUND);

    await runTest(
        Uri.parse('dart:io'),
        error: MessageKind.LIBRARY_NOT_SUPPORTED,
        info: MessageKind.DISALLOWED_LIBRARY_IMPORT);

    await runTest(
        Uri.parse('memory:bar.dart'),
        error: MessageKind.LIBRARY_NOT_FOUND);

    await runTest(
        Uri.parse('memory:baz.dart'),
        error: MessageKind.LIBRARY_NOT_SUPPORTED,
        info: MessageKind.DISALLOWED_LIBRARY_IMPORT);
  });
}
