// Copyright (c) 2014, 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 duplicate library names result in different messages depending
// on whether the libraries are based on the same resource.

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/src/diagnostics/messages.dart' show MessageKind;
import '../memory_compiler.dart';

void check(String kind, Iterable<CollectedMessage> messages,
    List<MessageKind> expectedMessageKinds) {
  Expect.equals(expectedMessageKinds.length, messages.length,
      "Unexpected $kind count: $messages");
  int i = 0;
  messages.forEach((CollectedMessage message) {
    Expect.equals(expectedMessageKinds[i++], message.messageKind);
  });
}

Future test(Map<String, String> source,
    {List<MessageKind> warnings: const <MessageKind>[],
    List<MessageKind> hints: const <MessageKind>[]}) async {
  DiagnosticCollector collector = new DiagnosticCollector();
  await runCompiler(
      memorySourceFiles: source,
      diagnosticHandler: collector,
      showDiagnostics: true,
      options: [Flags.analyzeOnly, Flags.analyzeAll],
      packageRoot: Uri.parse('memory:pkg/'));

  Expect.isTrue(collector.errors.isEmpty);
  check('warning', collector.warnings, warnings);
  check('hint', collector.hints, hints);
  Expect.isTrue(collector.infos.isEmpty);
}

void main() {
  asyncTest(runTests);
}

Future runTests() async {
  await test({
    'main.dart': """
library main;

import 'package:lib/foo.dart';
import 'pkg/lib/foo.dart';
""",
    'pkg/lib/foo.dart': """
library lib.foo;
"""
  }, warnings: [
    MessageKind.DUPLICATED_LIBRARY_RESOURCE
  ], hints: []);

  await test({
    'main.dart': """
library main;

import 'package:lib/bar.dart';
import 'pkg/foo.dart';
""",
    'pkg/foo.dart': """
library foo;

import 'lib/bar.dart';
""",
    'pkg/lib/bar.dart': """
library lib.bar;
"""
  }, warnings: [
    MessageKind.DUPLICATED_LIBRARY_RESOURCE
  ], hints: []);

  await test({
    'main.dart': """
library main;

import 'foo.dart';
import 'pkg/lib/baz.dart';
""",
    'foo.dart': """
library foo;

import 'package:lib/baz.dart';
""",
    'pkg/lib/baz.dart': """
library lib.baz;
"""
  }, warnings: [
    MessageKind.DUPLICATED_LIBRARY_RESOURCE
  ], hints: []);

  await test({
    'main.dart': """
library main;

import 'foo.dart';
import 'pkg/bar.dart';
""",
    'foo.dart': """
library foo;

import 'package:lib/boz.dart';
""",
    'pkg/bar.dart': """
library bar;

import 'lib/boz.dart';
""",
    'pkg/lib/boz.dart': """
library lib.boz;
"""
  }, warnings: [
    MessageKind.DUPLICATED_LIBRARY_RESOURCE
  ], hints: []);

  await test({
    'main.dart': """
library main;

import 'package:lib/qux.dart';
import 'pkg/lib/qux.dart';
""",
    'pkg/lib/qux.dart': """
// No library tag.
"""
  }, hints: [
    MessageKind.DUPLICATED_RESOURCE,
  ]);

  await test({
    'main.dart': """
library main;

import 'foo.dart';
import 'bar.dart';
""",
    'foo.dart': """
library lib;
""",
    'bar.dart': """
library lib;
"""
  }, warnings: [
    MessageKind.DUPLICATED_LIBRARY_NAME,
    MessageKind.DUPLICATED_LIBRARY_NAME
  ], hints: []);
}
