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

import 'dart:mirrors';

import 'package:expect/expect.dart';

class A<R> {}

class B<S> {}

class C<T> extends B<A<T>> {
  A<T> field;
  A<T> returnType() => new A<T>();
  parameterType(A<T> param) {}
}

main() {
  ClassMirror cOfString = reflect(new C<String>()).type;
  ClassMirror aOfString = reflect(new A<String>()).type;

  VariableMirror field = cOfString.declarations[#field] as VariableMirror;
  Expect.equals(aOfString, field.type);

  MethodMirror returnType = cOfString.declarations[#returnType] as MethodMirror;
  Expect.equals(aOfString, returnType.returnType);

  MethodMirror parameterType = cOfString.declarations[#parameterType] as MethodMirror;
  Expect.equals(aOfString, parameterType.parameters.single.type);

  ClassMirror typeArgOfSuperclass = cOfString.superclass.typeArguments.single as ClassMirror;
  Expect.equals(aOfString, typeArgOfSuperclass); //# 01: ok
}
