blob: ccde8aef2f37c4c7d87e01559171ebe67917983e [file] [log] [blame]
// 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
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;
Expect.isFalse(magnitudeOfR.isOriginalDeclaration);
Expect.equals(magnitudeDecl, magnitudeOfR.originalDeclaration);
Expect.equals(rFromSorter, magnitudeOfR.typeArguments.single);
// Names of type variables are not preserved after type canonicalization
// and are therefore not compared to expected names.
typeParameters(realDecl, []);
typeParameters(realSorterDecl, []);
// Names of type variables are not preserved after type canonicalization
// and are therefore not compared to expected names.
typeArguments(magnitudeDecl, []);
typeArguments(realDecl, []);
typeArguments(sorterDecl, []);
typeArguments(realSorterDecl, []);
typeArguments(magnitudeOfReal, [realDecl]); //# 01: ok
typeArguments(sorterOfReal, [realDecl]); //# 01: ok
typeArguments(magnitudeOfR, [rFromSorter]);
}