// Copyright (c) 2013, 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:expect/expect.dart';
import 'dart:async';
import "package:async_helper/async_helper.dart";
import 'package:compiler/implementation/dart2jslib.dart' show
    DualKind,
    MessageKind;

import 'message_kind_helper.dart';

import 'dart:mirrors';

main() {
  ClassMirror cls = reflectClass(MessageKind);
  Map<String, MessageKind> kinds = <String, MessageKind>{};
  cls.declarations.forEach((Symbol name, DeclarationMirror declaration) {
    if (declaration is! VariableMirror) return;
    VariableMirror variable = declaration;
    if (variable.isStatic) {
      var value = cls.getField(name).reflectee;
      if (value is MessageKind) {
        kinds[MirrorSystem.getName(name)] = value;
      } else {
        Expect.fail("Weird static field: '${MirrorSystem.getName(name)}'.");
      }
    }
  });
  List<String> names = kinds.keys.toList()..sort();
  List<String> examples = <String>[];
  for (String name in names) {
    MessageKind kind = kinds[name];
    if (name == 'GENERIC' // Shouldn't be used.
        // We can't provoke a crash.
        || name == 'COMPILER_CRASHED'
        || name == 'PLEASE_REPORT_THE_CRASH'
        // We cannot provide examples for patch errors.
        || name.startsWith('PATCH_')) continue;
    if (kind.examples != null) {
      examples.add(name);
    } else {
      print("No example in '$name'");
    }
  };
  var cachedCompiler;
  asyncTest(() => Future.forEach(examples, (String name) {
    print("Checking '$name'.");
    Stopwatch sw = new Stopwatch()..start();
    return check(kinds[name], cachedCompiler).then((var compiler) {
      cachedCompiler = compiler;
      sw.stop();
      print("Checked '$name' in ${sw.elapsedMilliseconds}ms.");
    });
  }));
}
