// 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.

// Checks that dart2js produces the expected static type warnings and
// compile-time errors for the provided multitests.

import 'dart:async';

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';

import 'memory_compiler.dart';

import '../../../tools/testing/dart/multitest.dart'
    show ExtractTestsFromMultitest;
import '../../../tools/testing/dart/utils.dart'
    show Path;

void check(List<String> testFiles,
           {List<String> arguments: const <String>[],
            List<String> options: const <String>[]}) {
  bool outcomeMismatch = false;
  bool verbose = arguments.contains('-v');
  var cachedCompiler;
  asyncTest(() => Future.forEach(testFiles, (String testFile) {
    Map<String, String> testSources = {};
    Map<String, Set<String>> testOutcomes = {};
    String fileName = 'tests/$testFile';
    ExtractTestsFromMultitest(new Path(fileName), testSources, testOutcomes);
    return Future.forEach(testSources.keys, (String testName) {
      String testFileName = '$fileName/$testName';
      Set<String> expectedOutcome = testOutcomes[testName];
      DiagnosticCollector collector = new DiagnosticCollector();
      var compiler = compilerFor(
           {testFileName: testSources[testName]},
           diagnosticHandler: collector,
           options: ['--analyze-only']..addAll(options),
           showDiagnostics: verbose,
           cachedCompiler: cachedCompiler);
      return compiler.run(Uri.parse('memory:$testFileName')).then((_) {
        if (expectedOutcome.contains('compile-time error')) {
          if (collector.errors.isEmpty) {
            print('$testFileName: Missing compile-time error.');
            outcomeMismatch = true;
          }
        } else if (expectedOutcome.contains('static type warning')) {
          if (collector.warnings.isEmpty) {
            print('$testFileName: Missing static type warning.');
            outcomeMismatch = true;
          }
        } else {
          // Expect ok.
          if (!collector.errors.isEmpty ||
              !collector.warnings.isEmpty) {
            collector.errors.forEach((message) {
              print('$testFileName: Unexpected error: ${message.message}');
            });
            collector.warnings.forEach((message) {
              print('$testFileName: Unexpected warning: ${message.message}');
            });
            outcomeMismatch = true;
          }
        }
        cachedCompiler = compiler;
      });
    });
  }).then((_) {
    Expect.isFalse(outcomeMismatch, 'Outcome mismatch');
  }));
}
