// 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, []);
}
