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

// @dart = 2.9

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);
}
