| // 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 Collection<C> {} |
| |
| class Serializable<S> {} |
| |
| class OrderedCollection<V> extends Collection<V> |
| with Serializable<OrderedCollection<V>> {} |
| |
| class AbstractOrderedCollection<W> = Collection<W> |
| with Serializable<AbstractOrderedCollection<W>>; |
| |
| class CustomOrderedCollection<Z> extends AbstractOrderedCollection<Z> {} |
| |
| class OrderedIntegerCollection extends OrderedCollection<int> {} |
| |
| class CustomOrderedIntegerCollection extends CustomOrderedCollection<int> {} |
| |
| class Serializer<R extends Serializable<R>> {} |
| |
| class CollectionSerializer extends Serializer<Collection> {} |
| |
| class OrderedCollectionSerializer extends Serializer<OrderedCollection> {} |
| |
| main() { |
| ClassMirror collectionDecl = reflectClass(Collection); |
| ClassMirror serializableDecl = reflectClass(Serializable); |
| ClassMirror orderedCollectionDecl = reflectClass(OrderedCollection); |
| ClassMirror abstractOrderedCollectionDecl = |
| reflectClass(AbstractOrderedCollection); |
| ClassMirror customOrderedCollectionDecl = |
| reflectClass(CustomOrderedCollection); |
| ClassMirror orderedIntegerCollection = reflectClass(OrderedIntegerCollection); |
| ClassMirror customOrderedIntegerCollection = |
| reflectClass(CustomOrderedIntegerCollection); |
| ClassMirror serializerDecl = reflectClass(Serializer); |
| ClassMirror collectionSerializerDecl = reflectClass(CollectionSerializer); |
| ClassMirror orderedCollectionSerializerDecl = |
| reflectClass(OrderedCollectionSerializer); |
| |
| ClassMirror orderedCollectionOfInt = orderedIntegerCollection.superclass!; |
| ClassMirror customOrderedCollectionOfInt = |
| customOrderedIntegerCollection.superclass!; |
| ClassMirror serializerOfCollection = collectionSerializerDecl.superclass!; |
| ClassMirror serializerOfOrderedCollection = |
| orderedCollectionSerializerDecl.superclass!; |
| ClassMirror collectionOfDynamic = reflect(new Collection()).type; |
| ClassMirror orderedCollectionOfDynamic = |
| reflect(new OrderedCollection()).type; |
| ClassMirror collectionWithSerializableOfOrderedCollection = |
| orderedCollectionDecl.superclass!; |
| |
| Expect.isTrue(collectionDecl.isOriginalDeclaration); |
| Expect.isTrue(serializableDecl.isOriginalDeclaration); |
| Expect.isTrue(orderedCollectionDecl.isOriginalDeclaration); |
| Expect.isTrue(abstractOrderedCollectionDecl.isOriginalDeclaration); |
| Expect.isTrue(customOrderedCollectionDecl.isOriginalDeclaration); |
| Expect.isTrue(orderedIntegerCollection.isOriginalDeclaration); |
| Expect.isTrue(customOrderedIntegerCollection.isOriginalDeclaration); |
| Expect.isTrue(serializerDecl.isOriginalDeclaration); |
| Expect.isTrue(collectionSerializerDecl.isOriginalDeclaration); |
| Expect.isTrue(orderedCollectionSerializerDecl.isOriginalDeclaration); |
| |
| Expect.isFalse(orderedCollectionOfInt.isOriginalDeclaration); |
| Expect.isFalse(customOrderedCollectionOfInt.isOriginalDeclaration); |
| Expect.isFalse(serializerOfCollection.isOriginalDeclaration); |
| Expect.isFalse(serializerOfOrderedCollection.isOriginalDeclaration); |
| Expect.isFalse(collectionOfDynamic.isOriginalDeclaration); |
| Expect.isFalse( |
| collectionWithSerializableOfOrderedCollection.isOriginalDeclaration); |
| |
| TypeVariableMirror rFromSerializer = serializerDecl.typeVariables.single; |
| ClassMirror serializableOfR = rFromSerializer.upperBound as ClassMirror; |
| Expect.isFalse(serializableOfR.isOriginalDeclaration); |
| Expect.equals(serializableDecl, serializableOfR.originalDeclaration); |
| Expect.equals(rFromSerializer, serializableOfR.typeArguments.single); |
| |
| typeParameters(collectionDecl, [#C]); |
| typeParameters(serializableDecl, [#S]); |
| typeParameters(orderedCollectionDecl, [#V]); |
| typeParameters(abstractOrderedCollectionDecl, [#W]); |
| typeParameters(customOrderedCollectionDecl, [#Z]); |
| typeParameters(orderedIntegerCollection, []); |
| typeParameters(customOrderedIntegerCollection, []); |
| typeParameters(serializerDecl, [#R]); |
| typeParameters(collectionSerializerDecl, []); |
| typeParameters(orderedCollectionSerializerDecl, []); |
| |
| typeParameters(orderedCollectionOfInt, [#V]); |
| typeParameters(customOrderedCollectionOfInt, [#Z]); |
| typeParameters(serializerOfCollection, [#R]); |
| typeParameters(serializerOfOrderedCollection, [#R]); |
| typeParameters(collectionOfDynamic, [#C]); |
| typeParameters(collectionWithSerializableOfOrderedCollection, []); |
| |
| typeArguments(collectionDecl, []); |
| typeArguments(serializableDecl, []); |
| typeArguments(orderedCollectionDecl, []); |
| typeArguments(abstractOrderedCollectionDecl, []); |
| typeArguments(customOrderedCollectionDecl, []); |
| typeArguments(orderedIntegerCollection, []); |
| typeArguments(customOrderedIntegerCollection, []); |
| typeArguments(serializerDecl, []); |
| typeArguments(collectionSerializerDecl, []); |
| typeArguments(orderedCollectionSerializerDecl, []); |
| |
| typeArguments(orderedCollectionOfInt, [reflectClass(int)]); |
| typeArguments(customOrderedCollectionOfInt, [reflectClass(int)]); |
| typeArguments(serializerOfCollection, [collectionOfDynamic]); |
| typeArguments(serializerOfOrderedCollection, [orderedCollectionOfDynamic]); |
| typeArguments(collectionWithSerializableOfOrderedCollection, []); |
| } |