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

library part_of_test;

import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import 'package:compiler/src/diagnostics/messages.dart' show
    MessageKind;
import 'mock_compiler.dart';

final libraryUri = Uri.parse('test:library.dart');
const String LIBRARY_SOURCE = '''
library foo;
part 'part.dart';
''';

final partUri = Uri.parse('test:part.dart');
const String PART_SOURCE = '''
part of bar;
''';

void main() {
  MockCompiler compiler = new MockCompiler.internal();
  compiler.registerSource(libraryUri, LIBRARY_SOURCE);
  compiler.registerSource(partUri, PART_SOURCE);

  asyncTest(() => compiler.libraryLoader.loadLibrary(libraryUri).then((_) {
    DiagnosticCollector collector = compiler.diagnosticCollector;
    print('errors: ${collector.errors}');
    print('warnings: ${collector.warnings}');
    Expect.isTrue(collector.errors.isEmpty);
    Expect.equals(1, collector.warnings.length);
    Expect.equals(MessageKind.LIBRARY_NAME_MISMATCH,
        collector.warnings.first.messageKind);
    Expect.equals('foo',
        collector.warnings.first.message.arguments['libraryName'].toString());
  }));
}
