| // 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_f_bounded; | 
 |  | 
 | import 'dart:mirrors'; | 
 |  | 
 | import 'package:expect/expect.dart'; | 
 |  | 
 | import 'generics_helper.dart'; | 
 |  | 
 | class Magnitude<T> {} | 
 |  | 
 | class Real extends Magnitude<Real> {} | 
 |  | 
 | class Sorter<R extends Magnitude<R>> {} | 
 |  | 
 | class RealSorter extends Sorter<Real> {} | 
 |  | 
 | main() { | 
 |   ClassMirror magnitudeDecl = reflectClass(Magnitude); | 
 |   ClassMirror realDecl = reflectClass(Real); | 
 |   ClassMirror sorterDecl = reflectClass(Sorter); | 
 |   ClassMirror realSorterDecl = reflectClass(RealSorter); | 
 |   ClassMirror magnitudeOfReal = realDecl.superclass!; | 
 |   ClassMirror sorterOfReal = realSorterDecl.superclass!; | 
 |  | 
 |   Expect.isTrue(magnitudeDecl.isOriginalDeclaration); | 
 |   Expect.isTrue(realDecl.isOriginalDeclaration); | 
 |   Expect.isTrue(sorterDecl.isOriginalDeclaration); | 
 |   Expect.isTrue(realSorterDecl.isOriginalDeclaration); | 
 |   Expect.isFalse(magnitudeOfReal.isOriginalDeclaration); | 
 |   Expect.isFalse(sorterOfReal.isOriginalDeclaration); | 
 |  | 
 |   TypeVariableMirror tFromMagnitude = magnitudeDecl.typeVariables.single; | 
 |   TypeVariableMirror rFromSorter = sorterDecl.typeVariables.single; | 
 |  | 
 |   Expect.equals(reflectClass(Object), tFromMagnitude.upperBound); | 
 |  | 
 |   ClassMirror magnitudeOfR = rFromSorter.upperBound as ClassMirror; | 
 |   Expect.isFalse(magnitudeOfR.isOriginalDeclaration); | 
 |   Expect.equals(magnitudeDecl, magnitudeOfR.originalDeclaration); | 
 |   Expect.equals(rFromSorter, magnitudeOfR.typeArguments.single); | 
 |  | 
 |   typeParameters(realDecl, []); | 
 |   typeParameters(realSorterDecl, []); | 
 |  | 
 |   typeArguments(magnitudeDecl, []); | 
 |   typeArguments(realDecl, []); | 
 |   typeArguments(sorterDecl, []); | 
 |   typeArguments(realSorterDecl, []); | 
 |   typeArguments(magnitudeOfReal, [realDecl]); //# 01: ok | 
 |   typeArguments(sorterOfReal, [realDecl]); //# 01: ok | 
 |   typeArguments(magnitudeOfR, [rFromSorter]); | 
 | } |