// 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 test.new_instance_with_type_arguments_test;

@MirrorsUsed(targets: "test.new_instance_with_type_arguments_test")
import 'dart:mirrors';

import 'package:expect/expect.dart';

class A<T> {
  Type get t => T;
}

class B extends A<int> {}

class C<S> extends A<num> {
  Type get s => S;
}

main() {
  ClassMirror cmA = reflectClass(A);
  ClassMirror cmB = reflectClass(B);
  ClassMirror cmC = reflectClass(C);

  var a_int = new A<int>();
  var a_dynamic = new A();
  var b = new B();
  var c_string = new C<String>();
  var c_dynamic = new C();

  Expect.equals(int, a_int.t);
  Expect.equals(dynamic, a_dynamic.t);
  Expect.equals(int, b.t);
  Expect.equals(num, c_string.t);
  Expect.equals(num, c_dynamic.t);

  Expect.equals(String, c_string.s);
  Expect.equals(dynamic, c_dynamic.s);

  var reflective_a_int =
      cmB.superclass.newInstance(const Symbol(''), []).reflectee;
  var reflective_a_dynamic = cmA.newInstance(const Symbol(''), []).reflectee;
  var reflective_b = cmB.newInstance(const Symbol(''), []).reflectee;
  var reflective_c_dynamic = cmC.newInstance(const Symbol(''), []).reflectee;

  Expect.equals(int, reflective_a_int.t);
  Expect.equals(dynamic, reflective_a_dynamic.t);
  Expect.equals(int, reflective_b.t);
  Expect.equals(num, c_string.t);
  Expect.equals(num, reflective_c_dynamic.t);

  Expect.equals(String, c_string.s);
  Expect.equals(dynamic, reflective_c_dynamic.s);

  Expect.equals(a_int.runtimeType, reflective_a_int.runtimeType);
  Expect.equals(a_dynamic.runtimeType, reflective_a_dynamic.runtimeType);
  Expect.equals(b.runtimeType, reflective_b.runtimeType);
  Expect.equals(c_dynamic.runtimeType, reflective_c_dynamic.runtimeType);
}
