// 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.

import 'dart:async';
import 'package:compiler/implementation/apiimpl.dart';
import 'package:compiler/implementation/dart2jslib.dart' show NullSink;
import 'package:expect/expect.dart';
import 'package:compiler/implementation/filenames.dart';
import 'package:compiler/implementation/source_file_provider.dart';
import 'package:compiler/implementation/elements/elements.dart'
    show ClassElement;
import 'package:compiler/implementation/resolution/class_members.dart'
    show ClassMemberMixin;
import "package:async_helper/async_helper.dart";


const String DART2JS_SOURCE =
    'sdk/lib/_internal/compiler/implementation/dart2js.dart';
const List<String> DART2JS_OPTIONS = const <String>[
      '--categories=Client,Server', 
      '--disable-type-inference'
    ];

Iterable<ClassElement> computeLiveClasses(Compiler compiler) {
  return new Set<ClassElement>()
      ..addAll(compiler.resolverWorld.instantiatedClasses)
      ..addAll(compiler.codegenWorld.instantiatedClasses);
}

void checkClassInvariants(ClassElement cls) {
  ClassMemberMixin impl = cls;
  Expect.isTrue(impl.areAllMembersComputed(),
      "Not all members have been computed for $cls.");
}

Future checkElementInvariantsAfterCompiling(Uri uri) {
  var inputProvider = new CompilerSourceFileProvider();
  var handler = new FormattingDiagnosticHandler(inputProvider);
  var compiler = new Compiler(inputProvider.readStringFromUri,
                              NullSink.outputProvider,
                              handler,
                              currentDirectory.resolve('sdk/'),
                              currentDirectory.resolve('sdk/'),
                              DART2JS_OPTIONS,
                              {});

   return compiler.run(uri).then((passed) {
     Expect.isTrue(passed, "Compilation of dart2js failed.");

     computeLiveClasses(compiler).forEach(checkClassInvariants);
   });
}

void main () {
  var uri = currentDirectory.resolve(DART2JS_SOURCE);
  asyncTest(() => checkElementInvariantsAfterCompiling(uri));
}
