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

// @dart = 2.9

library test.type_argument_is_type_variable;

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'generics_helper.dart';

class SuperSuper<SS> {}

class Super<S> extends SuperSuper<S> {}

class Generic<G> extends Super<G> {}

main() {
  // Declarations.
  ClassMirror generic = reflectClass(Generic);
  ClassMirror superOfGeneric = generic.superclass;
  ClassMirror superOfSuperOfGeneric = superOfGeneric.superclass;

  TypeVariableMirror gFromGeneric = generic.typeVariables.single;
  TypeVariableMirror sFromSuper = superOfGeneric.typeVariables.single;
  TypeVariableMirror ssFromSuperSuper =
      superOfSuperOfGeneric.typeVariables.single;

  Expect.equals(#G, gFromGeneric.simpleName);
  Expect.equals(#S, sFromSuper.simpleName);
  Expect.equals(#SS, ssFromSuperSuper.simpleName);

  typeParameters(generic, [#G]);
  typeParameters(superOfGeneric, [#S]);
  typeParameters(superOfSuperOfGeneric, [#SS]);

  typeArguments(generic, []);
  typeArguments(superOfGeneric, [gFromGeneric]);
  typeArguments(superOfSuperOfGeneric, [gFromGeneric]);

  // Instantiations.
  ClassMirror genericWithInt = reflect(new Generic<int>()).type;
  ClassMirror superOfGenericWithInt = genericWithInt.superclass;
  ClassMirror superOfSuperOfGenericWithInt = superOfGenericWithInt.superclass;

  typeParameters(genericWithInt, [#G]);
  typeParameters(superOfGenericWithInt, [#S]);
  typeParameters(superOfSuperOfGenericWithInt, [#SS]);

  typeArguments(genericWithInt, [reflectClass(int)]);
  typeArguments(superOfGenericWithInt, [reflectClass(int)]);
  typeArguments(superOfSuperOfGenericWithInt, [reflectClass(int)]);
}
