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

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

import 'package:expect/expect.dart';

import 'generics_helper.dart';

class Super<T, R extends T> {}

class Fixed extends Super<num, int> {}
class Generic<X, Y> extends Super<X, Y> {} //# 02: static type warning
class Malbounded extends Super<num, String> {} //# 01: static type warning

bool inCheckedMode() {
  try {
    var s = 'string';
    int i = s;
  } catch (e) {
    return true;
  }
  return false;
}

main() {
  ClassMirror superDecl = reflectClass(Super);
  ClassMirror superOfNumAndInt = reflectClass(Fixed).superclass;
  ClassMirror genericDecl = reflectClass(Generic); // //# 02: continued
  ClassMirror superOfXAndY = genericDecl.superclass; // //# 02: continued
  ClassMirror genericOfNumAndDouble = reflect(new Generic<num, double>()).type; // //# 02: continued
  ClassMirror superOfNumAndDouble = genericOfNumAndDouble.superclass; // //# 02: continued
  ClassMirror superOfNumAndString = reflectClass(Malbounded).superclass; // //# 01: continued

  try {
    ClassMirror genericOfNumAndBool = reflect(new Generic<num, bool>()).type; // //# 02: static type warning
    ClassMirror superOfNumAndBool = genericOfNumAndBool.superclass; // //# 02: continued
    Expect.isFalse(genericOfNumAndBool.isOriginalDeclaration); // //# 02: continued
    Expect.isFalse(superOfNumAndBool.isOriginalDeclaration); // //# 02: continued
    typeParameters(genericOfNumAndBool, [#X, #Y]); // //# 02: continued
    typeParameters(superOfNumAndBool, [#T, #R]); // //# 02: continued
    typeArguments(genericOfNumAndBool, [reflectClass(num), reflectClass(bool)]); // //# 02: continued
    typeArguments(superOfNumAndBool, [reflectClass(num), reflectClass(bool)]); // //# 02: continued
    Expect.isFalse(inCheckedMode()); //# 02: continued
  } on TypeError catch (e) {
    Expect.isTrue(inCheckedMode());
  }

  Expect.isTrue(superDecl.isOriginalDeclaration);
  Expect.isFalse(superOfNumAndInt.isOriginalDeclaration);
  Expect.isTrue(genericDecl.isOriginalDeclaration); // //# 02: continued
  Expect.isFalse(superOfXAndY.isOriginalDeclaration); //  //# 02: continued
  Expect.isFalse(genericOfNumAndDouble.isOriginalDeclaration); // //# 02: continued
  Expect.isFalse(superOfNumAndDouble.isOriginalDeclaration); // //# 02: continued
  Expect.isFalse(superOfNumAndString.isOriginalDeclaration); // //# 01: continued

  TypeVariableMirror tFromSuper = superDecl.typeVariables[0];
  TypeVariableMirror rFromSuper = superDecl.typeVariables[1];
  TypeVariableMirror xFromGeneric = genericDecl.typeVariables[0]; // //# 02: continued
  TypeVariableMirror yFromGeneric = genericDecl.typeVariables[1]; // //# 02: continued

  Expect.equals(reflectClass(Object), tFromSuper.upperBound);
  Expect.equals(tFromSuper, rFromSuper.upperBound);
  Expect.equals(reflectClass(Object), xFromGeneric.upperBound); // //# 02: continued
  Expect.equals(reflectClass(Object), yFromGeneric.upperBound); // //# 02: continued

  typeParameters(superDecl, [#T, #R]);
  typeParameters(superOfNumAndInt, [#T, #R]);
  typeParameters(genericDecl, [#X, #Y]); // //# 02: continued
  typeParameters(superOfXAndY, [#T, #R]); // //# 02: continued
  typeParameters(genericOfNumAndDouble, [#X, #Y]); // //# 02: continued
  typeParameters(superOfNumAndDouble, [#T, #R]); // //# 02: continued
  typeParameters(superOfNumAndString, [#T, #R]); // //# 01: continued

  typeArguments(superDecl, []);
  typeArguments(superOfNumAndInt, [reflectClass(num), reflectClass(int)]);
  typeArguments(genericDecl, []); // //# 02: continued
  typeArguments(superOfXAndY, [xFromGeneric, yFromGeneric]); // //# 02: continued
  typeArguments(genericOfNumAndDouble, [reflectClass(num), reflectClass(double)]); // //# 02: continued
  typeArguments(superOfNumAndDouble, [reflectClass(num), reflectClass(double)]); // //# 02: continued
  typeArguments(superOfNumAndString, [reflectClass(num), reflectClass(String)]); // //# 01: continued
}
