// 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.mixin;

import 'dart:mirrors';

import 'package:expect/expect.dart';

class Super {}

class Mixin {}

class Mixin2 {}

class Mixin3 {}

class MixinApplication = Super with Mixin;

class Class extends Super with Mixin {}

class MultipleMixins extends Super with Mixin, Mixin2, Mixin3 {}

main() {
  Expect.equals(reflectClass(Mixin), reflectClass(MixinApplication).mixin);
  Expect.equals(
      reflectClass(Super), reflectClass(MixinApplication).superclass!.mixin);

  Expect.equals(reflectClass(Class), reflectClass(Class).mixin);
  Expect.equals(reflectClass(Mixin), reflectClass(Class).superclass!.mixin);
  Expect.equals(
      reflectClass(Super), reflectClass(Class).superclass!.superclass!.mixin);

  Expect.equals(
      reflectClass(MultipleMixins), reflectClass(MultipleMixins).mixin);
  Expect.equals(
      reflectClass(Mixin3), reflectClass(MultipleMixins).superclass!.mixin);
  Expect.equals(reflectClass(Mixin2),
      reflectClass(MultipleMixins).superclass!.superclass!.mixin);
  Expect.equals(reflectClass(Mixin),
      reflectClass(MultipleMixins).superclass!.superclass!.superclass!.mixin);
  Expect.equals(
      reflectClass(Super),
      reflectClass(MultipleMixins)
          .superclass!
          .superclass!
          .superclass!
          .superclass!
          .mixin);
}
