// 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> {}

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

typedef GenericMixinApplication1<MA> = Super<MA> with Mixin<MA>;
typedef 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, []);
}
