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

import 'dart:mirrors';
import 'package:expect/expect.dart';

class A<T> {}

class B<T extends A> extends A implements C {
  A m(A a) => a;
  late A field;
}

class C<S, T> {}

class D extends A<int> {}

main() {
  ClassMirror aDecl = reflectClass(A);
  ClassMirror bDecl = reflectClass(B);
  ClassMirror cDecl = reflectClass(C);
  TypeMirror aInstance = reflect(new A()).type;
  TypeMirror aInstanceDynamic = reflect(new A<dynamic>()).type;
  TypeMirror dInstance = reflect(new D()).type;
  TypeMirror cInstance = reflect(new C<dynamic, dynamic>()).type;
  TypeMirror cNestedInstance = reflect(new C<C, dynamic>()).type;
  TypeMirror cTypeArgument = cNestedInstance.typeArguments.first;
  TypeMirror superA = bDecl.superclass!;
  TypeMirror superC = bDecl.superinterfaces.single;
  MethodMirror m = bDecl.declarations[#m] as MethodMirror;
  VariableMirror field = bDecl.declarations[#field] as VariableMirror;
  TypeMirror returnTypeA = m.returnType;
  TypeMirror parameterTypeA = m.parameters.first.type;
  TypeMirror fieldTypeA = field.type;
  TypeMirror upperBoundA = bDecl.typeVariables.single.upperBound;
  TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;

  Expect.isTrue(aDecl.isOriginalDeclaration);
  Expect.isTrue(reflect(dInstance).type.isOriginalDeclaration);
  Expect.isFalse(aInstance.isOriginalDeclaration);
  Expect.isFalse(aInstanceDynamic.isOriginalDeclaration);
  Expect.isFalse(superA.isOriginalDeclaration);
  Expect.isFalse(superC.isOriginalDeclaration);
  Expect.isFalse(returnTypeA.isOriginalDeclaration);
  Expect.isFalse(parameterTypeA.isOriginalDeclaration);
  Expect.isFalse(fieldTypeA.isOriginalDeclaration);
  Expect.isFalse(upperBoundA.isOriginalDeclaration);
  Expect.isFalse(cInstance.isOriginalDeclaration);
  Expect.isFalse(cNestedInstance.isOriginalDeclaration);
  Expect.isFalse(cTypeArgument.isOriginalDeclaration);

  Expect.isTrue(aDecl.typeArguments.isEmpty);
  Expect.isTrue(dInstance.typeArguments.isEmpty);
  Expect.equals(dynamicMirror, aInstance.typeArguments.single);
  Expect.equals(dynamicMirror, aInstanceDynamic.typeArguments.single);
  Expect.equals(dynamicMirror, superA.typeArguments.single);
  Expect.equals(dynamicMirror, superC.typeArguments.first);
  Expect.equals(dynamicMirror, superC.typeArguments.last);
  Expect.equals(dynamicMirror, returnTypeA.typeArguments.single);
  Expect.equals(dynamicMirror, parameterTypeA.typeArguments.single);
  Expect.equals(dynamicMirror, fieldTypeA.typeArguments.single);
  Expect.equals(dynamicMirror, upperBoundA.typeArguments.single);
  Expect.equals(dynamicMirror, cInstance.typeArguments.first);
  Expect.equals(dynamicMirror, cInstance.typeArguments.last);
  Expect.equals(dynamicMirror, cNestedInstance.typeArguments.last);
  Expect.equals(dynamicMirror, cTypeArgument.typeArguments.first);
  Expect.equals(dynamicMirror, cTypeArgument.typeArguments.last);
}
