library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Superclass extends core::Object {
  synthetic constructor •() → self::Superclass
    : super core::Object::•()
    ;
  method method1(core::num argument1, core::num argument2) → core::String
    return "Superclass";
  method method2(core::num argument1, core::num argument2) → core::String
    return "Superclass";
  method method3(core::num argument1, covariant-by-declaration core::int argument2) → core::String
    return "Superclass";
  method method4(core::num argument1, covariant-by-declaration core::num argument2) → core::String
    return "Superclass";
}
class Mixin extends core::Object {
  synthetic constructor •() → self::Mixin
    : super core::Object::•()
    ;
  method method1(core::num argument1, core::num argument2) → core::String
    return "Mixin";
  method method2(covariant-by-declaration core::int argument1, core::num argument2) → core::String
    return "Mixin";
  method method3(core::num argument1, core::num argument2) → core::String
    return "Mixin";
  method method4(covariant-by-declaration core::int argument1, core::int argument2) → core::String
    return "Mixin";
}
abstract class _Class&Superclass&Mixin extends self::Superclass implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_Class&Superclass&Mixin
    : super self::Superclass::•()
    ;
  method method1(core::num argument1, core::num argument2) → core::String
    return "Mixin";
  method method2(covariant-by-declaration core::int argument1, core::num argument2) → core::String
    return "Mixin";
  method method3(core::num argument1, covariant-by-declaration core::num argument2) → core::String
    return "Mixin";
  method method4(covariant-by-declaration core::int argument1, covariant-by-declaration core::int argument2) → core::String
    return "Mixin";
}
class Class extends self::_Class&Superclass&Mixin {
  synthetic constructor •() → self::Class
    : super self::_Class&Superclass&Mixin::•()
    ;
}
static method main() → dynamic {
  self::Class c = new self::Class::•();
  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
  self::Superclass s = c;
  self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
  self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
  self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1){(core::num, core::int) → core::String});
  self::throws(() → void => s.{self::Superclass::method4}(0.5, 1){(core::num, core::num) → core::String});
  self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5){(core::num, core::num) → core::String});
  self::Mixin m = c;
  self::expect("Mixin", m.{self::Mixin::method1}(0, 1){(core::num, core::num) → core::String});
  self::expect("Mixin", m.{self::Mixin::method2}(0, 1){(core::int, core::num) → core::String});
  self::expect("Mixin", m.{self::Mixin::method3}(0, 1){(core::num, core::num) → core::String});
  self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
}
static method expect(dynamic expected, dynamic actual) → void {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → void {
  try {
    f(){() → void};
  }
  on core::Object catch(final core::Object _) {
    return;
  }
  throw "Expected exception";
}
