// 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 '../../../sdk/lib/_internal/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 if (value is DualKind) {
        kinds['${MirrorSystem.getName(name)}.error'] = value.error;
        kinds['${MirrorSystem.getName(name)}.warning'] = value.warning;
      } 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();
    bool useCachedCompiler = true;
    if (name == 'MISSING_LIBRARY_NAME') {
      // TODO(johnniwinther): Found out why we cannot use the cached compiler
      // for this message kind.
      cachedCompiler = null;
    }
    return check(kinds[name], cachedCompiler).
        then((var compiler) {
          cachedCompiler = compiler;
          sw.stop();
          print("Checked '$name' in ${sw.elapsedMilliseconds}ms.");
        });
    }
  ));
}
