// Copyright (c) 2015, the Fletch 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.md file.

import "package:compiler/src/platform_configuration.dart";
import "package:compiler/src/source_file_provider.dart";
import "package:compiler/compiler_new.dart";
import "package:expect/expect.dart";

Uri unsupported = Uri.parse("unsupported:");

main() async {
  CompilerInput input = new CompilerSourceFileProvider();
  Map<String, Uri> client =
      await load(Uri.base.resolve("sdk/lib/dart_client.platform"), input);
  Map<String, Uri> server =
      await load(Uri.base.resolve("sdk/lib/dart_server.platform"), input);
  Map<String, Uri> shared =
      await load(Uri.base.resolve("sdk/lib/dart_shared.platform"), input);
  Expect.setEquals(new Set.from(shared.keys), new Set.from(client.keys));
  Expect.setEquals(new Set.from(shared.keys), new Set.from(server.keys));

  for (String libraryName in shared.keys) {
    test(Map<String, Uri> m) {
      if (m[libraryName] != unsupported && shared[libraryName] != unsupported) {
        Expect.equals(shared[libraryName], m[libraryName]);
      }
    }

    test(client);
    test(server);
  }
}
