// 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_mixin;

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'generics_helper.dart';

class Super<S> {}

class Mixin<M> {}

class Nixim<N> {}

class NonGenericMixinApplication1 = Super with Mixin;
class NonGenericMixinApplication2 = Super<num> with Mixin<String>;

class GenericMixinApplication1<MA> = Super<MA> with Mixin<MA>;
class GenericMixinApplication2<MA> = Super<num> with Mixin<String>;

class NonGenericClass1 extends Super with Mixin {}

class NonGenericClass2 extends Super<num> with Mixin<String> {}

class GenericClass1<C> extends Super<C> with Mixin<C> {}

class GenericClass2<C> extends Super<num> with Mixin<String> {}

class GenericMultipleMixins<A, B, C> extends Super<A> with Mixin<B>, Nixim<C> {}

main() {
  TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;

  typeParameters(reflectClass(NonGenericMixinApplication1).mixin, [#M]);
  typeParameters(reflectClass(NonGenericMixinApplication2).mixin, [#M]);
  typeParameters(reflectClass(GenericMixinApplication1).mixin, [#M]);
  typeParameters(reflectClass(GenericMixinApplication2).mixin, [#M]);
  typeParameters(reflectClass(NonGenericClass1).mixin, []);
  typeParameters(reflectClass(NonGenericClass2).mixin, []);
  typeParameters(reflectClass(GenericClass1).mixin, [#C]);
  typeParameters(reflectClass(GenericClass2).mixin, [#C]);
  typeParameters(reflectClass(NonGenericClass1).superclass!.mixin, [#M]);
  typeParameters(reflectClass(NonGenericClass2).superclass!.mixin, [#M]);
  typeParameters(reflectClass(GenericClass1).superclass!.mixin, [#M]);
  typeParameters(reflectClass(GenericClass2).superclass!.mixin, [#M]);
  typeParameters(reflectClass(GenericMultipleMixins).mixin, [#A, #B, #C]);
  typeParameters(reflectClass(GenericMultipleMixins).superclass!.mixin, [#N]);
  typeParameters(
      reflectClass(GenericMultipleMixins).superclass!.superclass!.mixin, [#M]);
  typeParameters(
      reflectClass(GenericMultipleMixins)
          .superclass!
          .superclass!
          .superclass!
          .mixin,
      [#S]);

  typeArguments(
      reflectClass(NonGenericMixinApplication1).mixin, [dynamicMirror]);
  typeArguments(
      reflectClass(NonGenericMixinApplication2).mixin, [reflectClass(String)]);
  typeArguments(reflectClass(GenericMixinApplication1).mixin,
      [reflectClass(GenericMixinApplication1).typeVariables.single]);
  typeArguments(
      reflectClass(GenericMixinApplication2).mixin, [reflectClass(String)]);
  typeArguments(reflectClass(NonGenericClass1).mixin, []);
  typeArguments(reflectClass(NonGenericClass2).mixin, []);
  typeArguments(reflectClass(GenericClass1).mixin, []);
  typeArguments(reflectClass(GenericClass2).mixin, []);
  typeArguments(
      reflectClass(NonGenericClass1).superclass!.mixin, [dynamicMirror]);
  typeArguments(
      reflectClass(NonGenericClass2).superclass!.mixin, [reflectClass(String)]);
  typeArguments(reflectClass(GenericClass1).superclass!.mixin,
      [reflectClass(GenericClass1).typeVariables.single]);
  typeArguments(
      reflectClass(GenericClass2).superclass!.mixin, [reflectClass(String)]);
  typeArguments(reflectClass(GenericMultipleMixins).mixin, []);
  typeArguments(reflectClass(GenericMultipleMixins).superclass!.mixin,
      [reflectClass(GenericMultipleMixins).typeVariables[2]]);
  typeArguments(
      reflectClass(GenericMultipleMixins).superclass!.superclass!.mixin,
      [reflectClass(GenericMultipleMixins).typeVariables[1]]);
  typeArguments(
      reflectClass(GenericMultipleMixins)
          .superclass!
          .superclass!
          .superclass!
          .mixin,
      [reflectClass(GenericMultipleMixins).typeVariables[0]]);

  typeParameters(reflect(new NonGenericMixinApplication1()).type.mixin, [#M]);
  typeParameters(reflect(new NonGenericMixinApplication2()).type.mixin, [#M]);
  typeParameters(
      reflect(new GenericMixinApplication1<bool>()).type.mixin, [#M]);
  typeParameters(
      reflect(new GenericMixinApplication2<bool>()).type.mixin, [#M]);
  typeParameters(reflect(new NonGenericClass1()).type.mixin, []);
  typeParameters(reflect(new NonGenericClass2()).type.mixin, []);
  typeParameters(reflect(new GenericClass1<bool>()).type.mixin, [#C]);
  typeParameters(reflect(new GenericClass2<bool>()).type.mixin, [#C]);
  typeParameters(reflect(new NonGenericClass1()).type.superclass!.mixin, [#M]);
  typeParameters(reflect(new NonGenericClass2()).type.superclass!.mixin, [#M]);
  typeParameters(
      reflect(new GenericClass1<bool>()).type.superclass!.mixin, [#M]);
  typeParameters(
      reflect(new GenericClass2<bool>()).type.superclass!.mixin, [#M]);
  typeParameters(
      reflect(new GenericMultipleMixins<bool, String, int>()).type.mixin,
      [#A, #B, #C]);
  typeParameters(
      reflect(new GenericMultipleMixins<bool, String, int>())
          .type
          .superclass!
          .mixin,
      [#N]);
  typeParameters(
      reflect(new GenericMultipleMixins<bool, String, int>())
          .type
          .superclass!
          .superclass!
          .mixin,
      [#M]);
  typeParameters(
      reflect(new GenericMultipleMixins<bool, String, int>())
          .type
          .superclass!
          .superclass!
          .superclass!
          .mixin,
      [#S]);

  typeArguments(
      reflect(new NonGenericMixinApplication1()).type.mixin, [dynamicMirror]);
  typeArguments(reflect(new NonGenericMixinApplication2()).type.mixin,
      [reflectClass(String)]);
  typeArguments(reflect(new GenericMixinApplication1<bool>()).type.mixin,
      [reflectClass(bool)]);
  typeArguments(reflect(new GenericMixinApplication2<bool>()).type.mixin,
      [reflectClass(String)]);
  typeArguments(reflect(new NonGenericClass1()).type.mixin, []);
  typeArguments(reflect(new NonGenericClass2()).type.mixin, []);
  typeArguments(
      reflect(new GenericClass1<bool>()).type.mixin, [reflectClass(bool)]);
  typeArguments(
      reflect(new GenericClass2<bool>()).type.mixin, [reflectClass(bool)]);
  typeArguments(
      reflect(new NonGenericClass1()).type.superclass!.mixin, [dynamicMirror]);
  typeArguments(reflect(new NonGenericClass2()).type.superclass!.mixin,
      [reflectClass(String)]);
  typeArguments(reflect(new GenericClass1<bool>()).type.superclass!.mixin,
      [reflectClass(bool)]);
  typeArguments(reflect(new GenericClass2<bool>()).type.superclass!.mixin,
      [reflectClass(String)]);
  typeArguments(
      reflect(new GenericMultipleMixins<bool, String, int>()).type.mixin,
      [reflectClass(bool), reflectClass(String), reflectClass(int)]);
  typeArguments(
      reflect(new GenericMultipleMixins<bool, String, int>())
          .type
          .superclass!
          .mixin,
      [reflectClass(int)]);
  typeArguments(
      reflect(new GenericMultipleMixins<bool, String, int>())
          .type
          .superclass!
          .superclass!
          .mixin,
      [reflectClass(String)]);
  typeArguments(
      reflect(new GenericMultipleMixins<bool, String, int>())
          .type
          .superclass!
          .superclass!
          .superclass!
          .mixin,
      [reflectClass(bool)]);
}
