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

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'generics_test.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;

  // Declarations.
  typeParameters(reflectClass(NonGenericMixinApplication1), []);
  typeParameters(reflectClass(NonGenericMixinApplication2), []);
  typeParameters(reflectClass(GenericMixinApplication1), [#MA]);
  typeParameters(reflectClass(GenericMixinApplication2), [#MA]);
  typeParameters(reflectClass(NonGenericClass1), []);
  typeParameters(reflectClass(NonGenericClass2), []);
  typeParameters(reflectClass(GenericClass1), [#C]);
  typeParameters(reflectClass(GenericClass2), [#C]);
  typeParameters(reflectClass(GenericMultipleMixins), [#A, #B, #C]);
  // Anonymous mixin applications have no type parameters or type arguments.
  typeParameters(reflectClass(NonGenericClass1).superclass, []);
  typeParameters(reflectClass(NonGenericClass2).superclass, []);
  typeParameters(reflectClass(GenericClass1).superclass, []);
  typeParameters(reflectClass(GenericClass2).superclass, []);

  typeArguments(reflectClass(NonGenericMixinApplication1), []);
  typeArguments(reflectClass(NonGenericMixinApplication2), []);
  typeArguments(reflectClass(GenericMixinApplication1), []);
  typeArguments(reflectClass(GenericMixinApplication2), []);
  typeArguments(reflectClass(NonGenericClass1), []);
  typeArguments(reflectClass(NonGenericClass2), []);
  typeArguments(reflectClass(GenericClass1), []);
  typeArguments(reflectClass(GenericClass2), []);
  typeArguments(reflectClass(GenericMultipleMixins), []);
  // Anonymous mixin applications have no type parameters or type arguments.
  typeArguments(reflectClass(NonGenericClass1).superclass.originalDeclaration, []);
  typeArguments(reflectClass(NonGenericClass2).superclass.originalDeclaration, []);
  typeArguments(reflectClass(GenericClass1).superclass.originalDeclaration, []);
  typeArguments(reflectClass(GenericClass2).superclass.originalDeclaration, []);


  // Instantiations.
  typeParameters(reflect(new NonGenericMixinApplication1()).type, []);
  typeParameters(reflect(new NonGenericMixinApplication2()).type, []);
  typeParameters(reflect(new GenericMixinApplication1<bool>()).type, [#MA]);
  typeParameters(reflect(new GenericMixinApplication2<bool>()).type, [#MA]);
  typeParameters(reflect(new NonGenericClass1()).type, []);
  typeParameters(reflect(new NonGenericClass2()).type, []);
  typeParameters(reflect(new GenericClass1<bool>()).type, [#C]);
  typeParameters(reflect(new GenericClass2<bool>()).type, [#C]);
  typeParameters(reflect(new GenericMultipleMixins<bool, String, int>()).type, [#A, #B, #C]);
  // Anonymous mixin applications have no type parameters or type arguments.
  typeParameters(reflect(new NonGenericClass1()).type.superclass, []);
  typeParameters(reflect(new NonGenericClass2()).type.superclass, []);
  typeParameters(reflect(new GenericClass1<bool>()).type.superclass, []);
  typeParameters(reflect(new GenericClass2<bool>()).type.superclass, []);

  typeArguments(reflect(new NonGenericMixinApplication1()).type, []);
  typeArguments(reflect(new NonGenericMixinApplication2()).type, []);
  typeArguments(reflect(new GenericMixinApplication1<bool>()).type, [reflectClass(bool)]);
  typeArguments(reflect(new GenericMixinApplication2<bool>()).type, [reflectClass(bool)]);
  typeArguments(reflect(new NonGenericClass1()).type, []);
  typeArguments(reflect(new NonGenericClass2()).type, []);
  typeArguments(reflect(new GenericClass1<bool>()).type, [reflectClass(bool)]);
  typeArguments(reflect(new GenericClass2<bool>()).type, [reflectClass(bool)]);
  typeArguments(reflect(new GenericMultipleMixins<bool, String, int>()).type, [reflectClass(bool), reflectClass(String), reflectClass(int)]);
  // Anonymous mixin applications have no type parameters or type arguments.
  typeArguments(reflect(new NonGenericClass1()).type.superclass, []);
  typeArguments(reflect(new NonGenericClass2()).type.superclass, []);
  typeArguments(reflect(new GenericClass1<bool>()).type.superclass, []);
  typeArguments(reflect(new GenericClass2<bool>()).type.superclass, []);
}
