// 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/types/types.dart';
import 'package:compiler/src/universe/selector.dart';
import 'package:compiler/src/world.dart';
import 'package:expect/expect.dart';
import 'type_test_helper.dart';

main() {
  asyncTest(() async {
    print('--test from ast---------------------------------------------------');
    await runTest(useOldFrontend: true);
    print('--test from kernel------------------------------------------------');
    await runTest(useOldFrontend: false);
  });
}

Future runTest({bool useOldFrontend}) async {
  var env = await TypeEnvironment.create("""
    class A {
      call() {}
    }
    class B {
    }
    class C extends B {
      call() {}
    }
    """, mainSource: """
    main() {
      (new A())();
      new B();
      (new C())();
      localFunction() {}
      () {};
    }
    """, useOldFrontend: useOldFrontend, testBackendWorld: true);

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

  ClosedWorld closedWorld = env.closedWorld;
  int closureCount = 0;
  Selector callSelector = new Selector.callClosure(0);
  closedWorld.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);
}
