// Copyright (c) 2018, 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.

import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/diagnostics/messages.dart';
import 'package:expect/expect.dart';

import '../memory_compiler.dart';

test(String code, List<String> options, List<MessageKind> expectedHints) async {
  DiagnosticCollector collector = new DiagnosticCollector();
  CompilationResult result = await runCompiler(
      memorySourceFiles: {'main.dart': code},
      options: options,
      diagnosticHandler: collector);
  Expect.isTrue(result.isSuccess);
  List<MessageKind> actualHints =
      collector.hints.map((c) => c.messageKind).toList();
  String message = "Unexpected hints for $options on\n$code\n"
      "Expected: ${expectedHints}\n"
      "Actual  : ${actualHints}";
  Expect.listEquals(expectedHints, actualHints, message);
}

String runtimeTypeToStringObject = '''
main() {
  print(new Object().runtimeType.toString());
}
''';

String runtimeTypeToStringClass = '''
class Class {}

main() {
  print(new Class().runtimeType.toString());
}
''';

main() {
  asyncTest(() async {
    await test(runtimeTypeToStringObject, [], []);
    await test(runtimeTypeToStringObject, [Flags.omitImplicitChecks],
        [MessageKind.RUNTIME_TYPE_TO_STRING_OBJECT]);
    await test(runtimeTypeToStringObject,
        [Flags.omitImplicitChecks, Flags.laxRuntimeTypeToString], []);

    await test(runtimeTypeToStringClass, [], []);
    await test(runtimeTypeToStringClass, [Flags.omitImplicitChecks],
        [MessageKind.RUNTIME_TYPE_TO_STRING_SUBTYPE]);
    await test(runtimeTypeToStringClass,
        [Flags.omitImplicitChecks, Flags.laxRuntimeTypeToString], []);
  });
}
