// Copyright (c) 2016, 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 Class extends Super with Mixin {}
class MultipleMixins extends Class with Mixin2 {}

main() {
  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(Mixin2),
                reflectClass(MultipleMixins).superclass.mixin);
  Expect.equals(reflectClass(Class),
                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);
}
