// 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:async_helper/async_helper.dart';
import 'package:compiler/src/apiimpl.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/elements/entities.dart' show ClassEntity;
import 'package:compiler/src/resolution/class_members.dart'
    show ClassMemberMixin;
import '../memory_compiler.dart';

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

Iterable<ClassEntity> computeLiveClasses(CompilerImpl compiler) {
  return new Set<ClassEntity>()
    ..addAll(compiler.resolutionWorldBuilder.directlyInstantiatedClasses)
    ..addAll(compiler.codegenWorldBuilder.directlyInstantiatedClasses);
}

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

Future checkElementInvariantsAfterCompiling(Uri uri) async {
  CompilationResult result =
      await runCompiler(entryPoint: uri, options: DART2JS_OPTIONS);
  Expect.isTrue(result.isSuccess, "Compilation of dart2js failed.");

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

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