// 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.

library subtype_test;

import 'package:expect/expect.dart';
import 'type_test_helper.dart';
import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
       show Element, ClassElement;

void main() {
  test();
}

void test() {
  var env = new TypeEnvironment(r"""
      class A<T> {
        T foo;
      }
      class B<S> extends A<A<S>> {
        S bar;
      }
      class C<U> extends B<String> with D<B<U>> {
        U baz;
      }
      class D<V> {
        V boz;
      }
      """);

  void expect(DartType receiverType, String memberName, DartType expectedType) {
    Member member = receiverType.lookupMember(env.sourceString(memberName));
    Expect.isNotNull(member);
    DartType memberType = member.computeType(env.compiler);
    Expect.equals(expectedType, memberType,
        'Wrong member type for $receiverType.$memberName.');
  }

  DartType int_ = env['int'];
  DartType String_ = env['String'];

  ClassElement A = env.getElement('A');
  DartType T = A.typeVariables.head;
  DartType A_T = A.thisType;
  expect(A_T, 'foo', T);

  DartType A_int = instantiate(A, [int_]);
  expect(A_int, 'foo', int_);

  ClassElement B = env.getElement('B');
  DartType S = B.typeVariables.head;
  DartType B_S = B.thisType;
  expect(B_S, 'foo', instantiate(A, [S]));
  expect(B_S, 'bar', S);

  DartType B_int = instantiate(B, [int_]);
  expect(B_int, 'foo', A_int);
  expect(B_int, 'bar', int_);

  ClassElement C = env.getElement('C');
  DartType U = C.typeVariables.head;
  DartType C_U = C.thisType;
  expect(C_U, 'foo', instantiate(A, [String_]));
  expect(C_U, 'bar', String_);
  expect(C_U, 'baz', U);
  expect(C_U, 'boz', instantiate(B, [U]));

  DartType C_int = instantiate(C, [int_]);
  expect(C_int, 'foo', instantiate(A, [String_]));
  expect(C_int, 'bar', String_);
  expect(C_int, 'baz', int_);
  expect(C_int, 'boz', instantiate(B, [int_]));
}

