// Copyright (c) 2017, 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/elements/entities.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/universe/selector.dart';
import 'package:compiler/src/world.dart';
import 'package:expect/expect.dart';
import '../helpers/type_test_helper.dart';

main() {
  asyncTest(() async {
    print('--test from kernel------------------------------------------------');
    await runTest();
  });
}

Future runTest() async {
  var env = await TypeEnvironment.create("""
    class A {
      call() {}
    }
    class B {
    }
    class C extends B {
      call() {}
    }

    main() {
      (new A())();
      new B();
      (new C())();
      localFunction() {}
      () {};
    }
    """, testBackendWorld: true);

  Map<String, String> expectedMap = const {
    'A': '[exact=A]',
    'B': '[exact=C]',
    'C': '[exact=C]',
  };

  JClosedWorld closedWorld = env.jClosedWorld;
  int closureCount = 0;
  Selector callSelector = new Selector.callClosure(0);
  closedWorld.classHierarchy.forEachStrictSubclassOf(
      closedWorld.commonElements.objectClass, (ClassEntity cls) {
    if (cls.library.canonicalUri.scheme != 'memory') return;

    TypeMask mask = new TypeMask.nonNullSubclass(cls, closedWorld);
    TypeMask receiverType = closedWorld.computeReceiverType(callSelector, mask);
    if (cls.isClosure) {
      // TODO(johnniwinther): Expect mask based on 'cls' when all synthesized
      // call methods are registered.
      String expected = '[empty]'; //'$mask';
      Expect.equals(expected, '${receiverType}',
          "Unexpected receiver type for $callSelector on $mask");
      closureCount++;
    } else {
      String expected = expectedMap[cls.name];
      Expect.equals(expected, '$receiverType',
          "Unexpected receiver type for $callSelector on $mask");
    }
  });

  Expect.equals(2, closureCount);
}
