// 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 compiler emits a warning on import of 'dart:mirrors' unless
// the flag --enable-experimental-mirrors is used.

library dart2js.test.import_mirrors;

import 'dart:async';
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/diagnostics/messages.dart'
    show MessageKind, MessageTemplate;
import '../memory_compiler.dart';

const DIRECT_IMPORT = const {
  '/main.dart': '''
import 'dart:mirrors';

main() {}
''',
  'paths': "main.dart => dart:mirrors",
};

const INDIRECT_IMPORT1 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'dart:mirrors';
''',
  'paths': "first.dart => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => dart:mirrors",
};

const INDIRECT_IMPORT2 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'second.dart';
''',
  '/second.dart': '''
import 'dart:mirrors';
''',
  'paths': "second.dart => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => second.dart => dart:mirrors",
};

const INDIRECT_PACKAGE_IMPORT1 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'package:second/second.dart';
''',
  '/pkg/second/second.dart': '''
import 'dart:mirrors';
''',
  'paths': "first.dart => package:second => dart:mirrors",
  'verbosePaths':
      "main.dart => first.dart => package:second/second.dart => dart:mirrors",
};

const INDIRECT_PACKAGE_IMPORT2 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'package:packagename/second.dart';
''',
  '/pkg/packagename/second.dart': '''
import 'dart:mirrors';
''',
  'paths': "first.dart => package:packagename => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => package:packagename/second.dart "
      "=> dart:mirrors",
};

const INDIRECT_PACKAGE_IMPORT3 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'package:package1/second.dart';
''',
  '/pkg/package1/second.dart': '''
import 'package:package2/third.dart';
''',
  '/pkg/package2/third.dart': '''
import 'dart:mirrors';
''',
  'paths': "first.dart => package:package1 => package:package2 => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => package:package1/second.dart "
      "=> package:package2/third.dart => dart:mirrors",
};

const INDIRECT_PACKAGE_IMPORT4 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'package:package1/second.dart';
''',
  '/pkg/package1/second.dart': '''
import 'sub/third.dart';
''',
  '/pkg/package1/sub/third.dart': '''
import 'package:package2/fourth.dart';
''',
  '/pkg/package2/fourth.dart': '''
import 'lib/src/fifth.dart';
''',
  '/pkg/package2/lib/src/fifth.dart': '''
import 'dart:mirrors';
''',
  'paths': "first.dart => package:package1 => package:package2 => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => package:package1/second.dart "
      "=> package:package1/sub/third.dart => package:package2/fourth.dart "
      "=> package:package2/lib/src/fifth.dart => dart:mirrors",
};

const DUAL_DIRECT_IMPORT = const {
  '/main.dart': '''
import 'dart:mirrors';
import 'dart:mirrors';

main() {}
''',
  'paths': "main.dart => dart:mirrors",
};

const DUAL_INDIRECT_IMPORT1 = const {
  '/main.dart': '''
import 'dart:mirrors';
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'dart:mirrors';
''',
  'paths': const ["main.dart => dart:mirrors", "first.dart => dart:mirrors"],
  'verbosePaths': const [
    "main.dart => dart:mirrors",
    "main.dart => first.dart => dart:mirrors"
  ],
};

const DUAL_INDIRECT_IMPORT2 = const {
  '/main.dart': '''
import 'first.dart';
import 'second.dart';

main() {}
''',
  '/first.dart': '''
import 'dart:mirrors';
''',
  '/second.dart': '''
import 'dart:mirrors';
''',
  'paths': const ["first.dart => dart:mirrors", "second.dart => dart:mirrors"],
  'verbosePaths': const [
    "main.dart => first.dart => dart:mirrors",
    "main.dart => second.dart => dart:mirrors"
  ],
};

const DUAL_INDIRECT_IMPORT3 = const {
  '/main.dart': '''
import 'first.dart';
import 'second.dart';

main() {}
''',
  '/first.dart': '''
import 'third.dart';
''',
  '/second.dart': '''
import 'third.dart';
''',
  '/third.dart': '''
import 'dart:mirrors';
''',
  'paths': "third.dart => dart:mirrors",
  'verbosePaths': const [
    "main.dart => first.dart => third.dart => dart:mirrors",
    "main.dart => second.dart => third.dart => dart:mirrors"
  ],
};

const DUAL_INDIRECT_PACKAGE_IMPORT1 = const {
  '/main.dart': '''
import 'package:package1/second.dart';
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'package:package2/third.dart';
''',
  '/pkg/package1/second.dart': '''
import 'dart:mirrors';
''',
  '/pkg/package2/third.dart': '''
import 'dart:mirrors';
''',
  'paths': const [
    "main.dart => package:package1 => dart:mirrors",
    "first.dart => package:package2 => dart:mirrors"
  ],
  'verbosePaths': const [
    "main.dart => package:package1/second.dart => dart:mirrors",
    "main.dart => first.dart => package:package2/third.dart => dart:mirrors"
  ]
};

const DIRECT_EXPORT = const {
  '/main.dart': '''
export 'dart:mirrors';

main() {}
''',
  'paths': "main.dart => dart:mirrors",
};

const INDIRECT_EXPORT1 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
export 'dart:mirrors';
''',
  'paths': "first.dart => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => dart:mirrors",
};

const INDIRECT_EXPORT2 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'second.dart';
''',
  '/second.dart': '''
export 'dart:mirrors';
''',
  'paths': "second.dart => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => second.dart => dart:mirrors",
};

const INDIRECT_PACKAGE_EXPORT1 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
import 'package:packagename/second.dart';
''',
  '/pkg/packagename/second.dart': '''
export 'dart:mirrors';
''',
  'paths': "first.dart => package:packagename => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => package:packagename/second.dart "
      "=> dart:mirrors",
};

const INDIRECT_PACKAGE_EXPORT2 = const {
  '/main.dart': '''
import 'first.dart';

main() {}
''',
  '/first.dart': '''
export 'package:packagename/second.dart';
''',
  '/pkg/packagename/second.dart': '''
import 'dart:mirrors';
''',
  'paths': "first.dart => package:packagename => dart:mirrors",
  'verbosePaths': "main.dart => first.dart => package:packagename/second.dart "
      "=> dart:mirrors",
};

Future test(Map sourceFiles,
    {expectedPaths,
    bool verbose: false,
    bool enableExperimentalMirrors: false}) async {
  if (expectedPaths is! List) {
    expectedPaths = [expectedPaths];
  }
  var collector = new DiagnosticCollector();
  var options = [Flags.useOldFrontend];
  if (verbose) {
    options.add('--verbose');
  }
  if (enableExperimentalMirrors) {
    options.add('--enable-experimental-mirrors');
  }
  await runCompiler(
      entryPoint: Uri.parse('memory:/main.dart'),
      memorySourceFiles: sourceFiles,
      diagnosticHandler: collector,
      packageRoot: Uri.parse('memory:/pkg/'),
      options: options);
  Expect.equals(0, collector.errors.length, 'Errors: ${collector.errors}');
  if (enableExperimentalMirrors) {
    Expect.equals(
        0, collector.warnings.length, 'Warnings: ${collector.errors}');
  } else {
    Expect.equals(
        1, collector.warnings.length, 'Warnings: ${collector.errors}');
    Expect.equals(MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
        collector.warnings.first.message.kind);
    Expect.equals(
        expectedPaths.join(MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING),
        collector.warnings.first.message.arguments['importChain']);
  }
}

Future checkPaths(Map sourceData) {
  Map sourceFiles = sourceData;
  var expectedPaths = sourceData['paths'];
  var expectedVerbosePaths = sourceData['verbosePaths'];
  if (expectedVerbosePaths == null) {
    expectedVerbosePaths = expectedPaths;
  }
  return test(sourceFiles, expectedPaths: expectedPaths).then((_) {
    return test(sourceFiles,
        expectedPaths: expectedVerbosePaths, verbose: true);
  }).then((_) {
    return test(sourceFiles, enableExperimentalMirrors: true);
  });
}

void main() {
  asyncTest(() => Future.forEach([
        DIRECT_IMPORT,
        INDIRECT_IMPORT1,
        INDIRECT_IMPORT2,
        INDIRECT_PACKAGE_IMPORT1,
        INDIRECT_PACKAGE_IMPORT2,
        INDIRECT_PACKAGE_IMPORT3,
        INDIRECT_PACKAGE_IMPORT4,
        DUAL_DIRECT_IMPORT,
        DUAL_INDIRECT_IMPORT1,
        DUAL_INDIRECT_IMPORT2,
        DUAL_INDIRECT_IMPORT3,
        DUAL_INDIRECT_PACKAGE_IMPORT1,
        DIRECT_EXPORT,
        INDIRECT_EXPORT1,
        INDIRECT_EXPORT2,
        INDIRECT_PACKAGE_EXPORT1,
        INDIRECT_PACKAGE_EXPORT2
      ], (map) => checkPaths(map)));
}
