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

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

class Foo<W, V> {
  V field;
  V get bar => field;
  set bar(V v) {}
  W m() {}
  V n() {}
  H<V> p() {}
  o(W w) {}
}

class H<T> {}

class Bar {}

class Baz {}

void testInstance() {
  ClassMirror foo = reflect((new Foo<Bar, Baz>())).type;
  ClassMirror bar = reflect(new Bar()).type;
  ClassMirror baz = reflect(new Baz()).type;
  ClassMirror hOfBaz = reflect(new H<Baz>()).type;
  VariableMirror field = foo.declarations[#field] as VariableMirror;
  MethodMirror getter = foo.declarations[#bar] as MethodMirror;
  MethodMirror setter = foo.declarations[const Symbol('bar=')] as MethodMirror;
  MethodMirror m = foo.declarations[#m] as MethodMirror;
  MethodMirror n = foo.declarations[#n] as MethodMirror;
  MethodMirror o = foo.declarations[#o] as MethodMirror;
  MethodMirror p = foo.declarations[#p] as MethodMirror;

  Expect.equals(foo, field.owner);
  Expect.equals(foo, getter.owner);
  Expect.equals(foo, setter.owner);
  Expect.equals(foo, m.owner);
  Expect.equals(foo, n.owner);
  Expect.equals(foo, o.owner);
  Expect.equals(foo, p.owner);

  Expect.equals(baz, field.type);
  Expect.equals(baz, getter.returnType);
  Expect.equals(bar, m.returnType);
  Expect.equals(baz, n.returnType);
  Expect.equals(bar, o.parameters.single.type);
  Expect.equals(hOfBaz, p.returnType);
  Expect.equals(1, p.returnType.typeArguments.length);
  Expect.equals(baz, p.returnType.typeArguments[0]);

  Expect.equals(baz, setter.parameters.single.type);
}

void testOriginalDeclaration() {
  ClassMirror foo = reflectClass(Foo);

  VariableMirror field = foo.declarations[#field] as VariableMirror;
  MethodMirror getter = foo.declarations[#bar] as MethodMirror;
  MethodMirror setter = foo.declarations[const Symbol('bar=')] as MethodMirror;
  MethodMirror m = foo.declarations[#m] as MethodMirror;
  MethodMirror n = foo.declarations[#n] as MethodMirror;
  MethodMirror o = foo.declarations[#o] as MethodMirror;
  MethodMirror p = foo.declarations[#p] as MethodMirror;
  TypeVariableMirror w = foo.typeVariables[0] as TypeVariableMirror;
  TypeVariableMirror v = foo.typeVariables[1] as TypeVariableMirror;

  Expect.equals(foo, field.owner);
  Expect.equals(foo, getter.owner);
  Expect.equals(foo, setter.owner);
  Expect.equals(foo, m.owner);
  Expect.equals(foo, n.owner);
  Expect.equals(foo, o.owner);
  Expect.equals(foo, p.owner);

  Expect.equals(v, field.type);
  Expect.equals(v, getter.returnType);
  Expect.equals(w, m.returnType);
  Expect.equals(v, n.returnType);
  Expect.equals(w, o.parameters.single.type);
  Expect.equals(1, p.returnType.typeArguments.length);
  Expect.equals(v, p.returnType.typeArguments[0]);

  Expect.equals(v, setter.parameters.single.type);
}

main() {
  testInstance();
  testOriginalDeclaration();
}
