// 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 the helper [Compiler.inUserCode] works as intended.

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/compiler.dart' show Compiler;
import 'memory_compiler.dart';

const SOURCE = const {
  'main.dart': """
library main;

import 'dart:async';
import 'foo.dart';
import 'pkg/sub/bar.dart';
import 'package:sub/bar.dart';
import 'package:sup/boz.dart';

main() {}
""",

  'foo.dart': """
library foo;
""",

  'pkg/sub/bar.dart': """
library sub.bar;

import 'package:sup/boz.dart';
import 'baz.dart';
""",

  'pkg/sub/baz.dart': """
library sub.baz;
""",

  'pkg/sup/boz.dart': """
library sup.boz;
""",
};

Future test(List<Uri> entryPoints, Map<String, bool> expectedResults) async {
  CompilationResult result = await runCompiler(
    entryPoints: entryPoints,
    memorySourceFiles: SOURCE,
    options: [Flags.analyzeOnly, Flags.analyzeAll],
    packageRoot: Uri.parse('memory:pkg/'));
  Compiler compiler = result.compiler;
  expectedResults.forEach((String uri, bool expectedResult) {
    var element = compiler.libraryLoader.lookupLibrary(Uri.parse(uri));
    Expect.isNotNull(element, "Unknown library '$uri'.");
    Expect.equals(expectedResult, compiler.inUserCode(element),
        expectedResult ? "Library '$uri' expected to be in user code"
                       : "Library '$uri' not expected to be in user code");
  });
}

void main() {
  asyncTest(runTests);
}

Future runTests() async {
  await test(
      [Uri.parse('memory:main.dart')],
      {'memory:main.dart': true,
       'memory:foo.dart': true,
       'memory:pkg/sub/bar.dart': true,
       'memory:pkg/sub/baz.dart': true,
       'package:sub/bar.dart': false,
       'package:sub/baz.dart': false,
       'package:sup/boz.dart': false,
       'dart:core': false,
       'dart:async': false});
  await test(
      [Uri.parse('dart:async')],
      {'dart:core': true,
       'dart:async': true});
  await test(
      [Uri.parse('package:sub/bar.dart')],
      {'package:sub/bar.dart': true,
       'package:sub/baz.dart': true,
       'package:sup/boz.dart': false,
       'dart:core': false});
  await test(
      [Uri.parse('package:sub/bar.dart'), Uri.parse('package:sup/boz.dart')],
      {'package:sub/bar.dart': true,
       'package:sub/baz.dart': true,
       'package:sup/boz.dart': true,
       'dart:core': false});
  await test(
      [Uri.parse('dart:async'), Uri.parse('package:sub/bar.dart')],
      {'package:sub/bar.dart': true,
       'package:sub/baz.dart': true,
       'package:sup/boz.dart': false,
       'dart:core': true,
       'dart:async': true});
}

