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

// @dart = 2.9

library test.library_imports;

import 'dart:mirrors';
import 'package:expect/expect.dart';
import 'stringify.dart';

import 'library_imports_metadata.dart';

main() {
  LibraryMirror lib =
      currentMirrorSystem().findLibrary(#library_imports_metadata);

  LibraryMirror core = currentMirrorSystem().findLibrary(#dart.core);
  LibraryMirror mirrors = currentMirrorSystem().findLibrary(#dart.mirrors);
  LibraryMirror collection =
      currentMirrorSystem().findLibrary(#dart.collection);
  LibraryMirror async = currentMirrorSystem().findLibrary(#dart.async);

  Expect.setEquals([core, mirrors, collection, async],
      lib.libraryDependencies.map((dep) => dep.targetLibrary));

  Expect.stringEquals(
      'import dart.async\n'
      'import dart.collection\n'
      'import dart.core\n'
      'import dart.mirrors as mirrors\n',
      stringifyDependencies(lib));

  Expect.listEquals(
      [].map(reflect).toList(),
      lib.libraryDependencies
          .singleWhere((dep) => dep.targetLibrary == core)
          .metadata);

  Expect.listEquals(
      [m1].map(reflect).toList(),
      lib.libraryDependencies
          .singleWhere((dep) => dep.targetLibrary == mirrors)
          .metadata);

  Expect.listEquals(
      [m2, m3].map(reflect).toList(),
      lib.libraryDependencies
          .singleWhere((dep) => dep.targetLibrary == collection)
          .metadata);

  Expect.listEquals(
      [].map(reflect).toList(),
      lib.libraryDependencies
          .singleWhere((dep) => dep.targetLibrary == async)
          .metadata);
}
