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

/// Tests that analyzing everything from the libraries that are public from the
/// embedded category does not cause elements from other libraries to be
/// processed.
library embedded_category_boundary_test;

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/elements.dart';
import 'package:sdk_library_metadata/libraries.dart';

import 'analyze_helper.dart';

main() async {
  List<Uri> uriList = new List<Uri>();
  libraries.forEach((String name, LibraryInfo info) {
    if (info.categories.contains(Category.embedded)) {
      uriList.add(new Uri(scheme: 'dart', path: name));
    }
  });
  asyncTest(() async {
    analyze(uriList, {},
        checkResults: checkResults, analyzeMain: true, analyzeAll: false);
  });
}

/// These elements are currently escaping from dart:async via
/// `core._Resource#_readAsStream`.
Set<String> whiteList = new Set.from([
  "function(StreamController#addError)",
  "getter(StreamController#stream)",
  "setter(StreamController#onListen)"
]);

bool checkResults(Compiler compiler, CollectingDiagnosticHandler handler) {
  return compiler.enqueuer.resolution.processedElements
      .every((Element element) {
    if (whiteList.contains("$element")) return true;
    LibraryInfo info = libraries[element.library.canonicalUri.path];
    bool isAllowedInEmbedded =
        info.isInternal || info.categories.contains(Category.embedded);
    return isAllowedInEmbedded;
  });
}
