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

import 'package:async_helper/async_helper.dart';
import 'package:compiler/compiler_new.dart' show Diagnostic;
import 'package:expect/expect.dart';
import 'memory_compiler.dart';

void main() {
  DiagnosticCollector collector = new DiagnosticCollector();
  asyncTest(() async {
    CompilationResult result = await runCompiler(
        memorySourceFiles: MEMORY_SOURCE_FILES,
        diagnosticHandler: collector,
        options: ['--analyze-all']);

    List<String> diagnostics = <String>[];
    collector.messages.forEach((CollectedMessage message) {
      if (message.kind == Diagnostic.VERBOSE_INFO) return;
      diagnostics.add(message.toString());
    });
    diagnostics.sort();
    var expected = [
      "MessageKind.AMBIGUOUS_LOCATION:"
          "memory:exporter.dart:43:47:'hest' is defined here.:info",
      "MessageKind.AMBIGUOUS_LOCATION:"
          "memory:library.dart:41:45:'hest' is defined here.:info",
      "MessageKind.DUPLICATE_IMPORT:"
          "memory:main.dart:86:92:Duplicate import of 'hest'.:warning",
      "MessageKind.IMPORTED_HERE:"
          "memory:main.dart:0:22:'hest' is imported here.:info",
      "MessageKind.IMPORTED_HERE:"
          "memory:main.dart:23:46:'hest' is imported here.:info",
    ];
    Expect.listEquals(expected, diagnostics);
    Expect.isTrue(result.isSuccess);
  });
}

const Map MEMORY_SOURCE_FILES = const {
  'main.dart': """
import 'library.dart';
import 'exporter.dart';

main() {
  Fisk x = null;
  fisk();
  hest();
}
""",
  'library.dart': """
library lib;

class Fisk {
}

fisk() {}

hest() {}
""",
  'exporter.dart': """
library exporter;

export 'library.dart';

hest() {}
""",
};
